web-dev-qa-db-ja.com

ルートfsをUUIDで指定できないのはなぜですか?

私のシステムはこれで問題なく起動しますGRUB 2 config:

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です。 sdaでMBRパーティションテーブルを使用し、sdbでGUIDパーティションテーブルを使用しています。

30
cjm

明確にするために、UUIDsは、カーネルがハードドライブを識別する唯一の信頼できる方法です。 2つのタイプがあります。ファイルシステムに保存され、ブート時にカーネルで利用できないUUIDと、パーティションテーブルに保存されるPARTUUIDとISブート時に利用可能です。 。したがって、使用する必要があります

root=PARTUUID=SSSSSSSS-PP

/dev/sd??は、デバイスが接続/接続解除されると変わる可能性があるためです。

大文字 16進数SSSSSSSS-PPを忘れないでくださいblkidから取得します!

より使いやすい

root=LABEL=
root=UUID=

これらの識別子を取得するinitramfsでのみ機能します。

したがって、空でないinitramfsを使用すると、3つすべてを使用できます!空のinitramfsを使用すると、PARTUUIDのみが存在します。

22
ineiti

UUIDから起動するために渡す必要があるパラメーターはPARTUUIDです。したがって、それは_root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e_である必要があります。

ドキュメントは、なぜunknown-block(0,0)で戻ってくるのかを説明しています:

kernel-parameters.txt

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

init/do_mounts.c

/* 
 *名前をデバイス番号に変換します。 
 * 
 * 1)16進数のデバイス番号はそれ自体を表します
 * 2)/ dev/nfsはRoot_NFS(0xff)
 * 3を表します)/ dev/<disk_name>はディスクのデバイス番号を表します
 * 4)/ dev/<disk_name> <decimal>はパーティションのデバイス番号を表します
 *ディスクのデバイス番号+パーティションnumber 
 * 5)/ dev/<disk_name> p <decimal>-上記と同じ、その形式は
 *パーティションディスクのディスク名が数字で終わる場合に使用されます。
 * 6)PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFFは、
 *を表すパーティションの一意のIDです。
 * UUIDは、EFI/GPTのいずれかです。 UUID、またはMSDOS 
 * SSSSSSSS-PPの形式を使用するパーティションを参照してください。SSSSSSSSはゼロ
です。* 32ビットの「NTディスクシグネチャ」の16進表記、およびPP 
 *は、1から始まるパーティション番号を0で埋められた16進表記です。
 * 7)PARTUUID = <UUID>/PARTNROFF = <int>は、
 *既知の一意のIDを持つパーティションを選択するためのパーティションを選択します。
 * 
 *名前が異なる場合上記のカテゴリに該当する場合、(0,0)を返します。ディスク
 *の名前にスラッシュが含まれている場合、デバイス名のスラッシュは
 * bangs。
 */
に置き換えられます。

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

16
Patrick

これは5年前のスレッドです。しかし、それでもまだ完全に答えられていません。少し足りない例があります。ここにあります:

この例では:

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

... GPTパーティションを使用します。 MBR(DOSパーティション)では、PARTUUIDは短くなりますが、手順は同じです...

blkidでPARTUUIDを取得します。

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)で動作することが知られていますが、他のほとんどのカーネル(古いものと新しいもの...)でも動作するはずです。