为 BIOS 启动的电脑换上 UEFI
Preface
这几天给某个 Telegram 上的朋友的新电脑装了个 Manjaro,那台电脑使用了 UEFI。
我自己的电脑也支持 UEFI,于是琢磨着给自己的电脑也换上 UEFI 启动。
准备工具
- SystemRecuseCd (以下简称 sysrcd)
会用到里面自带的一些工具(sgdisk
, GParted, etc.) - Windows 10 PE
- 软件包
syslinux
mtools
- 一个U盘
创建 sysrcd 的 U 盘启动
sysrcd 同时支持 BIOS 和 UEFI 启动,针对不同的启动方式需要进行不同的配置。
注意: 以下任意一种方式都会导致U盘的全部数据丢失。
制作可以通过 BIOS 启动的 sysrcd U盘
- 复制出一份
sysrcd.iso
文件,因为下面的命令会修改 iso 文件 - 运行命令
isohybrid sysrcd.iso
(isohybrid
该可执行文件包含在syslinux
软件包内) - 假设
/dev/sdb
是U盘,运行命令dd if=./sysrcd.iso of=/dev/sdb
制作可以通过 UEFI 启动的 sysrcd U盘
- 为U盘创建新的分区表,使用 GPT 分区表
- 为U盘创建一个 1GiB 的 FAT32 分区,假定分区位于
/dev/sdb1
- 挂载
/dev/sdb1
- 将
sysrcd.iso
内的文件复制到U盘内 - 卸载
/dev/sdb1
- 运行命令
syslinux --install --directory isolinux /dev/sdb
转换 MBR 分区表为 GPT 分区表
假定要转换的硬盘在 /dev/sda
。
- 通过U盘启动sysrcd
- 运行命令:备份MBR分区表
dd if=/dev/sda of=./mbr_backup.bin bs=512 count=1
- sda 硬盘的尾部至少要有 36 个空 sector,如果没有,请缩小硬盘内最后一个分区的大小
- 运行命令:将 MBR 分区表转换为 GPT 分区表
sgdisk -g /dev/sda
- 打开 GParted 查看效果
在虚拟机内测试将硬盘转换为GPT分区表后,每个分区后面会有大约 1MiB 的空间空间。如果真实主机也出现这种情况,可以考虑用 GParted 调整一下。
安装 Windows UEFI
- 启动至 Windows 10 PE,打开命令行,运行命令
diskpart
- 使用命令
list disk
找到 ESP 分区所在的硬盘,并使用select <disk_number>
来选择这块磁盘 - 使用命令
list partition
找到 ESP 分区,并使用select <part_number>
选择该分区 - 使用命令
assign letter=b
将 ESP 分区分配到盘符B:
上 exit
退出 diskpart- 运行命令
bcdboot <winsys>:\Windows /s <esp>: /f uefi
winsys: 硬盘上的 Windows 系统所在盘符
esp: ESP 分区所在盘符,也就是B:
重启计算机到 sysrcd,开始安装 GRUB。
安装 GRUB
参考: How can I reinstall GRUB to the EFI partition? - askubuntu.com
假设 /dev/sda2
是 Linux 的 /boot
分区,
假设 /dev/sda1
是 ESP 分区,
假设 /dev/sda
ESP 所在的硬盘。
sudo mount /dev/sda2 /mnt/sda2
sudo mount /dev/sda1 /mnt/sda2/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt/sda2$i; done
sudo chroot /mnt/sda2
grub-install /dev/sda
update-grub
调整 EFI 启动项
- 使用命令
mount -o remount,rw /sys/firmware/efi/efivars
将efivars
挂载为读写 - 使用命令
efibootmgr
列出所有 EFI 启动项 - 使用命令
efibootmgr -B -b <number>
删除number
代表的 Windows 启动项,
或使用命令efibootmgr -A -b <number>
禁用number
代表的 Windows 启动项
EFI 启动项调整完了,接下来让 EFI 默认启动 GRUB。
- 假定 ESP 分区在
/dev/sda1
,使用命令mount /dev/sda /mnt/esp
挂载 ESP 分区 cd /mnt/esp/EFI
mkdir boot
cp ./manjaro/grubx64.efi ./boot/bootx64.efi
重启计算机,应该会显示 GRUB 启动界面了。