1. 介绍
-
EFI Boot Stub
在 x86 或者 arm 平台下,压缩的内核(zImage/bzImage)可以伪装(masquerade)成为一个 PE/COFF 格式的可执行文件,也就是 UEFI 所能识别的可执行文件格式(尴尬的是,这正是windows下可执行文件的格式)。因此内核可以直接被 UEFI 固件所加载,并跳转到内核中被称为"EFI boot stub"的代码块,完成引导的过程,可以替代传统引导程序(如 grub/elilo)的基本功能。
(更详细的细节介绍请参阅 kernel.org 的相关文档) -
其他
本文测试环境:debian 8/9 (jessie/stretch)
EFI 启动文件位置:/boot/efi/EFI/debian(以下命令均需 root 权限 ,请注意提升权限
2. 配置简述
2.1 配置一些 postinst 脚本
因为我们需要将内核复制到 EFI 启动分区中,即所谓的 ESP 分区(debian 下默认挂载为 /boot/efi),所以需要配置好内核的 postinst 脚本,这样每次内核更新,都可以自动复制新的内核相关文件到 EFI 分区中。
-
kernel
123456mkdir -p /etc/kernel/postinst.dcat > /etc/kernel/postinst.d/zz-update-efistub << 'EOF'#!/bin/shcp /vmlinuz /boot/efi/EFI/debian/EOF -
initramfs
123456mkdir -p /etc/initramfs/post-update.dcat > /etc/initramfs/post-update.d/zz-update-efistub << 'EOF'#!/bin/shcp /initrd.img /boot/efi/EFI/debian/EOF
2.2 设置权限
- 设置权限并运行之
12345chmod +x /etc/kernel/postinst.d/zz-update-efistubchmod +x /etc/initramfs/post-update.d/zz-update-efistub/etc/kernel/postinst.d/zz-update-efistub/etc/initramfs/post-update.d/zz-update-efistub
2.3 配置 EFI 引导项
-
安装必要的组件
1234apt updateapt install efivar efibootmgr util-linuxmodprobe efivars -
配置 EFI boot entry
123export UUID=$(blkid -s UUID -o value /dev/sda2) # 获取根目录所在分区的UUID,请将 /dev/sda2 替换成您的根目录实际所在分区efibootmgr -c -g -L "Debian (EFI stub)" -l '\EFI\debian\vmlinuz' -u "root=UUID=$UUID ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\debian\\initrd.img" -
查看现有引导项
12efibootmgr -v
3. 参考资料
EFIStub - Debian Wiki
https://www.kernel.org/doc/Documentation/efi-stub.txt