UEFI Bootable Usb

UEFI shell

UEFI firmware 应该会读取设备里面的分区,找到 ESP 然后再读里面的内容。我看到最简单的方式是把 u 盘格式化成 fat 然后建一个目录 /boot/efi 然后下载一个 uefi shell 把 .efi 文件放到这个目录 /boot/efi/shellx64.efi ,然后启动的时候就多了一个 uefi 菜单了,选择之后可以进入一个 uefi shell。

uefi shell 里面有几个命令可以用。

map

map 可以列出来当前机器的磁盘情况,找到你的 esp 分区。

ls

ls 可以列出来磁盘目录里面的内容,比如 ls fs0:\boot ,注意磁盘和目录之间用 : ,目录层级之间用 \

bcfg

可以通过 bcfg boot dump -v 列出来当前所有的 efi 菜单,注意每个项目都有一个序号,后面会用到。

比如我想自己加一个菜单进去,那就找到最后那个的序号,然后执行 bcfg add 8 fs0:\boot\grub\grubx64.efi GRUB (fat 系统不区分大小写),指向我自己通过 grub-install --efi-directory=/mnt/sda1/ 放到 esp 分区的 grub 的 efi ,这样启动的时候就多了一个 GRUB 的选项,通过这个选项就可以进入 linux,然后使用更方便的 efibootmgr 来编辑这个菜单了。

参考:

自己制作 iso

通过 isohybrid 可以把一个 iso 做成支持 uefi 的格式,然后通过 dd 写入 u 盘之后,这个 u 盘就支持 uefi 启动了。

mkisofs \
 -o output.iso \
 -c boot/syslinux/isolinux.boot \
 -b boot/syslinux/isolinux.bin \
  -no-emul-boot -boot-load-size 4 -boot-info-table \
 -eltorito-alt-boot \
 -eltorito-platform 0xEF -eltorito-boot isolinux/efiboot.img \
  -no-emul-boot \
 CD_ROOT

efiboot.img 实际是一个 iso 格式的磁盘 img,可以通过下面的方式产生

$ dd if=/dev/zero of=./efiboot.img bs=1M count=4
$ mount efiboot.img ./mnt
$ cp -r EFI /mnt
$ umount /mnt

EFI/boot 目录是 efi 启动你自己定义的内容,然后执行 isohybrid --uefi output.iso