我已经看过一些说明,但我真的很想了解整个启动过程。我在一个驱动器上安装了 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_custom
on 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.cfg
nvme0n1p1