grub(2) 如何能够硬编码 root=

grub(2) 如何能够硬编码 root=

我刚刚在 Debian 系统(SID)上启动时遇到了一系列问题,突然它报告:

/grub/i386-pc/normal.mod not found.

最终我把它找回来了(fsck 将很多东西从 /boot 移到了lost+found 中,我需要通过 grub-install 进行替换)

但在一切正常后,我重新安装了各种 grub-* 软件包(以防它们现在处于丢失+找到状态)。我注意到 grub.cfg 有许多不同之处,其形式如下:

<               set root='hd2,msdos1'                                                                                                                                                                
---                                                                                                                                                                                                  
>               set root='hd0,msdos1'                                                                                                                                                                
  

                        

事实上,我的 /boot (和 /(root))设备现在是 /dev/sdc (hd2) 而不是 /dev/sda (hd0)。一方面我不明白它是如何/为什么改变的,但另一方面我意识到 /dev/sdX 名称不是固定的,并且可以从一个启动更改为下一个启动。因此,考虑到这一切,我的问题是:

grub.cfg 如何包含以下条目:

set root='hd2,msdos1'

因为(没有映射文件)这相当于 /dev/sdc ...如果在下次启动时该磁盘显示为 sdb 或 sda 该怎么办?

ABTW。最初的原因可能是 /boot 损坏...我注意到它是 ext2 ,我不能使用 ext4 吗? ...这不是现在的默认设置吗? [ 漏洞985470 ]

答案1

它应该看起来像

    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1'  f19c92f4-9ead-4207-b46a-723b7a2c51c8
    else
      search --no-floppy --fs-uuid --set=root f19c92f4-9ead-4207-b46a-723b7a2c51c8
    fi

所以初始值只是一个可选的提示。它真正做的是搜索文件系统 UUID。

答案2

这是grub-probehttps://www.gnu.org/software/grub/manual/grub/html_node/Invoking-grub_002dprobe.html) 将/dev/sda1名称转换为(hd0,msdos1).

但如果转换失败,您可以使用设备映射文件来帮助它(https://www.gnu.org/software/grub/manual/grub/html_node/Device-map.html#Device-map)。

您可以输入Grub 命名方案grub-probe -t drive /来获取驱动器。/

相关内容