linux の起動時に UUID で root filesystem を指定する方法
当日記ではアフィリエイト広告を利用しています
Hyper-V Path through 物理 SSD に install した Debian が実 PC で正常に起動せずに initramfs に落ちる原因は、install した環境と起動する環境の違いにより、drive/partition の block device name が変わり、root filesystem を見失っている事だった。
hiro20180901.hatenablog.com
過去に linux を使っていた際には無かったと思うが、今は UUID により unique な block device name を割り当てる事が出来るらしい。
arch linux の文書は分かりやすい。今度使ってみよう。installer が無いとか面白い。Linux from Scratch の binary 版みたいなものか。
Debian と Ubuntu の grub.cfg 比較
そういえば Ubuntu は問題なく両方で起動できたので、Debian の設定と比較してみた。
- Hyper-V 仮想マシンで Ubuntu を起動
- 起動後に Debian を install した物理SSD を Path through 接続すると、/dev/sdb として認識した。
- /dev/sdb1 を /mnt に read only で mount
仮想マシン Ubuntu を起動後に物理SSD を接続しないとダメ。仮想マシン起動前に接続すると、install の際と同様に checkpoint が作成できない error が出て起動しない。
この状態で、/boot/grub/grub.cfg (Ubuntu側) と /mnt/boot/grub/grub.cfg (Debian側) を比較してみた。
Ubuntu側の通常起動部分:
...略...
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-706c00nn-00nn-00nn-00nn-0000nnnn00nn' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 706c00nn-00nn-00nn-00nn-0000nnnn00nn
else
search --no-floppy --fs-uuid --set=root 706c00nn-00nn-00nn-00nn-0000nnnn00nn
fi
linux /boot/vmlinuz-4.15.0-43-generic root=UUID=706c00nn-00nn-00nn-00nn-0000nnnn00nn ro quiet splash $vt_handoff
initrd /boot/initrd.img-4.15.0-43-generic
}
...略...Debian側の通常起動部分:
...略...
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-371f00nn-00nn-00nn-00nn-0000nnnn00nn' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 371f00nn-00nn-00nn-00nn-0000nnnn00nn
else
search --no-floppy --fs-uuid --set=root 371f00nn-00nn-00nn-00nn-0000nnnn00nn
fi
echo 'Loading Linux 4.9.0-8-amd64 ...'
linux /boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.9.0-8-amd64
}
...略...Ubuntu側には UUID だけが存在しているのに対して、Debian側には旧来の /dev/sda の形式が残っている。
Debian の grub.cfg を UUID 形式に修正
本来なら UUID ではなく /dev/sda の形式になってしまう原因を追究すべきだと思うが、とりあえずの確認として /dev/sda となっている所を UUID に変更して、実 PC と仮想マシンで起動させてみた...OK。両方ともに問題なく起動した。
Debian で update-grub
update-grub2 にて /boot/grub/grub.cfg を再構成すると...Ubuntu の様に UUID 指定に直った。installer 側の問題だと思われる。
結果
- Debian を install した物理 SSD が、仮想マシンで起動できるのに対して実 PC で起動できずに initramfs に落ちる原因は、/boot/grub/grub.cfg 内に旧来の /dev/sda 形式で root filesystem が指定されていて、実 PC で root filesystem がズレる為だった。
- Debian で update-grub2 コマンドを実行すると、/boot/grub/grub.cfg が再構成されて、ちゃんと UUID で root filesystem を指定するようになるので、installer 側の問題だと思われる。
kernel 組み込み -> module -> initrd に変わった時には、起動に必要な device 用の module が initrd に入っておらず読み込めずに panic とか日常だったが、久々に昔を思い出しながら trouble shoot すると面白い。