てんこ製作

Tenco Works

Ubuntuでアップデートの手間を減らしたい

久しぶりにログインすると、未適用の修正がたくさんあって毎度手打ちで修正適用して必要に応じてリブートとかめんどくさくなってきたので楽したいというお話。

前提環境

/etc$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

やりたいこと

  • apt updateとapt upgrade -yの2つのコマンドを実行する
  • リブートの必要があればrebootコマンドを実行する
  • 夜中に勝手に全てを済ませてくれる。

コマンドの投入がメインなのでshellスクリプトで充分かなと思います。

夜中に動く部分はcronにお任せすることにします。

作成したshellスクリプト

#!/usr/bin/sh

/usr/bin/apt update
/usr/bin/apt upgrade -y
if [ "`/etc/update-motd.d/98-reboot-required`" = "*** System restart required ***" ]; then
  /usr/sbin/reboot
fi

以下、メモ

悩みポイントは2つ。

  • リブートが必要なことをどうやって調べるか
  • Ubuntu 22.04でapt upgradeしたときに問い合わせ画面が出てきて止まってしまう問題

リブートが必要なことを調べる方法

そもそもこういう作りにしようと思ったきっかけですが、Ubuntuにsshでログインすると未適用のパッチがいくつあってとか、リブートが必要とか、色々表示されるのですよね。

リブートが必要かどうかコマンドでわかるなら、それで判定して必要なときにだけリブートできそうだよねと思いまして。

debimate.jp

Ubuntuの場合は/etc/update-motd.dの仕組みでログインのときのメッセージを表示している模様。

実際にディレクトリの中を見てみます。

~$ cd /etc/update-motd.d/
/etc/update-motd.d$ ls
00-header             88-esm-announce            95-hwe-eol
10-help-text          90-updates-available       97-overlayroot
50-landscape-sysinfo  91-contract-ua-esm-status  98-fsck-at-reboot
50-motd-news          91-release-upgrade         98-reboot-required
85-fwupd              92-unattended-upgrades
/etc/update-motd.d$ 

sshでログインするときには、これらがすべて実行されるということのようです。

知りたいのはリブートが必要かどうかを表示する部分。名前的に怪しいのは98-reboot-requiredですかね。実際に手打ちで実行してみます。

/etc/update-motd.d$ ./98-reboot-required 
\*\*\* System restart required \*\*\*
/etc/update-motd.d$ 

実際にリブートが必要な状態で実行すれば、このように「System restart required」と表示されます。

あとはこれをshellスクリプトの中で実行して、表示された結果が「System restart required」かどうかを調べて、一致するときはrebootコマンドを投入すればいいわけです。

if [ "`/etc/update-motd.d/98-reboot-required`" = "*** System restart required ***" ]; then
  /usr/sbin/reboot
fi

shellスクリプトの中でバッククォートで囲まれた部分は、その中身を実行して表示される内容をそのままスクリプトの中に展開してくれます。それを文字列比較して判定することができました。

apt upgradeで問い合わせ画面が出てきて処理が止まる問題

apt upgradeコマンドを実行したとき、紫色の画面が表示されて入力待ちになることがあります。これの正体について調べました。

rohhie.net

needrestartというパッケージがUbuntu22.04から採用されているようで、こいつのせいらしいです。

マシンの利用形態にもよるんでしょうけど、今回は普段から決まった時間にパッチ当てて勝手にリブートして欲しいので、そのように設定します。

needrestartの設定ファイルは、/etc/needrestart/needrestart.confにありました。

$nrconf{restart} = 'a';

これで入力待ちで止まるようなことは無くなりました。