为什么我需要 GRUB_DISABLE_LINUX_UUID=true

为什么我需要 GRUB_DISABLE_LINUX_UUID=true

我刚刚从 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.confGRUB_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 年评论。

相关内容