Hint: this post is also available in English.

之前买了台 HP Z620 回家当 Hyper-V 服务器,某日发觉 500G 的 860EVO 已经快满了。考虑到价格、性能和容量三个方面,最终决定购买一块 2TB 的 Intel DC P4500 回来用。硬盘上机之后发现 BIOS 里并没有出现这个 SSD,google 了一下后发现这台 workstation 虽然支持 UEFI 但是并不支持 NVMe SSD,于是只能用一些中间工具来引导 NVMe 上的系统。

最简单的方法是使用 Clover Bootloader,虽说这个工具是专注于引导 hackintosh 的,但是将它作为一个普通的 bootloader 也没什么毛病,自动搜索分区啥的相对来说也很好用。问题就在当我准备给服务器换成 ESXi 时,发现 Clover 并不能自动发现这个系统,自己写自定义入口又嫌麻烦(手写 XML 真的是反人类),于是准备换个方案。

简单调查了一下后发现,UEFI 本身支持加载驱动程序,那么使用 UEFI Shell 就能解决问题了。首先是在 BIOS 能识别出来的 GPT 磁盘上开出一个 ESP 分区,然后将 UEFI Shell 和 NVME 驱动复制到分区内,并在分区根目录内创建 startup.nsh 并写入:

load -nc fs0:\NvmExpressDxe-64.efi
connect -r
map -u
fs1:\EFI\BOOT\BOOTX64.EFI

脚本的内容很容易理解,就不说了(

随后使用 efibootmgr 命令,或者是在 Windows PE 中使用相关的工具,创建一个启动项,可执行文件为该分区内的 EFI Shell,并将该项设置成默认即可。脚本内涉及到分区和路径的方面,每台机器可能都不完全一致,可以直接进入 UEFI Shell 加载好驱动之后用 map 命令查看需要引导系统的 NVMe 磁盘路径。

其实最合理的方案应该是在机械硬盘上安装 ESXi,同时所有的虚拟硬盘都放到 NVMe 中?感觉这样就没这么多破事儿了(

参考资料

  1. [Guide] NVMe-boot without modding your UEFI/BIOS (Clover-EFI bootloader method)
  2. UEFI Shell Specification
  3. Error-handling in EFI startup shell scripts - Super User