我刚刚从 lilo 切换到 grub2,我的第一次尝试失败了kernel panic - not syncing vfs unable to mount root fs on unknown block(0 0)
。事实证明,问题在于根分区是根据 UUID 而不是设备名称指定的。解决方案是取消GRUB_DISABLE_LINUX_UUID=true
注释/etc/default/grub
。
原始自动生成/boot/grub/grub.conf
包含一些 UUID 条目和一些 /dev 条目。
- update-grub 如何在 UUID 和 /dev rootfs 之间进行选择,即为什么有时是 UUID,有时不是?
- 是什么让 UUID 无法工作?我没有找到可能设置错误的内核参数(内核3.8.2)
- 当 grub 使用 UUID 时,我的 fstab 中是否需要 UUID?
答案1
的值由目录中的脚本GRUB_DISABLE_LINUX_UUID
使用。如果您仍然在其中获得 UUID,则看起来其中一个脚本没有检查该设置。update-grub
/etc/grub.d/
grub.conf
GRUB_DISABLE_LINUX_UUID
最好的办法是尝试找出文件系统类型是什么,并根据脚本名称进行检查,/etc/grub.d
看看是否存在某种模式。
至于为什么 UUID 不起作用,我没有明确的答案,我怀疑这取决于文件系统类型,但这是一个疯狂的猜测。
即使 grub 使用 UUID,您的 fstab 中也不需要它们,但这当然是一种可能的方法来查看您是否首先使用了正确的 UUID(但我宁愿查看/dev/disk/by-uuid
这一点)。
答案2
如果有人偶然发现这篇文章并且正在使用 Centos 7 / GRUB2(就像我一样),则变量名称似乎已更改为 GRUB_DISABLE_UUID(而不是 GRUB_DISABLE**_LINUX**_UUID)。
您可以在 /usr/share/grub/grub-mkconfig_lib 中检查您的。我的有这个:
if [ "x$GRUB_DISABLE_UUID" != "xtrue" ]
在 grub2-mkconfig 之后,UUID 被替换为 /dev/sda1 等(我们需要它,因为我们克隆了这些系统)。
2023 年 3 月更新 在 @MelroyvandenBerg 后续评论的提示下,我快速浏览了一下我 2016 年的答案是否仍然相关。
我们在 2019 年放弃了 Centos(请参阅其他地方的 Centos Stream 讨论),但我启动了一台仍在运行 CentOS Linux 版本 7.2.1511 的旧机器。我再次确认了上面的结果:
$ grep GRUB_DISABLE /usr/share/grub/grub-mkconfig_lib
if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"${grub_probe}" --device $@ --target=fs_uuid 2> /dev/null`" ; then
if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"${grub_probe}" --device ${device} --target=fs_uuid 2> /dev/null`" ; then
进一步研究一下(仍然在 Centos 7 系统上),/usr/share/doc/grub2-tools-2.02/grub.html
包含以下内容(添加强调以显示差异)
GRUB_DISABLE_操作系统_UUID
通常,grub2-mkconfig 将生成使用通用唯一标识符 (UUID) 来标识的菜单项根文件系统到Linux内核,使用'root=UUID=...' 内核参数。这通常更可靠,但在某些情况下可能不合适。要禁用 UUID 的使用,请将此选项设置为“true”。
GRUB_DISABLE_UUID
通常,grub2-mkconfig 将生成使用通用唯一标识符 (UUID) 来标识的菜单项各种各样的文件系统来搜索文件。这通常更可靠,但在某些情况下可能不合适。要禁用 UUID 的这种使用,请将此选项设置为“true”。
所以看起来GRUB_DISABLE_LINUX_UUID
和之间确实存在特定的区别GRUB_DISABLE_UUID
跳过 7 年,看看 Ubuntu 22.04.1 LTS(更新,尽管基于 Debian),我确实在/usr/sbin/grub-mkconfig
if [ "x${GRUB_DISABLE_UUID}" = "xtrue" ]; then
if [ -z "${GRUB_DISABLE_LINUX_UUID}" ]; then
GRUB_DISABLE_LINUX_UUID="true"
fi
if [ -z "${GRUB_DISABLE_LINUX_PARTUUID}" ]; then
GRUB_DISABLE_LINUX_PARTUUID="true"
fi
fi
如果为 true ,这将导致 (unset)GRUB_DISABLE_LINUX_UUID
设置为 true GRUB_DISABLE_UUID
。我只能猜测在过去 7 年的某个时候,有人一直在努力澄清和/或消除这两个变量之间的区别。
我鼓励您检查特定发行版的代码和文档,而不是我最初的 2016 年评论。