gentoo の systemd をアップデートする

結論から言うと、systemd をアップデートする前に kernel をアップデートしておきましょう、というお話です。

うちの環境だと、こんな感じで 226-r2 から 233-r1 へのアップデートになります。

# emerge -pv systemd

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild     U  ] sys-libs/libseccomp-2.3.2::gentoo [2.3.0::gentoo] USE="-static-libs" ABI_X86="(64) -32 (-x32)" 0 KiB
[ebuild     U  ] sys-apps/systemd-233-r1:0/2::gentoo [226-r2:0/2::gentoo] USE="acl gcrypt* kmod lz4 pam seccomp ssl (-apparmor) -audit -build -cryptsetup -curl -doc% -elfutils -gnuefi -http -idn -importd -lzma -nat -policykit -qrcode (-selinux) -sysv-utils {-test} -vanilla -xkb (-kdbus%*)" ABI_X86="(64) -32 (-x32)" 0 KiB

Total: 2 packages (2 upgrades), Size of downloads: 0 KiB

で、このアップデートをなにも考えずに当てると、こんなポストメッセージが表示されます。

 * Messages for package sys-apps/systemd-233-r1:

 *   CONFIG_CRYPTO_USER_API_HASH:        is not set when it should be.
 * Please check to make sure these options are set correctly.
 * Failure to do so may cause unexpected problems.

言われたとおりに kernel のコンフィグいじって make しなおしても良いのですが、このコンフィグどうやら gentoo-sources-4.9.16 だとデフォルトで y になるようです。

Symbol: CRYPTO_USER_API_HASH [=y]
Type  : tristate
Prompt: User-space interface for hash algorithms
  Location:
(1) -> Cryptographic API (CRYPTO [=y])
  Defined at crypto/Kconfig:1671
  Depends on: CRYPTO [=y] && NET [=y]
  Selects: CRYPTO_HASH [=y] && CRYPTO_USER_API [=y]
  Selected by: GENTOO_LINUX_INIT_SYSTEMD [=y] && GENTOO_LINUX [=y] && GENTOO_LINUX_UDEV [=y]

うちの環境は特にアップデートする必要性も感じなかったので gentoo-sources-4.9.6-r1 のままなんですが……

# eselect kernel list
Available kernel symlink targets:
  [1]   linux-4.4.39-gentoo
  [2]   linux-4.9.6-gentoo-r1 *
  [3]   linux-4.9.16-gentoo
# uname -r
4.9.6-gentoo-r1.20170205.01

まぁどうせ kernel のビルドするなら、新しいバージョンを使いましょう。

というわけで kernel のビルド自体は gentoo なら日常です。この wiki でも記事にしてあります

ビルドの準備

まず現行の kernel の .config をコピーします。

# cd /usr/src
# cp linux/.config linux-4.9.16-gentoo/

それから /usr/src/linux の symlink を張り直します。別に rmln でやっても問題はないんですが、まぁ便利なツール eselect が用意されているのでそれを使いましょう。

# eselect kernel list
Available kernel symlink targets:
  [1]   linux-4.4.39-gentoo
  [2]   linux-4.9.6-gentoo-r1 *
  [3]   linux-4.9.16-gentoo
# eselect kernel set 3
# eselect kernel list
Available kernel symlink targets:
  [1]   linux-4.4.39-gentoo
  [2]   linux-4.9.6-gentoo-r1
  [3]   linux-4.9.16-gentoo *

こんな感じで。

# ls -l /usr/src/linux
lrwxrwxrwx 1 root root 19 May  7 13:04 /usr/src/linux -> linux-4.9.16-gentoo

ちゃんと symlink が張り直されてます。

特に変更の必要がなくても、いちど menuconfig で開いて、新しいバージョンの kernel コンフィグを反映させた上で保存します。

# cd /usr/src/linux
# make menuconfig

ちなみに一応確認しておきます。/ で検索モードに切り替えて CRYPTO_USER_API_HASH を検索します。

Symbol: CRYPTO_USER_API_HASH [=y]
Type  : tristate
Prompt: User-space interface for hash algorithms
  Location:
(1) -> Cryptographic API (CRYPTO [=y])
  Defined at crypto/Kconfig:1671
  Depends on: CRYPTO [=y] && NET [=y]
  Selects: CRYPTO_HASH [=y] && CRYPTO_USER_API [=y]
  Selected by: GENTOO_LINUX_INIT_SYSTEMD [=y] && GENTOO_LINUX [=y] && GENTOO_LINUX_UDEV [=y]

ちゃんと [=y] になってます。保存して menuconfig を終了したら、念のため……

# grep 'CRYPTO_USER_API_HASH' ./.config
CONFIG_CRYPTO_USER_API_HASH=y

大丈夫ですね。

あとはいつもどおりの手順です。

# cd /usr/src/linux
# make -j5 && make modules_install
# mount /boot
# cp /usr/src/linux/arch/x86_64/boot/bzImage /boot/kernel-4.9.16-gentoo-host.20170507.01
# grub-mkconfig -o /boot/grub/grub.cfg
# systemctl reboot

無事に再起動が完了したら……

# uname -r
4.9.16-gentoo-host.20170507.01

というわけで、systemd のアップデートは下準備として以上のような作業が必要になるようです。もちろん元々 CONFIG_CRYPTO_USER_API_HASH[=y] になっているなら、なにも考えずに emerge してもおっけーですね。

# emerge -av systemd
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/blog:2017:20170507123109_gentoo_systemd_update_from_226_to_233