如何使用 grub2 配置新磁盘以进行 UEFI 启动

如何使用 grub2 配置新磁盘以进行 UEFI 启动

我使用的是华硕 N53J,目前使用的是 MBR 启动。我在 BIOS 中启用了 UEFI 启动,似乎可以启动已配置 gpt 表的 USB 驱动器。不过我还没搞清楚如何在 USB 驱动器上使用专用的 EFI 启动分区。

另外,我通过外部 SATA 连接将第二个硬盘连接到笔记本电脑,创建了 gpt 分区表、特别是启动分区以及文件系统和交换分区。

当我grub-mkconfig在内部硬盘上运行时,它会在外部硬盘上找到新的 Linux 映像。我可以启动到该外部映像并确认 esp 启动分区已挂载在/boot/efi,因此看来我应该能够配置 grub2。但是,如果我grub-mkconfig在从外部驱动器执行时运行,则找不到其自己的映像,只能找到内部驱动器上的 Linux 和 Windows 映像。

我也无法efibootmgr运行。我读过的教程要么没有明确说明如何操作和为什么操作,所以我只能自己排除故障,要么使用我认为它们正在使用的软件包中找不到的命令。在将磁盘安装为主启动盘之前,有人能指点如何配置磁盘吗?

谢谢。

更新 2015-12-30 我已经制作了一个至少可以启动 grub 救援的 USB 驱动器。我不知道为什么 grub 无法从这个驱动器运行,但它至少允许我手动启动到我的目标操作系统。因为我现在已经通过 UEFI 启动了efibootmgr

我针对安装在 的 esp 分区执行了新的 grub-install /boot/efi。此操作完成且没有错误。但是,当我选择用于引导的目标系统时,固件加载程序会停留在空白屏幕上。无论磁盘是通过 ESATA 连接还是已移至机器中的主磁盘,都会发生这种情况。

的输出efibootmgr -v是:

BootCurrent: 0003
Timeout: 2 seconds
BootOrder: 0005,0002,0003,0004,0000,0001
Boot0000  Hard Drive    BBS(HD,,0x0)
Boot0001  CD/DVD Drive  BBS(CDROM,,0x0)P1: Slimtype BD  E  DS4E1S    .
Boot0002* ubuntu 15.10  HD(1,GPT,8b6800c2-0b24-4f00-aa66-b1378052604e,0x800,0xfa000)/File(\bootx64.efi)
Boot0003* grub  HD(2,GPT,b07e72fd-9168-4924-a17c-b75e55ed685c,0x800,0xfa000)/File(\Shellx64.efi)
Boot0004* UEFI: SanDisk Cruzer Micro 1.26   PciRoot(0x0)/Pci(0x1d,0x0)/USB(1,0)/USB(2,0)/HD(2,GPT,b07e72fd-9168-4924-a17c-b75e55ed685c,0x800,0xfa000)
Boot0005* ubuntu15.10   HD(1,GPT,8b6800c2-0b24-4f00-aa66-b1378052604e,0x800,0xfa000)/File(\EFI\ubuntu15.10\grubx64.efi)

期望的目标是Boot0005。 是一个复制到 的Boot0002实验。和的行为相似。grubx64.efi/boot/efi/bootx64.efiBoot0002Boot0005

Boot0003(grub)是 USB 驱动器,也是唯一的启动方式,尽管它仅在 grub 救援中启动。

有什么想法我应该探索或哪些其他信息可以帮助诊断?

更多进展:

grub rescue> set  
prefix=(hd0,2)/boot/grub  ... This is the fat32-formatted esp boot partition  

grub rescue>ls (hd0,2)/  
unknown filesystem      ... or similar words to that effect

grub rescue>set prefix=(hd0,1)/boot/grub  ... ext4-formatted partition
grub rescue> insmod fat
grub rescue>ls (hd0,2)/
                    .... the directory is now read

将根设置为目标启动系统,将前缀设置为该目标系统的 /boot/grub 目录,我可以insmod linux搜索配置文件并正常搜索。如果正常不启动启动选项页面,则将执行以下操作:

grub rescue>configfile /boot/grub/grub.cfg

我最终可以让目标从菜单启动。

我的概要是,grubx64.efiUSB 驱动器上没有配置正在使用的启动方法所需的模块。

当通过 efi 启动到我的目标文件系统时,我创建了一个新的 USB 驱动器,也带有一个 gpt 分区表,这次以 esp 启动作为分区 1。我提到这一点只是为了协助阅读后面介绍的 bios 启动表。

将 USB 分区 2 安装到适当的节点:

mkdir -p /boot/efi

将(USB 分区 1)挂载到(USB 分区 2)/boot/efi

grub-install --target=x86_64-efi --efi-directory=(USB partition 2)/boot/efi --removable

生成EFI/BOOT/BOOTx64.EFI。BIOS 启动表中的 UEFI:Sandisk 条目是通过此加载程序进行启动的手段

grub-install --target=x86_64-efi --efi-directory=(USB partition2)/boot/efi --bootloader-id=USBboot

生成EFI/USBboot/grubx64.efi。USBboot 条目也写入 bios 启动表中

cmp -v BOOT/BOOTx64.EFI USBboot/grubx64.efi两种启动选项均无差异,
现在直接启动到目标文件系统,而不显示任何 grub 启动菜单。由于 USB 驱动器没有目录/boot/grubgrub.cfggrubx64.exe必须配置为在目标上而不是 USB 上搜索此目录。

$ efibootmgr -v
BootOrder: 0007,0004,0005,0002,0003,0008,0000,0001
Boot0000  Hard Drive    BBS(HD,,0x0)
Boot0001  CD/DVD Drive  BBS(CDROM,,0x0)P1: Slimtype BD  E  DS4E1S    .
Boot0002* ubuntu 15.10  HD(1,GPT,8b6800c2-0b24-4f00-aa66-b1378052604e,0x800,0xfa000)/File(\bootx64.efi)
Boot0003* grub  HD(2,GPT,b07e72fd-9168-4924-a17c-b75e55ed685c,0x800,0xfa000)/File(\Shellx64.efi)
Boot0004* ubuntu_15_10  HD(1,GPT,8b6800c2-0b24-4f00-aa66-b1378052604e,0x800,0xfa000)/File(\EFI\ubuntu_15_10\grubx64.efi)
Boot0005* ubuntu15.10   HD(1,GPT,8b6800c2-0b24-4f00-aa66-b1378052604e,0x800,0xfa000)/File(\EFI\ubuntu15.10\grubx64.efi)
Boot0007* USBboot   HD(1,GPT,f887bf87-18a9-40e1-9bca-6c4bfd1cbb4a,0x800,0xc8000)/File(\EFI\USBboot\grubx64.efi)
Boot0008* UEFI: SanDisk PciRoot(0x0)/Pci(0x1d,0x0)/USB(1,0)/USB(4,0)/HD(1,GPT,f887bf87-18a9-40e1-9bca-6c4bfd1cbb4a,0x800,0xc8000)

我还没搞清楚如何在不从外部 USB 驱动器启动的情况下进行 grub 救援。似乎我有两个问题:

  1. 我不完全了解如何配置 grub 以满足其预期用途,如何确保内置了必要的模块以及正确设置了前缀。
  2. 我没有正确配置华硕 N53J 上的 BIOS,或者它不接受硬盘配置作为有效的启动配置。

还有其他想法吗?我现在觉得这篇文章太长了。我该如何记录这篇文章,让它更易读?

状态更新

在网上浏览时我发现了grub-mkimage。我还没有开始研究这个问题,一旦我研究完了,并能理解结果或提出新的问题,我就会报告进展情况。

答案1

在尝试了其他硬盘后,我确定我的问题似乎与原始硬盘上的 esp、boot 分区有关。当我最初创建 esp、boot 分区时,我接受了 gparted 建议的 1 MB 默认偏移量。通过探索为什么我可以从 USB 驱动器和通过 ESATA 连接的另一个硬盘驱动器启动,成功媒体的共同属性是 esp、boot 分区位于驱动器上的第一个,偏移量为 0。

我尝试移动 esp、boot 分区,但没有成功。但是,我没有检查以确保 UUID 和 PARTUUID 没有被修改,所以我不知道这次失败是因为移动时没有配置磁盘,BIOS 无法弄清楚如何读取它,还是因为我没有重新配置 grub 而失败。

无论如何,我学会了如何:正确地将文件系统移动到新硬盘上;从头开始配置问题硬盘。将文件系统移回原位,修改/etc/fstab以反映已安装分区的新 UUID。esp、boot 分区在其根目录中有 Shellx64.efi 的副本

然后我:将硬盘重新安装到内部驱动器托架中,在 BIOS 设置模式下启动系统,Shellx64.efi从 BIOS 启动,输入“c”进入 grub 提示符

grub> linux /vmlinuz root=/dev/sda2
grub> initrd /initrd.img
grub> boot

这启动了文件系统(以前如果我有办法进入 grub,它总是会这样)。这次当我运行 grub-install 并grub-mkconfig重新启动时,BIOS 可以grubx64.efi从 esp、boot 分区上的正确位置读取。成功!

相关内容