应该如何配置 grub 双引导?

应该如何配置 grub 双引导?

我已经看过一些说明,但我真的很想了解整个启动过程。我在一个驱动器上安装了 debian,其中一个分区用于操作系统,另一个分区用于用户。它还自动创建引导和交换分区。然后,我使用 gparted 创建了一个克隆原始 debian 分区的新分区。我给了它一个新的 UUID。我更新了组选项。

当我启动时,我进入 grub 选项,并看到两个版本的操作系统。我专门选择了新分区上的操作系统。但是当它启动并且我检查终端时,我看到 / 是从而/dev/nvme0n1p2不是安装的/dev/nvme0n1p5

这就是我感到困惑的地方: /dev/nvme0n1p1安装到/boot/efi其中/boot/efi/EFI/debian/grub.cfg有一个配置文件:

search.fs_uuid FIRST-DRIVE-UUID root 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

这对我来说基本上意味着它将安装第一个安装,然后从第一个安装加载 grub.cfg。现在它已经以 root 身份安装了第一个安装,但要运行第二个安装,显然需要以 root 身份安装第二个驱动器。所以看起来它是从第一次安装中加载 grub,而不是在安装第一次安装之前加载 grub?

有一个 grub 配置文件引用两个安装/boot/grub/grub.cfg,但这是第一个安装分区的一部分。似乎一旦读取了该文件,第一个安装就已经加载了,现在选择从哪个分区启动已经为时已晚。该文件开头为

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub

此配置是否需要以某种方式移动到启动分区?

当我运行 update-grub 或 grub-mkconfig (v2.04-20) 时,我得到以下输出:

$ sudo grub-mkconfig -o grub.cfg 
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.10.0-9-amd64
Found initrd image: /boot/initrd.img-5.10.0-9-amd64
Found linux image: /boot/vmlinuz-5.10.0-8-amd64
Found initrd image: /boot/initrd.img-5.10.0-8-amd64
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p5
Adding boot menu entry for EFI firmware configuration
done

这似乎在第一次安装时引用了 initrd 和 vmlinuz。第二次安装就得到了found

答案1

“挂载文件系统”是一个 Linux/Unix 概念:它并不真正存在于 GRUB 中。

为 GRUB指定$prefix$root并不像在 Linux/Unix 中挂载文件系统那样。它们实际上只是分别相对或绝对路径名的前缀。

$prefix当 GRUB 加载任何 GRUB 模块时使用,它也可以用作一个方便的变量,/boot/grub通过绝对 GRUB 路径名引用目录中的任何文件(操作系统启动后最终会出现的文件)。使用GRUBinsmod命令时,它采用 的值$prefix,并添加特定于体系结构的目录名称和要加载的模块的名称(添加后缀.mod)。

GRUB 有自己的(只读)文件系统驱动程序,该驱动程序接受格式为“(分区)/目录.../文件名”的绝对路径名,其中分区组件可以类似于hd0,gpt1.

$root可以在单个 GRUB 配置文件中多次分配和重新分配;在现代配置中,search通常使用该命令而不是显式分配,以允许通过其 UUID 指定文件系统。

在 Debian 9 系统(使用 BIOS 式引导)上,我曾经看到一个 GRUB 配置,它最初设置$root$prefix加载一些 GRUB 模块,然后指向$root一个单独的/usr分区,以便从 GRUB 主题目录加载背景图像和字体文件某处/usr/share/....对于实际的引导选项,它然后指向$root文件/boot系统以加载实际内核,或指向 Windows 分区以链式加载其分区引导记录。

GRUB$root与 Linux 根文件系统无关。一旦 GRUB 将 Linux 内核和 initramfs 文件加载到 RAM 中,它将把控制权移交给内核。此时,GRUB 中仅保留三项内容:

  • RAM 中的内核
  • 内核之后 RAM 中的 initramfs
  • 在内核命令行上指定的引导选项。

所有 GRUB 变量(包括$root$prefix)此时都被完全遗忘并且不再具有任何意义。当内核启动时,它将激活自己的存储设备驱动程序,并且将作为 Linux 根文件系统挂载的文件系统由以下因素确定:

  • 内核root=引导选项(如果指定了),或者
  • initramfs 文件的内容(它可能包括/etc/fstab指定根文件系统的副本,或确定以其他方式使用的文件系统的脚本),或者
  • 默认根文件系统可以通过内核映像中内置的参数来指定(特别是如果使用不带 initramfs 的自定义内核)。

UEFI 版本的 GRUB 通常会寻找grub.cfg grubx64.efi在位于同一目录中。该 Debian 实例的三行grub.cfg´ you found in/boot/efi/EFI/debian/grub.cfg effectively tells GRUB where the actual GRUB configuration file (and the/boot/grub directory) is, by filesystem UUID. If you wanted, you could replace the UUID with the UUID of the/dev/nvme0n1p5 filesystem, to make GRUB use the/boot` 而不是第一次安装。


如果您os-prober在 Debian 中安装了该软件包,那么只要您运行 ,它就会自动运行update-grub,并尝试自动检测其他操作系统,包括 Debian 的并行安装,并将其主要引导选项添加到 GRUB 配置文件中。

您还可以将这样的菜单项添加到您的/etc/grub.d/40_customon nvme0n1p2

menuentry 'Switch to GRUB configuration of /dev/nvme0n1p5' {
        search --no-floppy --fs-uuid --set=root UUID-OF-nvme0n1p5-FS-HERE
        configfile /boot/grub/grub.cfg
}

并类似地/etc/grub.d/40_custom切换nvme0n1p5回 GRUB 配置nvme0n1p2。请记住运行update-grub以使更改生效。

然后您可以根据您希望 GRUB 默认使用的配置来设置(即在)search.fs_uuid中的行。只要 Debian 的两个实例继续使用足够相似的 GRUB 版本来接受相同的配置文件,您就可以轻松地在两个操作系统实例之间切换,并且它们都能够独立维护自己的 GRUB 配置文件。彼此。/boot/efi/EFI/debian/grub.cfgnvme0n1p1

相关内容