Ubuntu Weekly Recipe

第755回UbuntuにおけるMOTDの仕組みのすべて

Ubuntuを含むLinux/Unix系のサーバーには、⁠ログインした時にメッセージを表示する」仕組みであるMOTD(Message Of The Day)が存在します。本来はメンテナンスの予定日など、システム管理者からログインしたユーザーに伝えるべき情報を伝えるための仕組みです。

しかしながら常に何か伝えたいことがあるわけではなく、普段どのような情報を表示するかは、システムの設定に依存します。たとえばUbuntuの場合、何も設定しなければシステム情報を表示します。今回はUbuntuのやたらと情報過多なMOTDを整理する方法を紹介しましょう。

MOTDとISSUE

冒頭で述べたように、MOTDはユーザーがログインしたときにメッセージを表示する仕組みです。そこで何を表示するかはシステム管理者のセンスが問われます。一番シンプルなのは「急ぎで伝えることがないなら、何も表示しない」ことです。メッセージを表示するということはネットワークにパケットを流すということです。つまり「ギガが減る」わけです。普段は何も表示しないことで、いざ表示すべきメッセージが出てきた時に、より強い注意を惹けるという利点もあります。

「名言・格言を表示する」ケースもあります。この手のものはfortuneコマンドが有名ですね。第368回のエイプリルフールでは、fortuneコマンドで生成した格言を牛やステゴサウルスに喋らせる例を紹介しています。これをそのままmotdとして表示するという手もあります。今なら、ChatGPTに何か語らせるのも面白いかもしれません。

ちなみにMOTDとは別のサーバーへのログイン時にユーザーに通知する仕組みとして/etc/issueが存在します。これはログイン前のログインプロンプトが表示されるタイミングで出力されるメッセージです。/etc/issueはコンソールログイン時、/etc/issue.netはtelnetなどネットワーク経由のログイン時に使われます。また、ログインプロンプトがないSSHの場合は、/etc/sshd_configBannerで任意のテキストファイルの内容を出力することが可能です。

さて、UbuntuのMOTDはどうでしょうか。サーバー版のUbuntuをインストールした場合、特に何も設定しなければログイン時に次のようなメッセージが表示されます。

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-67-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Mar 19 07:49:43 AM UTC 2023

  System load:             0.16015625
  Usage of /:              14.3% of 48.91GB
  Memory usage:            8%
  Swap usage:              0%
  Processes:               125
  Users logged in:         0
  IPv4 address for enp5s0: 10.56.73.122
  IPv6 address for enp5s0: fd42:b1c7:99a6:67fb:216:3eff:fefc:a5a0

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

1 device has a firmware upgrade available.
Run `fwupdmgr get-upgrades` for more information.


 * Introducing Expanded Security Maintenance for Applications.
   Receive updates to over 25,000 software packages with your
   Ubuntu Pro subscription. Free for personal use.

     https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

2 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status



1 device has a firmware upgrade available.
Run `fwupdmgr get-upgrades` for more information.

いくらなんでも量が多すぎですね。これだけで1500バイトぐらいあります。昔はロードアベレージやストレージの使用量等だけだった記憶があるのですが、いつの間にかあれやこれやと情報が増えていき、最近はいわゆる「Canonicalの広告」と言われるものまで追加されるようになりました。ここはひとつ、これらのメッセージが生成される仕組みを確認し、表示内容の「断捨離」をしてみましょう。

UbuntuにおけるMOTDの仕組み

UbuntuのMOTDの仕組みは特殊です。PAMに独自のパッチを当てたりして拡張しています。というわけで順番に見ていきましょう。

PAMを用いたMOTDの更新と表示

まず最初に、Ubuntuはそもそも/etc/motdを使っていません。上記のメッセージは/run/motd.dynamicの内容です。これは/etc/pam.d/login(コンソールログイン時)/etc/pam.d/sshd(SSHログイン時)で次のように設定しています。

# Print the message of the day upon successful login.
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate

pam_motd.soが2行存在しますね。1行目は/run/motd.dynamicを更新し、それを表示する」行です(これは「update-motd」と呼ばれています⁠⁠。それに対して2行目は/run/motd.dynamicを更新せずに、/etc/motdを表示する」行となっています。つまりUbuntu固有の表示を消したかったら、ここをコメントアウトするだけで(先頭に「#」を追加するだけで)完了です。たとえば次のように設定しみます。

$ grep pam_motd /etc/pam.d/sshd
#session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate

$ cat /etc/motd
cat: /etc/motd: No such file or directory

この状態でサーバーにSSHログインしてみましょう。

$ ssh サーバーのアドレス

1 device has a firmware upgrade available.
Run `fwupdmgr get-upgrades` for more information.

Last login: Sun Mar 19 09:38:04 2023 from 10.56.73.1

どうやらまだ、何か表示されてしまうようです。実はpam_motd.soは、/etc/motdだけでなく次のような順番でファイルを検索・表示します。

  • /etc/motd/run/motd/usr/lib/motdのうち最初に見つかったファイル
  • /etc/motd.d//run/motd.d//usr/lib/motd.d/以下のファイル。ただし同じファイル名なら先に見つかったほうだけ使われる

たとえば上記の「fwupdmgr」は、次のファイルの中身が表示されているのです。

$ cat /run/motd.d/85-fwupd

1 device has a firmware upgrade available.
Run `fwupdmgr get-upgrades` for more information.

このfwupdmgrコマンドを提供しているfwupdはBIOSなどファームウェアの更新・管理を行う仕組みです。対応しているハードウェアであればfwupdの仕組みで更新できますし、対応していなくてもセキュアブート関連のUEFI変数の更新などで、上記のメッセージが表示されることもあります。

このファイルは毎日2回起動するfwupd-refresh.timerで実行される、fwupdmgrコマンドにより更新されています。よって単にMOTDメッセージを表示したくないだけであれば、/etc/pam.d以下にあるpam_motd.soすべてコメントアウトすれば大丈夫です。

update-motdによるMOTDの生成

再びUbuntuのMOTD自動生成機能の話に戻ります。これはupdate-motdと呼ばれる機能で、単にログイン時に/etc/update-motd.d以下のスクリプトを順番に実行しているだけです。具体的には次のスクリプトが存在します。

  • 00-header「Welcome to ...」の1行を表示
  • 10-help-text:各種ドキュメントのリンクを表示
  • 50-landscape-sysinfo:ロードアベレージ等のシステム情報の表示
  • 50-motd-newshttps://motd.ubuntu.comの内容を表示
  • 85-fwupd/run/motd.d/85-fwupdに記録されているfwupdmgrの結果を表示
  • 88-esm-announce/var/lib/ubuntu-advantage/messages/motd-esm-announceの内容を表示
  • 90-updates-available/var/lib/update-notifier/updates-availableの内容、主に更新可能なパッケージの数に加えて、Ubuntu Proが提供するESMの宣伝を表示
  • 91-contract-ua-esm-status/var/lib/ubuntu-advantage/messages/以下の、主にUbuntu Proの状態を表示
  • 91-release-upgrade:rootアカウントなら/usr/lib/ubuntu-release-upgrader/release-upgrade-motdを実行して、より新しいUbuntuのバージョンを表示
  • 92-unattended-upgrades/usr/share/unattended-upgrades/update-motd-unattended-upgradesを実行して、自動アップグレードされなかったパッケージ情報等を表示
  • 95-hwe-eol/usr/lib/update-notifier/update-motd-hwe-eolを実行して、HWEのEOL状態の表示
  • 97-overlayroot:ルートファイルシステムがoverlayrootならその情報を表示[1]
  • 98-fsck-at-reboot/usr/lib/update-notifier/update-motd-fsck-at-rebootを実行して、次回再起動時にfsckが行われるかを表示
  • 98-reboot-required/usr/lib/update-notifier/update-motd-reboot-requiredを実行して、更新を適用するために再起動が必要かどうかを表示

このように列挙すると、ログイン時に毎回表示すべきかどうか疑問に感じるメッセージや、管理者でないユーザーにとってはあまり関係のないメッセージも多く存在します。全部表示しない場合は、pam_motd.soをコメントアウトするだけで良いのですが、上記から取捨選択することも可能です。詳細な手順は後ほど解説します。

systemdのサービスファイルによるMOTDの生成

update-motdは原則として「ログイン時に情報を収集しそれを表示」します。しかしながら一部のメッセージについては、あらかじめバックグラウンドで実行され、生成されていたデータを流用しているのです。いくつか例をあげましょう。

  • aptによるリポジトリ情報の更新や自動アップグレード機能の結果
  • 日曜日の午前6時に実行されるupdate-notifier-motd.timer経由での/usr/lib/ubuntu-release-upgrader/release-upgrade-motdの実行により、より新しいUbuntuのバージョンを/var/lib/ubuntu-release-upgrader/release-upgrade-availableに保存
  • 1日2回実行されるmotd-news.timer経由での/etc/update-motd.d/50-motd-newの実行により、https://motd.ubuntu.comの内容を/var/cache/motd-newsに保存

ひとつめは次のようなメッセージが表示されます。またUbuntuのバージョンや設定によってはこの前後にUbuntu ProやESMの宣伝項目が含まれます。

2 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

ふたつめは、次のリリースが出たときのみ表示される項目です。具体的には次のようなメッセージが表示されます。通常リリースなら次のリリースが出たあとぐらいから、LTSなら次のLTSの最初のポイントリリースが出たあとぐらいに表示されるようになります。

New release '22.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

最後は、実際にURLにアクセスして表示されるメッセージをそのまま保存しているだけです。これもUbuntuやCanonicalの宣伝がメインとなります。

各種MOTDの抑制方法

ここまでで、何がどのように出力されているかを確認したので、ここからはそれぞれ個別のメッセージを抑制する方法を紹介しましょう。

fwupdmgrによるMOTD生成の無効化

最初に、update-motdではない、fwupdmgrによるメッセージを無効化する方法について説明します。fwdupdmgrは/etc/fwupd/daemon.conf等でその挙動を変更できます。具体的には次の部分でMOTD生成のオン・オフを切り替えられるのです。

# Update the message of the day (MOTD) on device and metadata changes
UpdateMotd=true

上記の行をUpdateMotd=falseにし、/run/motd.d/85-fwupdを削除すれば、次回ログイン時から表示が行われなくなります。

また、fwupdmgr自体の定期実行をやめるという方法もあります。その場合は、systemctlを使ってタイマーを無効化するだけです。

$ sudo systemctl disable fwupd-refresh.timer
$ systemctl list-timers | grep fwupd
  => 何も表示されないことを確認する

この場合も生成済みの/run/motd.d/85-fwupdは削除しておくと良いでしょう。

update-motdの汎用的な無効化方法

update-motdの全体的な無効化は、pam_motd.soをコメントアウトすることです。ただしこの方法だと、/etc/update-motd.d以下のすべての情報が表示されなくなります。また、/etc/update-motd.d以下のスクリプトによっては、設定ファイルで表示を抑制できるものも存在します。ただし、すべてがすべて対応しているわけではありません。

そこで今回はもう少し汎用的で、粒度を細かく設定できる方法として、/etc/update-motd.d以下を編集する方法を紹介しましょう。一番手っ取り早いのは、関連するファイルを削除する方法です。一般的に正しく作られたパッケージを利用しているのであれば、/etc以下のファイルがパッケージの更新によって上書きされることはありません。

もし、元のファイルを残しておきたいのであれば、拡張子を付けてしまいましょう。Ubuntuのpam_motd.soは、/etc/update-motd.d以下のスクリプトをrun-parts --lsbsysinitで実行します。--lsbsysinitが付いている場合、ファイル名に対して次のようなルールが適用されます。

  • .dpkg-old.dpkg-dist.dpkg-new.dpkg-tmpで終わっているファイル名は実行しない
  • 小文字の英数字のみのファイル名は実行する(LANANA指定の名前空間)
  • アンダースコアか小文字の英数字、ピリオドで始まり、小文字の英数字が続くファイル名は実行する(LSBの名前空間)
  • 小文字・大文字の英数字とアンダースコア、ハイフンで構成されるファイル名は実行する(Debianのcronスクリプトの名前空間)

最初の項目はDebianのパッケージ管理システムが設定ファイルの差分を確認した時に自動的に退避するためのファイルです。手動で生成しても良いのですが、将来的な混乱の元なのでやめておきましょう。

ポイントはピリオドがファイル名の先頭しか許されていない点です。このため、拡張子付きのファイルは実行されません。よって拡張子を付けて退避する方法をおすすめします。

$ sudo mv /etc/update-motd.d/10-help-text{,.orig}

これで次回ログイン時から、退避したファイルのメッセージは表示されませんし、必要であればすぐに復活できます。

MOTD用ファイルの生成の無効化

update-motdで無効化したとしても、いくつかのMOTD用の出力ファイルは自動生成を続けます。もともと表示しないのであれば、自動生成も意味がないので無効化したいと思うかもしれません。前述の「systemdのサービスファイルによるMOTDの生成」で紹介したファイルは、それぞれ無効化する方法が存在します。

まず「aptによるリポジトリ情報の更新や自動アップグレード機能の結果」ですが、これはUbuntuでは「Unattended Upgrade」と呼ばれる機能に該当します。詳しいことは第671回のパッケージのアップデートとアップグレードを制御するなどで解説していますので、そちらを参照してください。ただしこれに関しては、特別な理由がない限りは無効化することはおすすめしません。セキュリティアップデートは、できるだけはやく適用するのが原則だからです。

残りの項目についてはsystemctlでdisableしてしまえば良いだけです。

$ sudo systemctl disable update-notifier-motd.timer
$ sudo rm /var/lib/ubuntu-release-upgrader/release-upgrade-available
$ sudo systemctl disable motd-news.timer
$ sudo rm /var/cache/motd-news

どちらも単に情報を取得するだけなので、不要なら無効化しておいても問題ないでしょう。

Ubuntu Pro関係のメッセージの無効化

MOTDとは直接は関係ありませんが、2023年のはじめぐらい前からaptコマンドを実行すると、Ubuntu ProやESMの宣伝が入るようになりました。

apt update時にたまに表示されるメッセージ:
The following security updates require Ubuntu Pro with 'esm-apps' enabled:
  imagemagick libopenexr25 libmagick++-6.q16-8 libmagickcore-6.q16-6-extra
  libmagickwand-6.q16-6 imagemagick-6.q16 libmagickcore-6.q16-6
  imagemagick-6-common

apt upgradeする時に表示されるメッセージ:
#
# News about significant security updates, features and services will
# appear here to raise awareness and perhaps tease /r/Linux ;)
# Use 'pro config set apt_news=false' to hide this and future APT news.
#

前者はUbuntu Proのesm-appsを有効化することで利用できる、universeパッケージのセキュリティアップデートを紹介しています。なぜuniverseのセキュリティアップデートがesm-appsで提供されているのかについての詳細はUbuntu Weekly Topicsの2023年1月27日号2023年2月10日号を参照してください。後者は単なるUbuntu Proの宣伝です。

ただ、通常サポート期間のUbuntuを個人が使う限りにおいて、Ubuntu Proが必要になるケースはあまりありません。もちろんシャットダウンしづらいマシンであればLivepatchは有効ですし、universeパッケージを使っている環境ならesm-appsも有効でしょう。ただパッケージの更新の度に導入を促されるほどでもないはずです。

前者についてはaptコマンド時のフックスクリプト/etc/apt/apt.conf.d/20apt-esm-hook.confで実行されています。もし不要なら、次のようにスクリプトを退避して、中身を空にしてしまいましょう。

$ sudo mkdir /etc/apt/apt.conf.d/old
$ sudo mv /etc/apt/apt.conf.d/{,old/}20apt-esm-hook.conf
$ sudo touch /etc/apt/apt.conf.d/20apt-esm-hook.conf

後者については、メッセージの中に記述があるように、次のコマンドで無効化できます。

$ sudo pro config set apt_news=false

このようにUbuntuには「良かれと思って出しているのかもしれないけれど、普段使う分には余計なお世話」なメッセージがいろいろ存在します。必要に応じて、メッセージを適切な設定で取捨選択するか、気にしないスキルが必要です。うまく自分に合う設定を模索してみてください。

おすすめ記事

記事・ニュース一覧