我的系统在 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 吗?
这是 x86_64 Gentoo Linux,内核为 3.10.7。我在 上使用 MBR 分区表sda
,在 上使用 GUID 分区表sdb
。
答案1
只是为了澄清UUID
s 是内核识别硬盘驱动器的唯一可靠方法。有两种类型:UUID,存储在文件系统中,在启动时内核不可用;PARTUUID,存储在分区表中,启动时可用。所以你必须使用
root=PARTUUID=SSSSSSSS-PP
可能/dev/sd??
会随着设备的插入/拔出而改变。
别忘了大写SSSSSSSS-PP
您从中获得的十六进制数blkid
!
越容易使用
root=LABEL=
root=UUID=
仅适用于initramfs
获取这些标识符的 。
因此,如果您使用非空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) 设备号以十六进制表示其本身 * 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-PP 格式进行分区,其中 SSSSSSSS 是零 * 32位“NT磁盘签名”的填充十六进制表示,以及PP * 是从 1 开始的分区号的零填充十六进制表示。 * 7) PARTUUID=<UUID>/PARTNROFF=<int> 选择与以下相关的分区 * 具有已知唯一 ID 的分区。 * * 如果名称不属于上述类别,我们返回(0,0)。 * block_class 用于检查某物是否是磁盘名称。如果磁盘 * 名称包含斜杠,设备名称已将其替换为 *刘海。 */
末尾的最后一位表示,如果它无法理解该值,它将返回(0,0)
,因此会出现错误。
答案3
这是一个 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)一起使用,但我认为它也应该与大多数其他内核一起使用(较旧的和较新的......)