diary/Kojima

・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で統一しておく方が一貫性はある気がするな。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42