雑に pacman -Syu した後に、DKMSのインストールで祈る事は、私みたいな適当Arch Linuxユーザーは一度や二度は経験したことがあると思います。今回は祈りが届かずZFSのインストールに失敗したのでリカバリ方法をメモしておきます。

エラー内容

DKMSは、カーネルのアップグレードに応じてカーネルモジュールを再ビルドするための仕組みです。カーネルのアップグレードに伴ってカーネルモジュールを再ビルドする必要があるソフトウェアは、DKMSを利用することでカーネルのアップグレードを気にせずに使えるようになります。

今回はシステムアップデートのため pacman -Syu を実行した後に、ZFSのインストールに失敗しました。エラーメッセージは以下の通りです。

==> dkms install --no-depmod zfs/2.1.11 -k 6.3.1-arch2-1
configure: error:
    *** None of the expected "capability" interfaces were detected.
    *** This may be because your kernel version is newer than what is
    *** supported, or you are using a patched custom kernel with
    *** incompatible modifications.
    ***
    *** ZFS Version: zfs-2.1.11-1
    *** Compatible Kernels: 3.10 - 6.2

Error! Bad return status for module build on kernel: 6.3.1-arch2-1 (x86_64)
Consult /var/lib/dkms/zfs/2.1.11/build/make.log for more information.
==> WARNING: `dkms install --no-depmod zfs/2.1.11 -k 6.3.1-arch2-1' exited 10

DKMSを利用するようなソフトウェアが動作しなくて困らないなんてことはないと思うので、Linuxカーネルのアップグレードをするときはきちんと依存が問題ないか確認しておくのが楽です。今回の zfs-dkms も、カーネル6.3で動作せんよとAURのコメントで掛かれていました。 でもアップデート前にいちいちAURのページ見ないよなぁ。

まだ再起動してないなら dmesg で今のカーネルを確認しておきましょう。一番上の行にカーネルのバージョンが表示されます。今回の場合は 6.2.12-arch1-1 で起動していますね。

$ sudo dmesg | head -n 1
[    0.000000] Linux version 6.2.12-arch1-1 (linux@archlinux) (gcc (GCC) 12.2.1 20230201, GNU ld (GNU Binutils) 2.40) #1 SMP PREEMPT_DYNAMIC Thu, 20 Apr 2023 16:11:55 +0000

カーネルを戻す

pacmanのWikiページに散々書かれているように、部分的なアップグレードは推奨されません。今回はダウングレードですが、システムの一貫性が損なわれるという点では同じです。カーネルに強く依存するソフトウェアがあったり、長い間 pacman -Syu してこなかったシステムでダウングレードするときはリスクになります。

pacman - ArchWiki

きちんと ダウングレードしたいときはArch Linux Archiveの仕組みを使って特定日時まで戻すべきです。

Arch Linux Archive - ArchWiki

とりあえず今回はカーネルだけ元に戻します。前回 pacman -Syu してからそれほど時間が経っていないことと、私は適当Arch Linuxユーザーだからです。

キャッシュを削除していないなら簡単です。キャッシュから問題なかったパッケージを拾ってきて、インストールするだけです。

sudo pacman -U /var/cache/pacman/pkg/linux-6.2.12-arch1-1.pkg.tar.xz
sudo pacman -U /var/cache/pacman/pkg/linux-headers-6.2.12-arch1-1.pkg.tar.xz

キャッシュを削除した場合でも、上記のようなtarファイルがあれば復旧できます。ALAやarchive.orgを探してみましょう。先ほどのリンクが役に立つはずです。

私のようにDKMSで失敗したユーザーは linux-headers も元に戻すべきでしょう。元に戻すと、pacmanのフックによりDKMSのビルドも走ります。逆に元に戻さないで dkms install しようとしても、ヘッダーが見つからないためエラーになります。よくできてますね。