hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

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 を割り当てる事が出来るらしい。

GRUB/ヒントとテクニック arch linux

永続的なブロックデバイスの命名 arch linux

arch linux の文書は分かりやすい。今度使ってみよう。installer が無いとか面白い。Linux from Scratch の binary 版みたいなものか。

DebianUbuntugrub.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 の形式が残っている。

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