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 すると面白い。