oing9179 的笔记本儿

为 BIOS 启动的电脑换上 UEFI

Preface

这几天给某个 Telegram 上的朋友的新电脑装了个 Manjaro,那台电脑使用了 UEFI。
我自己的电脑也支持 UEFI,于是琢磨着给自己的电脑也换上 UEFI 启动。

准备工具

  1. SystemRecuseCd (以下简称 sysrcd)
    会用到里面自带的一些工具(sgdisk, GParted, etc.)
  2. Windows 10 PE
  3. 软件包
    1. syslinux
    2. mtools
  4. 一个U盘

创建 sysrcd 的 U 盘启动

sysrcd 同时支持 BIOS 和 UEFI 启动,针对不同的启动方式需要进行不同的配置。
注意: 以下任意一种方式都会导致U盘的全部数据丢失。

制作可以通过 BIOS 启动的 sysrcd U盘

  1. 复制出一份 sysrcd.iso 文件,因为下面的命令会修改 iso 文件
  2. 运行命令 isohybrid sysrcd.iso
    isohybrid 该可执行文件包含在 syslinux 软件包内)
  3. 假设 /dev/sdb 是U盘,运行命令 dd if=./sysrcd.iso of=/dev/sdb

制作可以通过 UEFI 启动的 sysrcd U盘

  1. 为U盘创建新的分区表,使用 GPT 分区表
  2. 为U盘创建一个 1GiB 的 FAT32 分区,假定分区位于 /dev/sdb1
  3. 挂载 /dev/sdb1
  4. sysrcd.iso 内的文件复制到U盘内
  5. 卸载 /dev/sdb1
  6. 运行命令 syslinux --install --directory isolinux /dev/sdb

转换 MBR 分区表为 GPT 分区表

假定要转换的硬盘在 /dev/sda

  1. 通过U盘启动sysrcd
  2. 运行命令:备份MBR分区表
    dd if=/dev/sda of=./mbr_backup.bin bs=512 count=1
  3. sda 硬盘的尾部至少要有 36 个空 sector,如果没有,请缩小硬盘内最后一个分区的大小
  4. 运行命令:将 MBR 分区表转换为 GPT 分区表
    sgdisk -g /dev/sda
  5. 打开 GParted 查看效果

在虚拟机内测试将硬盘转换为GPT分区表后,每个分区后面会有大约 1MiB 的空间空间。如果真实主机也出现这种情况,可以考虑用 GParted 调整一下。

安装 Windows UEFI

  1. 启动至 Windows 10 PE,打开命令行,运行命令 diskpart
  2. 使用命令 list disk 找到 ESP 分区所在的硬盘,并使用 select <disk_number> 来选择这块磁盘
  3. 使用命令 list partition 找到 ESP 分区,并使用 select <part_number> 选择该分区
  4. 使用命令 assign letter=b 将 ESP 分区分配到盘符 B:
  5. exit 退出 diskpart
  6. 运行命令 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 所在的硬盘。

1
2
3
4
5
6
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 启动项

  1. 使用命令 mount -o remount,rw /sys/firmware/efi/efivarsefivars 挂载为读写
  2. 使用命令 efibootmgr 列出所有 EFI 启动项
  3. 使用命令 efibootmgr -B -b <number> 删除 number 代表的 Windows 启动项,
    或使用命令 efibootmgr -A -b <number> 禁用 number 代表的 Windows 启动项

EFI 启动项调整完了,接下来让 EFI 默认启动 GRUB。

  1. 假定 ESP 分区在 /dev/sda1,使用命令 mount /dev/sda /mnt/esp 挂载 ESP 分区
  2. cd /mnt/esp/EFI
  3. mkdir boot
  4. cp ./manjaro/grubx64.efi ./boot/bootx64.efi

重启计算机,应该会显示 GRUB 启动界面了。