・UUIDとPARTUUID
最近、マシンを組み替えることがあってHDDを付けたり外したりしたら、/dev/sdXX の番号が変って起動できなくなったりしたもので、 root partitionをUUIDで指定することにした。
始めは、grub.cfgでGRUBが自動的に見つけるUUIDを指定してやればいいのかと思って、
if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd3,msdos2 --hint-efi=hd3,msdos2 --hint-baremetal=ahci3,msdos2 e0cfa2e1-a797-4bf9-0d6-03db39ca9b else search --no-floppy --fs-uuid --set=root e0cfa2e1-a797-4bf9-b0d6-bb03db39ca9b fi echo 'Loading Linux 3.12.5-plamo64 ...' linux /boot/vmlinuz-3.12.5-plamo64 root=UUID=e0cfa2e1-a797-4bf9-b0d6-bb03db39ca9b ro vga16 unicon=eucjp vt.default_utf8=0 panic_output=7
みたいに指定してみたのだけど、再起動すると「rootfsが見つからない」というエラーになって起動しなくなってしまった。 UUIDが違うのかと blkid で確認したけど問題ない。
$ /sbin/blkid /dev/sdc2 /dev/sdc2: LABEL="rootfs" UUID="e0cfa2e1-a797-4bf9-b0d6-bb03db39ca9b" TYPE="ext4"
おかしいなぁ、、と思って調べてみたら、http://unix.stackexchange.com/questions/93767/why-cant-i-specify-my-root-fs-with-a-uuid に「カーネルのソースを見る限りUUIDじゃなくてPARTUUIDっぽい」という話を発見。
そうなのか、とカーネルパラメータの root=UUID= を root=PARTUUID= ... としてみたけれど、rootfs が見つからない問題は変らず。
UUIDを操作するためにモジュールでも必要なのか、としばらく調べてみたけど、どうも処理自体は init/do_mounts.c だけで完結しているっぽい。
仕方ないんでしばらく放置してたのだけど、改めて上記URLのページを読み返してみると、最後の方のレスに、 「PARTUUIDで指定するのはファイルシステムのUUIDではなく、パーティションのUUIDだよ」という指摘が。
確かに init/do_mounts.c を見ると、
/* * Convert a name into device number. We accept the following variants: * ... * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the * unique id of a partition if the partition table provides it. * The UUID may be either an EFI/GPT UUID, or refer to an MSDOS * partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero- * filled hex representation of the 32-bit "NT disk signature", and PP * is a zero-filled hex representation of the 1-based partition number. * 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to * a partition with a known unique id. *
などと言う記載がある。じゃぁ、このパーティションIDというのはどうやったら得られるのだろう、、と調べたら、 何のことはない、fdisk -l とかが返す 「ディスク識別子」だった。
$ sudo fdisk -l /dev/sdc Disk /dev/sdc: 500.1 GB, 500107862016 bytes, 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x38633862
なるほど、と思って、これを使って、grub.cfg のカーネルパラメータの部分を
linux /boot/vmlinuz-3.12.5-plamo64 root=PARTUUID=38633862-02 ro vga16 unicon=eucjp vt.default_utf8=0 panic_output=7
のように書き替えてやれば、無事 rootfs が見つかって起動できるようになった。
# 末尾の -02 は2つめのパーティションの意味
きちんと調べたわけではないけれど、どうやら、本来 root=UUID=xxxx で指定するのは間違いなものの、 initrd を使っている場合、initrd が自動的に(0,0) でアクセスできるので、問題が露見しないらしい。
どっちが素直かとしばし悩んだけれど、/etc/fstab だとマウントするファイルシステムをUUIDでも指定できるので、 PARTUUIDを使うよりはUUIDで統一しておく方が一貫性はある気がするな。