[[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で統一しておく方が一貫性はある気がするな。
- もう少し正確に言うと、「root=UUID=xxxx という指定は意味はないけど、initrdを使っている限り問題にはならないので、/etc/fstab との整合性を取る意味では分かりやすいだろう」というところ。 -- [[kojima]] &new{2014-04-07 (月) 19:27:39};
- カレントディレクトリは、/usr/src/linuxに居ます。./tools/testing/ktest/ktest.plかな?と思って調べています。カーネル再構築の時、make installすると、grub.confが自動生成されます。この時、UUIDも入っているので、PARTUUIDを使う場合は、grub.confを書き直す必要があるのかも?と思っています。 -- [[jiku]] &new{2014-04-19 (土) 10:33:17};
- なんだか稲川淳二口調の文に見えました。 -- [[菖蒲に八橋]] &new{2014-05-13 (火) 23:29:37};

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS