如何在单启动硬件上将Ubuntu BIOS安装转换为EFI/UEFI而无需使用boot-repair命令?

意外的BIOS模式安装

我有一台搭载Intel 64位硬件和UEFI设置实用程序的设备。Ubuntu 14.04.1 LTS作为唯一的操作系统安装在唯一连接的驱动器上,但是不小心以BIOS/CSM/legacy模式安装了Ubuntu。

转换为UEFI

在后来了解到UEFI之后,目标是将现有的Ubuntu安装更改为通过EFI/UEFI(更快)引导。我仍然希望拥有一种 - 显示2秒钟 - 引导菜单,以便我可以进入UEFI设置实用程序。因此,我认为我需要使用Grub(无法使用EFI引导框架)和GOP支持需要Grub版本1.99或更高版本。我已经使用Live CD重新分区了驱动器,并在驱动器开头插入了一个200 MiB的EFI分区,并将该fat16格式化的分区标记为类型ID 0xEF。

之前:

# fdisk -l /dev/sda
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   108478463    54238208   83  Linux
/dev/sda2       108480510   125044735     8282113    5  Extended
/dev/sda5       108480512   125044735     8282112   82  Linux swap / Solaris

之后:
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *      411648   108478463    54033408   83  Linux
/dev/sda2       108480510   125044735     8282113    5  Extended
/dev/sda3            2048      411647      204800   ef  EFI (FAT-12/16/32)
/dev/sda5       108480512   125044735     8282112   82  Linux swap / Solaris

Partition table entries are not in disk order

请勿使用引导修复工具

Ubuntu社区维基建议使用引导修复工具将Ubuntu转换为EFI模式。我不想使用图形界面,也不想安装任何额外的软件包,而且我不希望数据意外地发送到pastebin.com。因为我想知道将会发生什么变化,所以我不想使用引导修复工具

底层原理

试图弄清楚引导修复工具实际上是做什么的,我找到了这段代码:

引导修复工具将通过卸载grub-pc并安装grub-efi来将BIOS安装转换为UEFI(如果分区采用gpt格式)。

来源:http://ubuntuforums.org/showthread.php?t=2147295&p=12657352#post12657352

UEFI模式安装对比

在UEFI模式下进行干净的Ubuntu 14.04.1安装时,会创建一个512 MiB的Fat32格式化的EFI分区。该分区包含一个名为/EFI/ubuntu的目录,其中包含4个文件:grub.cfggrubx64.efiMokManager.efishimx64.efi。grub.cfg文件如下:
search.fs_uuid 7d843e47-3917-4114-8725-55dfa1fbe002 root hd0,gpt2
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

Search.fs_uuid指向Linux安装分区的UUID,在此比较中,UEFI安装的Linux被安装在分区/dev/sda2 (相对于BIOS模式安装中的sda1)

未发现任何潜在的Asrock固件问题

在固件中仍然禁用CSM,并使用干净的UEFI模式安装Ubuntu。使用Live CD和gparted将512 MiB的EFI分区调整为200 MiB,会导致其格式从FAT32更改为FAT16。Asrock固件P1.50(在AMI引导消息"BIOS date"中错误地称为BIOS)仍能够启动进入UEFI模式的Ubuntu:UEFI+FAT16=ok。 使用相同的Live CD终端命令gdisk和其命令r g p w,将分区表从GPT转换为MBR(msdos),也会在MBR分区的驱动器上产生可引导的UEFI Ubuntu:UEFI+MBR=ok。
问题:
这是否意味着我需要执行的唯一命令是来自传统的Ubuntu安装,并且按照以下顺序执行:
# apt-get install grub-efi
# apt-get remove grub-pc

还需要做更多吗?


1我仍然会使用引导修复工具。你假设你需要安装软件包...我认为你错了。请参考:http://askubuntu.com/questions/226061/how-to-install-the-boot-repair-tool-in-an-ubuntu-live-disc - Rinzwind
@Rinzwind 我无法使用boot-repair,因为当前的Ubuntu安装中没有图形用户界面(仅限控制台),而且在Asrock的H81 Pro BTC P1.50 UEFI设置实用程序中,将ubuntu-14.04.1-desktop-amd64.iso设置为第一个USB UEFI启动设备时无法启动。 - Pro Backup
1Boot-Repair不是图形用户界面,而是带有一个使其更像图形用户界面的插件的Bash。随着Ubuntu新版本的推出,软件包名称有些变化,现在是grub-efi-amd64或grub-efi-amd64-signed,我想是因为他们想要发布一个32位UEFI引导加载程序而改变了名称。Chroot版本,请注意您还需要安装grub并创建grub.cfg。http://askubuntu.com/questions/53578/can-i-install-in-uefi-mode-with-the-alternate-installer/57380#57380 - oldfred
@oldfred Boot-Repair依赖于图形界面:在这个Ubuntu服务器安装上执行apt-get install boot-repair命令会导致245MB的GTK类似依赖项被boot-repair要求安装。而且之后执行boot-repair命令失败。更新新版本的grub-efi命名确实很有帮助。 - Pro Backup
如果使用Asrock主板,请确保没有将硬盘或DVD驱动器连接到Asmedia端口上。因为它们没有相应的驱动程序。如果要在UEFI模式下启动,最好只有GPT分区的硬盘。详细信息请参考:http://www.rodsbooks.com/gdisk/hybrid.html - oldfred
3个回答

在UEFI模式下启动Ubuntu Linux(14.04)的Live CD。 如果使用USB引导设备,请在UEFI中禁用"Fast Boot"。

打开一个终端窗口(Ctrl+Alt+T

要验证您是否实际上运行在UEFI模式下,请使用以下bash命令:

$ [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

生成的输出应该是:
UEFI

如果显示为 "BIOS",请重新启动到固件并更正引导设备首选项。
要进行 BIOS 到 EFI/UEFI 转换,请输入以下命令:
$ sudo mount /dev/sda1 /mnt
$ sudo mkdir -p /mnt/boot/efi
$ sudo mount /dev/sda3 /mnt/boot/efi
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
$ sudo mount --bind /run /mnt/run
$ modprobe efivars
$ sudo chroot /mnt
# apt-get install grub-efi-amd64

Apt-get网络失败?
# rm /etc/resolv.conf
# ln -s ../run/systemd/resolve/stub-resolv.conf resolv.conf
# apt-get install grub-efi-amd64

没有apt-get失败
The following extra packages will be installed:
  efibootmgr grub-efi-amd64-bin
The following packages will be removed:
  grub-gfxpayload-lists grub-pc
...
After this operation, 2,399 kB of additional disk space will be used.

# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --no-floppy --debug

尽管以错误信息结束:
Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.
Try 'modprobe efivars' as root.

下一次重新启动已经在固件的引导选项菜单中显示“ubuntu”,并像以前一样启动到控制台,只是现在以EFI模式启动。
$ dmesg | grep EFI
efi: EFI v2.31 by American Megatrends
fb0: EFI VGA frame buffer device
EFI Variables Facility v0.08 2004-May-17
fb: switching to inteldrmfb from EFI VGA

如果出现问题,https://superuser.com/questions/376470/how-to-reinstall-grub2-efi可能会有所帮助。


1这帮助我升级了硬盘并转换为GPT/UEFI/SecureBoot,而无需重新安装。谢谢你。需要注意的是:我需要grub-efi-amd64-signed软件包,以避免在我的UEFI BIOS中禁用SecureBoot。 - Robie Basak
现在已经是2018年了,这个EFI问题仍然存在。即使安装了EFI引导,但我最终还是进入了grub命令行界面。我对Ubuntu已经失去信心了。 - Abhishek Dujari
这对我在Ubuntu 19.10下起作用。我使用EFI引导了活动的USB,并在我的磁盘末尾添加了一个200MB的FAT32类型分区,用于EFI。 - Joey Adams
完美。我创建了一个qemu kvm bios,并在专家模式下安装了minimal.iso(ubu18),创建了sda1 512 Mb FAT32和sda2 4.5 GB ext4。我将sda1保留为"Reserved Boot Area",并安装了一个没有安装任何引导程序的最小化ubuntu。 然后,我使用OMVF efi bios固件启动了相同的qemu qcow2映像与live 18.04桌面cd映像。按照你说的做了,没有错误。然后我得到了grub>屏幕 然后我执行了以下操作: grub> set root=(hd0,gtp2) grub> linux /boot/vmlinuz-4.14.xxxx-generic root=/dev/sda2 grub> initrd /boot/initrd.img-4.14.xxxx-generic grub> bootTab键和箭头键都可以工作,太棒了。 - Gediz GÜRSU
非常出色!帮助我将以BIOS模式启动的Ubuntu转换为EFI。唯一的问题是网络问题,导致无法运行apt-get命令。关于如何解决这个问题,请参考下一个回答的评论,他也遇到了同样的问题。 - Andrew Fielden

这对我也起作用,只是有一个小改动。尽管网络正常工作,但我无法让apt-get install grub-efi-amd64找到任何软件包服务器。
为了解决这个问题,我最后一次以BIOS模式启动,并安装了grub-efi-amd64。
然后,我可以按照这里的步骤进行操作,只是省略了apt-get install grub-efi-amd64

1我遇到了一个问题。原来/etc/resolv.conf被错误地链接到了另一个文件。删除它,然后执行ln -s ../run/systemd/resolve/stub-resolv.conf resolv.conf命令。然后重新运行apt-get命令。 - Andrew Fielden
@AndrewFielden 我正确地改进了我的答案以反映您的错误和建议的解决方案吗? - Pro Backup
@ProBackup看起来不错(我做了一个小改动)。再次感谢,你的帮助救了我的固态硬盘。 - Andrew Fielden

小修正:
sudo apt-get install -y grub-efi-amd64
sudo mount /dev/sda1 /mnt
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/sda3 /mnt/boot/efi
for d in dev sys proc usr run; do sudo mount -B /$d /mnt/$d; done
sudo modprobe efivars
sudo chroot /mnt
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --no-floppy --debug

完成。

你能解释一下为什么你建议从原始答案中进行这些修改吗?请不要在评论中回复,编辑你的答案以使其更清晰和完整。 - G-Man Says 'Reinstate Monica'