今天下午試著再把 laptop 上的 Debian 轉換上 EFI (non-secure boot), 在讓系統能開機這段花了點時間, 記錄下.
首先, 確認你的 partition table type 為 GPT. 再來, 你至少要有一個 ESP (EFI System Partition) 且格式為 FAT, 容量從 64M 到 512M 或更大都可以, 視你想在裡面放什麼而定 (小的話, grub, 大的話, 可以放 linux kernel image), 並標上 esp partition flag, 倒如
$ sudo parted /dev/sda p
Model: ATA ST1000LM014-1EJ1 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB primary bios_grub
3 2097kB 256MB 254MB fat16 primary boot, esp
2 256MB 1000GB 1000GB zfs primary
這裡 sda1
是供 grub 寫入 MBR 相容的 bootloader 用的空間, 如果你確定不需要用 BIOS 啟動系統, 那就不需要加.
接著, 改用 EFI 模式開機, 並使用支援 EFI 的 live USB 系統例如 Ubuntu 18.04 啟動 (因為接下來要用的 efibootmgr
需要修改 kernel 提供的 /sys/firmware/eif
的 variables), 接著, 打開 terminal, mount 上原系統的 /
及 /boot
, 把 ESP mount 在 /boot/efi
上, 再 bind mount 上 /proc
, /dev
, /sys
以後 chroot 進你系統的 rootfs 中, 把網路搞通, 再裝上 grub-efi
, 到此 bootloader 安裝完成, 但, 不代表你能通過 EFI 開機.
原因是, 在 EFI 中, 你還需要有個 boot entry. 可通過 efibootmgr
來增加, 例如 (以上例而言, ESP 為 /dev/sda3
)
$ sudo efibootmgr --create --disk /dev/sda --part 3 --loader /EFI/debian/grubx64.efi --label 'GNU Debian Linux'
BootCurrent: 0004
Timeout: 0 seconds
BootOrder: 0004,0005
Boot0000
Boot0001
Boot0002* ST1000LM014-1EJ164
Boot0003* Crucial_CT500MX200SSD3
Boot0005* Linux Boot Manager
Boot2001* EFI USB Device
Boot2002* EFI DVD/CDROM
Boot2003* EFI Network
Boot0004* GNU Debian Linux
如果操作有誤, 想刪除某一個 entry, 倒如剛才加上的 "GNU Debian Linux", 可用指定 boot number 的方式完成, 此例是 0004
$ sudo efibootmgr --bootnum 0004 --delete-bootnum
你也可
中間我為了減少實驗時間, 用了 KVM 及 VMware 驗証, 發現在 VMware 下, 似乎沒法用 efibootmgr
增加 boot entry, 只能在啟動時, 進到 EFI 管理界面中手動新增才行.
- 啟動時, 按 DEL 進到 EFI 管理界面, 選
Enter setup
- 再進入
Configure boot options
- 再選 Add boot option
- 然後找出你 ESP 所在的 partition
- 一層層目錄進入, 找到例如
debianx64.efi
檔後, 新增即可
Debian 10 (buster) 將會把 EFI secure boot 的支援加上, 還要再研究下怎麼個玩法.