今天下午試著再把 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 管理界面中手動新增才行.

  1. 啟動時, 按 DEL 進到 EFI 管理界面, 選 Enter setup
    Screenshot-from-2018-09-04-21-18-03
  2. 再進入 Configure boot options
    Screenshot-from-2018-09-04-21-18-59
  3. 再選 Add boot option
    Screenshot-from-2018-09-04-21-19-28
  4. 然後找出你 ESP 所在的 partition
    Screenshot-from-2018-09-04-21-20-28
  5. 一層層目錄進入, 找到例如 debianx64.efi 檔後, 新增即可
    Screenshot-from-2018-09-04-21-22-22
    Screenshot-from-2018-09-04-21-36-07

Debian 10 (buster) 將會把 EFI secure boot 的支援加上, 還要再研究下怎麼個玩法.