UUIDを使用してルートファイルシステムを指定できないのはなぜですか?

UUIDを使用してルートファイルシステムを指定できないのはなぜですか?

私のシステムはGRUB 2設定で正しく起動します。

linux   /bzImage root=/dev/sda2 init=/usr/lib/systemd/systemd ro

/dev/sda2ただし、対応するUUIDに置き換えると、次のようになります。

linux   /bzImage root=UUID=666c2eee-193d-42db-a490-4c444342bd4e init=/usr/lib/systemd/systemd ro

その後、起動中に失敗します。

kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)

UUIDが正しいようです。

# blkid
/dev/sda1: UUID="97ac3744-39de-4d6d-9a81-e3a3ea08a8bb" TYPE="ext2" 
/dev/sda2: UUID="666c2eee-193d-42db-a490-4c444342bd4e" TYPE="ext4" 

なぜ動作しないのですか? initramfsを使わないからですか?

これはカーネル3.10.7を使用するx86_64 Gentoo Linuxです。マイコンピュータではMBRパーティションテーブルを使用し、マイコンピュータsdaではGUIDパーティションテーブルを使用しますsdb

答え1

明らかに、UUIDカーネルがハードドライブを識別する信頼できる唯一の方法です。 2種類あります。ファイルシステムに保存され、起動時にカーネルで使用できないUUIDとパーティションテーブルに保存され、起動時に使用できるPARTUUID。だからあなたは使用する必要があります

root=PARTUUID=SSSSSSSS-PP

/dev/sd??デバイスが接続/切断されると変更されることがあります。

忘れないで首都SSSSSSSS-PPあなたが得る16進数blkid

使いやすい

root=LABEL=
root=UUID=

initramfsこれらの識別子を検索するためにのみ使用できます。

したがって、null以外のものを使用すると、3つinitramfsすべてを持つことができます!空虚でinitramfsあなたは残りますPARTUUID

答え2

UUIDから起動するときに渡す必要があるパラメータはですPARTUUID。そうする必要がありますroot=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e

ドキュメントでは、次を返す理由について説明しますunknown-block(0,0)

カーネルパラメータ.txt:

    root= [KNL] ルートファイルシステム
            init/do_mounts.c の name_to_dev_t コメントをご覧ください。

初期化/do_mounts.c:

/*
 *名前をデバイス番号に変換します。私達は次の変形を可能にします:
 *
 * 1)デバイス番号は16進数で表示されます。
 * 2) /dev/nfs は Root_NFS(0xff) を示します。
 *3) /dev/<disk_name>はディスクのデバイス番号を示します。
 *4) /dev/<disk_name><decimal>はデバイス番号を示します。
 *パーティション - ディスクのデバイス番号にパーティション番号を加えた値
 *5) /dev/<disk_name>p<decimal> - 上記と同じ形式
 * パーティションディスクのディスク名が数字で終わる場合に使用します。
 *6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF は以下を示します。
 *パーティションの一意のID(パーティション表によって提供された場合)。
 * UUIDはEFI / GPT UUIDまたはMSDOSです。
 *分割にSSSSSSSSが0のSSSSSSSS-PP形式を使用します。
 * 32ビット「NTディスク署名」およびPPのパディングされた16進表現
 *は、1から始まるパーティション番号を0で埋めた16進表現です。
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> 以下に関連するパーティションを選択します。
 *既知の一意のIDを持つパーティション。
 *
 * 名前が上記カテゴリに属していない場合(0,0)を返します。
 * block_class はディスク名であることを確認するために使用されます。ディスクの場合
 * 名前にスラッシュが含まれており、デバイス名はスラッシュに置き換えられました。
 *前髪。
 */

最後のビットは、値が理解できない場合に返されるため、(0,0)エラーが発生することを意味します。

答え3

5年前の投稿ですね。しかし、IMHOはまだ完全に答えられていません。小さな例がありません。ここにいる:

この例では、次のようになります。

/dev/sda3 = /
/dev/sda2 = swap

...GPTパーティションを使用してください。 MBR(dosパーティション)の場合、PARTUUIDは短いですが、プロセスは同じです。

PARTUUIDを取得するにはblkidを使用します。

blkid -s PARTUUID -o value /dev/sda3 # root
77fd7830-faa2-4e99-a48b-337ad9eded28
blkid -s PARTUUID -o value /dev/sda2 # swap
5b63167a-6fd2-4e72-948c-90832372956c

/boot/grub/grub.cfg:

search --no-floppy --part-uuid --set=root 77fd7830-faa2-4e99-a48b-337ad9eded28

menuentry "GNU/Linux, KERNEL 4.12.7-lfs-8.1" {
  linux /boot/vmlinuz-4.12.7-lfs-8.1 root=PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 net.ifnames=0 ipv6.disable=1 ro rootwait rootfstype=ext4
}

/etc/fstab/:

PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 / ext4 noatime,nodiratime,errors=remount-ro 0 1
PARTUUID=5b63167a-6fd2-4e72-948c-90832372956c swap swap pri=1 0 0

これはlfs8.1(カーネル4.12.7)で動作することが知られていますが、他のほとんどのカーネルでも動作する必要があると思います(以前と最新...)。

関連情報