我看过一些说明,但我真的很想了解整个启动过程。我在一个驱动器上安装了 debian,该驱动器有一个操作系统分区和另一个用户分区。它还自动创建引导和交换分区。然后,使用 gparted,我创建了一个克隆原始 debian 分区的新分区。我给了它一个新的 UUID。我更新了 grup 选项。
当我启动时,我进入 grub 选项,我看到两个版本的 os. 我专门选择了新分区上的操作系统。但是当它启动并且我检查终端时,我看到 / 是从而/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
。
“挂载文件系统”是一个 Linux/Unix 概念:它在 GRUB 中并不存在。
为 GRUB指定
$prefix
or$root
并不像在 Linux/Unix 中挂载文件系统。它们分别只是相对或绝对路径名的前缀。$prefix
/boot/grub
当 GRUB 加载任何 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 中只有三样东西会被保留:所有的 GRUB 变量,包括
$root
和$prefix
,此时都被完全遗忘,不再具有任何意义。当内核启动时,它会激活自己的存储设备驱动程序,将作为 Linux 根文件系统挂载的文件系统由以下因素决定:root=
内核引导选项,如果指定了,或者/etc/fstab
指定根文件系统的副本,或确定要以其他方式使用的文件系统的脚本),或UEFI 版本的 GRUB 通常会
grub.cfg
在grubx64.efi
. 该Debian 实例的grub.cfg´ you found in
三行 /boot/efi/EFI/debian/grub.cfgeffectively tells GRUB where the actual GRUB configuration file (and the
/boot/grubdirectory) is, by filesystem UUID. If you wanted, you could replace the UUID with the UUID of the
/dev/nvme0n1p5filesystem, to make GRUB use the
/boot` 而不是第一次安装。如果您
os-prober
在 Debian 中安装了该软件包,它将在您运行时自动运行update-grub
,并尝试自动检测其他操作系统,包括 Debian 的并行安装,并将它们的主要引导选项添加到 GRUB 配置文件中。您还可以将这样的菜单项添加到您的
/etc/grub.d/40_custom
onnvme0n1p2
:并类似地
/etc/grub.d/40_custom
切换nvme0n1p5
回nvme0n1p2
. 请记住运行update-grub
以使更改生效。然后您可以根据您希望 GRUB 默认使用的配置来设置
search.fs_uuid
行 in/boot/efi/EFI/debian/grub.cfg
(即 in )。nvme0n1p1
只要 Debian 的两个实例继续使用足够相似的 GRUB 版本来接受相同的配置文件,您就可以轻松地在两个操作系统实例之间切换,并且它们都可以独立维护自己的 GRUB 配置文件彼此。