genkernelでGentooカーネルアップグレード

genkernelを使用してGentoo Linuxカーネルをアップグレードする私なりの手順です。公式のドキュメントはgenkernelと手動の方法が併記されていて読みにくいので、genkernelを使用する方法だけをまとめました。

カーネルアップグレード前にemerge -uDN @worldを実行してもいいかもしれません。

emerge --sync
emerge -uDN @world

まず、インストールされているカーネルソースを確認します。

eselect kernel list
Available kernel symlink targets:
  [1]   linux-OLD_VERSION-gentoo *
  [2]   linux-4.19.52-gentoo

この例ではlinux-4.19.52-gentooが新しくインストールされています。

/usr/src/linuxシンボリックリンク先を、新バージョンのカーネルソースに切り替えます。

eselect kernel set 2
eselect kernel list
Available kernel symlink targets:
  [1]   linux-OLD_VERSION-gentoo
  [2]   linux-4.19.52-gentoo *

次の2つのコマンドのどちらかを実行して、現在のカーネルコンフィグを新バージョンのカーネルソースディレクトリにコピーします。どっちでもいいんですが、/proc/config.gzからコピーする方がバージョンを指定する必要がなく間違えにくいのでよいでしょう。

zcat /proc/config.gz > /usr/src/linux/.config

or

cp /etc/kernels/kernel-config-x86_64-OLD_VERSION-gentoo /usr/src/linux/.config

genkernelでカーネルとモジュールをコンパイルします。--oldconfigをつけないと、さっきコピーしたカーネルコンフィグを読み込んでくれないので注意しましょう。ここだけ手動でmake oldconfigとかしてもgenkernelに無視されるようです。最初から最後までgenkernelを使いましょう。

genkernel --oldconfig --menuconfig all

menuconfigが起動したら、念のためコピーしたカーネルコンフィグが読み込まれているか設定内容を確認しましょう。

無事カーネルコンパイルが完了したら、次のコマンドでgrubの設定に新しいカーネル名を書き込みます。

grub-mkconfig -o /boot/grub/grub.cfg

リブートして立ち上がるか確認しましょう。

残ったファイルの削除(手動)

ここから先はディスク容量が少ない場合だけやればよいです。ただまあ、オブジェクトファイルは数GBになるので環境によっては削除したくなるでしょう。

古いカーネルを削除するツールとしてapp-admin/eclean-kernelがあるようなのですが、意図したとおりに動かなかった(古いカーネルソースが削除されなかった)ので、ここでは手動で残ったファイルを削除します。 ここの手順は公式ドキュメントカーネル/削除 - Gentoo Wikiとほぼ同じです。

オブジェクトファイルのクリーン

genkernelでもクリーンできそうな気がしますが、よく分からないのでmake cleanです・・・。(genkernelはクリーンだけ実行することができない?コンパイルまで走ってしまう。)

cd /usr/src/linux
make clean

古いカーネルソースのパッケージ名の確認

equery l '*sources*'

古いカーネルソースのアンインストール

emerge --unmerge sys-kernel/gentoo-sources-OLD_VERSION

Portageが削除してくれないディレクトリの削除

rm -r /usr/src/linux-OLD_VERSION-gentoo/

古いカーネルモジュールの削除

rm -r /lib/modules/OLD_VERSION-gentoo-x86_64/

/boot内の古いファイルの削除

rm /boot/vmlinuz-OLD_VERSION-gentoo-x86_64
rm /boot/System.map-OLD_VERSION-gentoo-x86_64
rm /boot/initramfs-OLD_VERSION-gentoo-x86_64.img

最近のgenkernelのバージョンアップで生成されるファイル名が以下の通り変更されています。適宜読み替えてください。

kernel-genkernel-x86_64-OLD_VERSION-gentoo      -> vmlinuz-OLD_VERSION-gentoo-x86_64
System.map-genkernel-x86_64-OLD_VERSION-gentoo  -> System.map-OLD_VERSION-gentoo-x86_64
initramfs-OLD_VERSION-gentoo-x86_64.img  -> initramfs-OLD_VERSION-gentoo-x86_64.img

削除したらgrubの設定を更新しましょう。

grub-mkconfig -o /boot/grub/grub.cfg