Fedoraもfedupを使って簡単に更新できるようになって便利になりました。しかし、システムにインストールされているrescueイメージとカーネルが古くなっても更新されません。さすがにFedora22でFedora18頃のrescueイメージとかカーネルでは怖いので更新方法を調べてみました。
Fedora 36頃のrescueカーネルの更新方法
Fedoraインストーラが使うdracutのrescueカーネルインストールスクリプトを使う方法が最もお勧めです。以下のコマンドで現在使用中のカーネルがrescueカーネルに設定されます。
sudo rm /boot/*rescue*
sudo /usr/lib/kernel/install.d/51-dracut-rescue.install add "$(uname -r)" /boot "/boot/vmlinuz-$(uname -r)"
以降、古い情報 − 現在のFedoraのrescueカーネルの更新方法
現在(2021年6月現在)のFedoraのrescueカーネルの更新はcpでコピーするだけなので簡単です。しかし、コマンドは用意されていません。
/boot の中にブート用のファイルシステムイメージ (/boot/initramfs-*)とカーネル(/boot/vmlinuz-*)があります。
- initramfs-0-rescue-<HEXのホストID>.img
- vmlinuz-0-rescue-<HEXのホストID>.img
これを更新したいカーネルのinitramfs(例、/boot/initramfs-5.11.21-300.fc34.x86_64.imgなど)とvmlinuz(例、/boot/vmlinuz-5.11.21-300.fc34.x86_64など)に置き換えるだけでrescueイメージとカーネルを更新できます。同一のカーネルバージョンのモノを使うのがポイントです。
以降、更に古い情報 ー TL;DR;
Fedoraのrescueイメージとカーネルの更新方法
# dnf install dracut-config-rescue # mv /boot/*0-rescue* . # /etc/kernel/postinst.d/51-dracut-rescue-postinst.sh $(uname -r) /boot/vmlinuz-$(uname -r) # grub2-mkconfig -o /boot/grub2/grub.cfg
51-dracut-rescue.installを使った方が良いのかも知れませんが、私の使い方ではこれで十分です。
調べた手順
dracutに更新用のオプションがあるのだろう、と思って調べてみると–no-hostonlyオプションが使えそうです。
システムをクリーンインストールすると勝手にrescueイメージとカーネルが作られるので何かパッケージがあるのだろう、と思って見てみると
# rpm -qa | grep dracut dracut-041-10.fc22.1.x86_64 dracut-config-rescue-041-10.fc22.1.x86_64 dracut-network-041-10.fc22.1.x86_64
config rescueというそれらしきパッケージがあります。
[root@dev ~]# rpm -ql dracut-config-rescue /etc/kernel/postinst.d/51-dracut-rescue-postinst.sh /usr/lib/dracut/dracut.conf.d/02-rescue.conf /usr/lib/kernel/install.d/51-dracut-rescue.install
51-dracut-rescue-postinst.shの中身を見てみると
if [[ ! -f $INITRDFILE ]]; then dracut --no-hostonly -a "rescue" "$INITRDFILE" "$KERNEL_VERSION" ((ret+=$?)) fi
となっているのでこれがrescue用のinitramfsとkernelを作っているようです。ファイル名で検索すると
が見つかり、とすれば良いと書いてあります。
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh $(uname -r) /boot/vmlinuz-$(uname -r)
が、実行しても何も起きません。そこでファイルの中身をもう一度見てみると
INITRDFILE="/boot/initramfs-0-rescue-${MACHINE_ID}.img" NEW_KERNEL_IMAGE="${KERNEL_IMAGE%/*}/vmlinuz-0-rescue-${MACHINE_ID}" [[ -f $INITRDFILE ]] && [[ -f $NEW_KERNEL_IMAGE ]] && exit 0
とファイルが存在すると何もしません。
mv /boot/*0-rescue* .
と実行すると、rescueイメージとカーネルが更新されました。
[root@dev ~]# ll /boot/ 合計 136076 -rw------- 1 root root 3054410 5月 22 01:05 System.map-4.0.4-201.fc21.x86_64 -rw------- 1 root root 3054410 5月 28 07:38 System.map-4.0.4-202.fc21.x86_64 -rw------- 1 root root 3052614 5月 28 21:43 System.map-4.0.4-303.fc22.x86_64 -rw-r--r-- 1 root root 154671 5月 22 01:05 config-4.0.4-201.fc21.x86_64 -rw-r--r-- 1 root root 154671 5月 28 07:38 config-4.0.4-202.fc21.x86_64 -rw-r--r-- 1 root root 154760 5月 28 21:43 config-4.0.4-303.fc22.x86_64 drwxr-xr-x. 4 root root 1024 6月 7 10:08 efi -rw-r--r-- 1 root root 184380 10月 21 2014 elf-memtest86+-5.01 drwxr-xr-x. 2 root root 3072 6月 7 09:55 extlinux drwxr-xr-x. 6 root root 1024 6月 10 11:39 grub2 -rw-r--r-- 1 root root 48387855 6月 10 11:39 initramfs-0-rescue-3baa48a2b0a34432b5395a8c61f24e6c.img -rw-r--r-- 1 root root 18323504 6月 1 11:57 initramfs-4.0.4-201.fc21.x86_64.img -rw-r--r-- 1 root root 18405970 6月 5 20:58 initramfs-4.0.4-202.fc21.x86_64.img -rw-r--r-- 1 root root 20049897 6月 7 10:21 initramfs-4.0.4-303.fc22.x86_64.img -rw-r--r--. 1 root root 565143 6月 7 10:21 initrd-plymouth.img drwx------. 2 root root 12288 6月 2 2014 lost+found -rw-r--r-- 1 root root 182704 10月 21 2014 memtest86+-5.01 -rwxr-xr-x 1 root root 5897880 6月 10 11:39 vmlinuz-0-rescue-3baa48a2b0a34432b5395a8c61f24e6c -rwxr-xr-x 1 root root 5894088 5月 22 01:05 vmlinuz-4.0.4-201.fc21.x86_64 -rwxr-xr-x 1 root root 5894600 5月 28 07:38 vmlinuz-4.0.4-202.fc21.x86_64 -rwxr-xr-x 1 root root 5897880 5月 28 21:43 vmlinuz-4.0.4-303.fc22.x86_64
リブートするとGrub2のメニューが更新されていなかったので
grub2-mkconfig -o /boot/grub2/grub.cfg
としてメニューを更新しました。
試しにrescueイメージでブートしてみました。ブートできましたが普通にホストのファイルシステムを使ってGUIで立ち上がりました。あれ?と思ってVMwareにインストールしてあるFedora22で試しても同じだったので、今時のrescueイメージはインストールしてあるファイルシステムから起動できるなら起動してしまうようです。少なくとも、カーネルのバグでブートできないという場合(実際、kernel 3.18.4から4.0.3まで安定的にブートできない問題があった)でも消されない古いカーネルイメージがあると安心です。