我有十台相同的机器,想在所有机器上部署相同的 Ubuntu 12.04 映像。我已在其中一台机器上完成了完整安装,并使用 克隆了磁盘dd
。问题是,如果我使用dd
此 将此映像写入另一台机器的磁盘,它将无法启动。也就是说,除了我创建映像的那台机器外,所有机器都报告“未找到可启动设备”。
我怀疑这可能是由于 UEFI 启动设置方式的设备或机器特定问题,但我不能肯定。据我所知,我没有做任何不寻常的事情。
无论如何,跑步启动修复在其中一个克隆上确实修复了问题并让机器启动,但我宁愿不必在我想要将映像克隆到的每台新机器上手动运行该程序。此外,这似乎将驱动器绑定到该机器,因此将“修复”驱动器插入运行 Boot-Repair 的机器以外的机器将再次产生“未找到可启动设备”消息。
显然,必须能够以这样的方式构建映像,使得 UEFI 启动项可以在任何机器上运行,因为这是 Ubuntu 安装映像所做的,但我不知道它是如何实现的?
如果有帮助的话,这里是Boot-Repair在新机器上修复磁盘时生成的启动信息文件。
答案1
在 EFI 下,引导加载程序以文件形式存储在 EFI 系统分区 (ESP) 中。通常,此类文件的名称对于操作系统来说是唯一的,例如EFI/ubuntu/grubx64.efi
Ubuntu。由于这个事实,引导加载程序必须在固件的 NVRAM 中注册。Ubuntu 安装程序在安装操作系统时会执行此操作,但当您将磁盘移动到另一台计算机时,其 NVRAM 已不是已被修改,因此计算机无法启动。使用 Boot Repair 将安装 GRUB 的新副本并将其注册到固件中,从而解决问题。我猜想您的固件自己的启动管理器也会进行扫描并注册启动加载程序,但也可能发生了其他事情。
解决此问题的一个可能方法是将 GRUB 从 复制EFI/ubuntu/grubx64.efi
到EFI/BOOT/bootx64.efi
。后者是一个后备名称 - 如果计算机找不到任何已注册的引导加载程序,则从该名称启动。可移动媒体也使用相同的文件名,因为显然,除非使用某个约定俗成的通用名称,否则无法预先注册操作系统安装盘。Ubuntu 和/或 Boot Repair 也可能将 GRUB 复制到此名称,您的固件最初由于某种原因没有检测到它,而使用固件的引导管理器导致它注意到此文件的存在,从而解释了使用该工具后可引导性。事实上,这似乎比您的固件扫描 Ubuntu 的默认引导加载程序文件名更有可能。
答案2
奇怪的是,当我打开 UEFI 启动管理器(启动期间按 F2)并重置为出厂默认设置时,问题自行解决。
我猜我可能在某个时候启用了“快速启动”或类似功能,从而禁用了对“未注册”UEFI 启动分区的搜索。运行grub-update
(调用efibootmgr
)本质上是将 GRUB 注册到 UEFI 启动管理器,这样它就不必搜索它了,但由于此命令尚未在克隆的计算机上运行,因此efibootmgr
尚未运行,因此 GRUB 安装不会出现在启动管理器的列表中。
答案3
Jon Gjensget 的答案有帮助地说:
运行
grub-update
(调用efibootmgr
)本质上是将 GRUB 注册到 UEFI 启动管理器
但随后省略了如何实际运行efibootmgr
。我不想必须解锁加密磁盘,挂载所有正确的东西,如/dev、/boot、/boot/efi等,chroot,最后能够运行 grub-update,如果我可以运行efibootmgr
,特别是因为磁盘现在处于已知良好状态(从备份中恢复),如果我搞砸了启动,我不想再等两个小时来重新映像它。
运行cd /boot/efi/EFI; cp -r ubuntu BOOT
为评论中建议对我来说不起作用,即使我在英特尔 NUC 上也遇到了这个问题。
启动修复对我来说也不起作用:屏幕截图中显示的修复按钮不存在,并且在高级选项中没有任何选项可以运行 efibootmgr,它看起来只是一个用于运行 grub-update(和许多其他工具,如 fsck)的 GUI 按钮,而不是真正自行修复启动。
这是对我有用的命令(从实时启动棒运行):
efibootmgr -c -g -d /dev/sda -p 1 -w -L "myboot" -l '\EFI\ubuntu\grubx64.efi'
efibootmgr # to verify it's in the boot options list
efibootmgr -n [ID HERE] # to make sure it boots that option next time
事实-n [ID]
证明这不是必需的,每次创建后它都会启动该选项(无论如何,没有其他可用的启动选项,这就是为什么我很困惑为什么它不首先尝试从唯一可能的启动选项启动......)。
使用的选项是:
-c
创建新的启动选项-g
强制它将磁盘视为 GPT(不确定这是否有必要,我没有尝试过没有这个选项)-d
就我而言,应该使用哪种设备/dev/sda
-p
包含 EFI 启动文件夹和启动文件的分区号.efi
,在我的情况下,设备是/dev/sda1
(一个FAT32
分区),因此分区号是1
-w
“如果需要,将唯一签名写入 MBR”(不知道是否需要)-L
您选择的名字,我选择了一个对我来说独一无二的名字,以便我以后可以识别它-l
.efi
您要用于启动的文件的路径,我假设对于 x86_64 上的 grub,这始终是\EFI\...\grubx64.efi
,并且...
取决于您的发行版。您可以在分区上找到正确的路径(先前由-d
和指定-p
),并且它通常安装在中,/boot/efi
因此您可以查看/boot/efi/EFI
目录名称位于何处grubx64.efi
。
来源:https://bbs.archlinux.org/viewtopic.php?id=160757-- 这只是线程中的第一个命令。回复给出了更多建议,但第一个命令对我来说有效。