私のシステムはこれで問題なく起動します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パーティションテーブルを使用しています。
明確にするために、UUID
sは、カーネルがハードドライブを識別する唯一の信頼できる方法です。 2つのタイプがあります。ファイルシステムに保存され、ブート時にカーネルで利用できないUUIDと、パーティションテーブルに保存されるPARTUUIDとISブート時に利用可能です。 。したがって、使用する必要があります
root=PARTUUID=SSSSSSSS-PP
/dev/sd??
は、デバイスが接続/接続解除されると変わる可能性があるためです。
大文字 16進数SSSSSSSS-PP
を忘れないでくださいblkid
から取得します!
より使いやすい
root=LABEL=
root=UUID=
これらの識別子を取得するinitramfs
でのみ機能します。
したがって、空でないinitramfs
を使用すると、3つすべてを使用できます!空のinitramfs
を使用すると、PARTUUID
のみが存在します。
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)
_を返すため、エラーが発生することを示しています。
これは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)で動作することが知られていますが、他のほとんどのカーネル(古いものと新しいもの...)でも動作するはずです。