在系统中X分区相同的 HDD,每个驱动器都有一个 UEFI 启动分区,并设置了可启动标志。开机时,我能够使用 UEFI 选择任何 HDD 进行启动。
一旦 Ubuntu 启动了。我如何确定系统是从哪个硬盘启动的?
错误答案是:包含安装在 的分区的那个/boot/efi
。这是不正确的,因为那是在安装 Ubuntu 时写入的/etc/fstab
。它不是动态的,并且不指向我实际用于启动的 UEFI 分区。
答案1
我还没有通过实验测试过这一点,所以在实践中它可能不起作用,但该efibootmgr
实用程序确实返回了一个名为的变量,BootCurrent
该变量应该可以识别 EFI 启动的引导加载程序。例如:
$ sudo efibootmgr -v
BootCurrent: 0001
Timeout: 3 seconds
BootOrder: 0000,0001
Boot0000* EFI DVD/CDROM ACPI(a0841d0,0)PCI(14,1)ATAPI(0,1,0)
Boot0001* OsLoader0000 ACPI(a0841d0,0)PCI(11,0)03120a00000000000000HD(1,800,5ede2,2c47c282-ee6e-45de-a5ad-e8658ca67de6)File(\EFI\BOOT\BOOTX64.EFI)
此输出表明系统是通过条目 0001 引导的(Boot0001
)。此处使用的-v
选项efibootmgr
添加详细信息,其中包括存储此引导加载程序的分区的 GUID——在本例中为 2c47c282-ee6e-45de-a5ad-e8658ca67de6。请注意,这是一个分区 GUID,不是文件系统 UUID据我所知,在 Linux 中提取分区 GUID 数据的唯一方法是通过gdisk
、cgdisk
或sgdisk
。例如:
$ sudo sgdisk -i 1 /dev/sda
Partition GUID code: C12A7328-F81F-11D2-BA4B-00A0C93EC93B (EFI System)
Partition unique GUID: 2C47C282-EE6E-45DE-A5AD-E8658CA67DE6
First sector: 2048 (at 1024.0 KiB)
Last sector: 390625 (at 190.7 MiB)
Partition size: 388578 sectors (189.7 MiB)
Attribute flags: 0000000000000000
Partition name: 'EFI System'
请注意Partition unique GUID
,该行与输出中包含的值相匹配efibootmgr
(大小写除外,大小写会有所不同)。sgdisk
在本例中,输入为 ,这意味着 上的分区 1 /dev/sda
(即/dev/sda1
)保存了系统的第一个引导程序。您可能需要扫描所有分区,或者至少扫描所有可能存在 EFI 引导加载程序的分区,以确保找到匹配项。即便如此,您可能也找不到匹配项——例如,如果引导加载程序位于已从计算机中移除的 USB 闪存驱动器上,或者您更改了分区的 GUID。
根据我对我所处系统的检查,输出似乎efibootmgr -v
报告了 EFI 启动的引导加载程序。这可能与启动 Linux 的程序不同,因为 EFI 启动的程序可能是引导管理器,而引导管理器又启动了另一个引导加载程序。如果您的系统的引导过程很简单,这可能无关紧要;但如果您的引导过程包括跨磁盘重定向的可能性,则此技术将不可靠。
答案2
Ubuntu 启动后,如果 grub-efi 已安装在多个磁盘上,我认为您不能这样做。(这与 Legacy/mbr 启动存在同样的问题,据我所知,如果 grub 安装在多个 MBR 中,则无法确定 PC 从哪个 mbr 启动)