在网上找到的一些例子说 update-grub 应该在 grub-install 之后运行。其他人则颠倒顺序。哪个是正确的?
如果我有两个 Linux 安装(一个在 sda 上,一个在 sdb 上),如果我在 sda 安装上运行 update-grub,它会将 sda 安装放在启动菜单的顶部。如果我在 sdb 安装上运行 update-grub,它会将 sdb 安装放在菜单的顶部。
假设 DEFAULT=0,理论上这应该允许我通过在 BIOS 中选择引导设备来选择我的操作系统。“grub-install /dev/sda”是否将 sda 启动菜单更改为对应于最后一个“update-grub”,无论它是从 sda 还是 sdb 版本的 Linux 运行?
update-grub
,至少在 Debian 及其亲属如 Ubuntu 中,基本上只是grub-mkconfig
. 所以它创建/更新/重新生成 GRUB配置,而不是实际的引导加载程序本身。
grub-install
实际做什么取决于您运行的是哪个版本的 GRUB:传统 BIOS GRUB 还是 UEFI GRUB?
使用传统的 BIOS GRUB,grub-install
将(重新)写入嵌入在主引导记录中的 GRUB 部分,并将物理磁盘块编号编码到其中以读取 GRUB 的下一部分。它还将确定将从哪个分区/boot/grub/grub.cfg
读取实际的 GRUB 配置文件 ( )。这里的一个重要因素是/boot/grub/device.map
文件,它告诉 GRUB BIOS(以及 GRUB)的设备编号如何映射到 Linux 磁盘设备。
使用 UEFI GRUB,GRUB 引导加载程序的主要部分将作为文件位于 EFI 系统分区中,通常是这样/boot/efi/EFI/<name of distribution>/grubx64.efi
或类似的。此引导加载程序路径名存储在 UEFI 引导变量中的系统 NVRAM(= 存储 BIOS 设置的位置)中。GRUB 的主要部分可能是完全独立的(如果使用安全启动,则必须如此!)或者它可能会加载附加功能作为 GRUB 模块,通常从/boot/grub
它所属的 Linux 发行版的目录中加载。
UEFI 引导变量将标识系统应该用于查找 EFI 系统分区和其中的引导加载程序文件的磁盘。您可以使用efibootmgr -v
命令自己查看这些变量。该grub-install
命令将更新这些变量,除非您使用该--no-nvram
选项另行指定。
因此,对于传统的 BIOS 和 UEFI,运行grub-install
可以更新引导加载程序以读取完全不同的磁盘上完全不同的 GRUB 配置文件 - 尽管该过程的细节将完全不同。
使用 UEFI,您实际上可以从操作系统中更改引导设备选择,使用efibootmgr
或grub-install
. 但这grub-install
是一个巨大的矫枉过正:如果你的两个安装都是 UEFI 并且有自己独立的 ESP 分区,他们将有自己的 UEFI 引导变量,并且可以很容易地在它们之间进行选择efibootmgr
,或者实际上在 UEFI BIOS 设置中完成。
对于传统的 BIOS,它有点混乱:您需要确保每个安装的/boot/grub/device.map
标识该特定安装的磁盘为hd0
,而另一个标识为hd1
. 然后使用grub-install
只将引导加载程序写入每个安装自己的磁盘;永远不要到“相反”的磁盘。这样,即使另一个磁盘被完全移除,两个磁盘也将完全独立且可引导。如果需要,您可以在每个 GRUB 的配置文件上添加一个菜单项,以允许您引导“相反的”安装。或者,您可以仅使用 BIOS 选择要启动的磁盘。
您必须知道的是,传统 BIOS 的引导顺序选择器通常会通过将选择用于引导的磁盘作为 BIOS 功能的“第一”磁盘来工作,因此 GRUBhd0
将始终指代“当前在 BIOS 中选择用于引导的磁盘” ”。
因此,如果您当前正在从/dev/sda
(所以 BIOS 说sda
是hd0
)启动,并且您希望该磁盘上的 GRUB 菜单项切换到/dev/sdb
的启动菜单,则可以使用以下内容:
menuentry "Switch to /dev/sdb"
{
# flip the disk mappings and reload configuration
drivemap -s (hd0) (hd1)
set root=<the identifier for sdb's partition that contains grub.cfg>
configfile /boot/grub/grub.cfg # or just /grub/grub.cfg is /boot is a separate partition
}
Run Code Online (Sandbox Code Playgroud)
... 以及 /dev/sdb 的 GRUB 配置也是如此。
归档时间: |
|
查看次数: |
13602 次 |
最近记录: |