
最小EFI环境实现Rust Hypervisor Firmware如何成功引导shim与GRUB2【免费下载链接】rust-hypervisor-firmware项目地址: https://gitcode.com/gh_mirrors/ru/rust-hypervisor-firmwareRust Hypervisor Firmware 是一个用 Rust 编写的轻量级虚拟机固件它通过最小化的 EFI 环境成功引导了 Ubuntu 等发行版使用的 shim 与 GRUB2 启动链。本文从零讲解这套够用就好的 EFI 实现思路帮你快速理解它为何能替代复杂的 TianoCore/edk2成为云虚拟机场景下的极简引导方案。为什么需要最小 EFI 环境传统虚拟机引导往往依赖 UEFI 固件如 TianoCore/edk2它功能完整但体积庞大、启动缓慢。而云虚拟机Cloud Hypervisor、QEMU其实只需要固件做一件事从磁盘镜像里把引导程序加载起来。Rust Hypervisor Firmware 的设计目标非常明确由 VMM 通过PVH 启动标准直接加载无需 BIOS/UEFI从磁盘的 EFI 系统分区读取引导文件提供足够引导 shim GRUB2的最小 EFI 接口而不是完整实现整个 UEFI 规范这意味着你可以在没有完整固件的情况下直接引导带 Secure Boot 链的 Ubuntu 云镜像。一条完整的引导链路 整个启动过程可以概括为下面这条链VMM (Cloud Hypervisor / QEMU) │ PVH 协议加载固件 ▼ Rust Hypervisor Firmware │ 解析 GPT → 挂载 FAT 分区 ▼ \EFI\BOOT\BOOTX64.EFI (shim) │ LoadImage / StartImage ▼ GRUB2 │ ▼ Linux 内核核心入口在 src/main.rs 的boot_from_device()中固件先尝试按 Boot Loader Specification 直接引导内核如果失败就回退到 EFI 引导路径加载\EFI\BOOT\BOOTX64.EFI即 shim。最小 EFI 环境的 4 大核心组件 1. Boot Services70 个函数够用就行EFI 规范定义了庞大的 Boot Services 接口而 RHF 的策略是需要什么实现什么其余一律返回 UNSUPPORTED。见 src/efi/boot_services.rsallocate_pages/allocate_pool内存分配基于 E820 内存布局load_image/start_image加载并启动 PE 格式的 shimlocate_handle/open_protocol提供块设备、文件系统、设备路径协议exit_boot_services直接返回 SUCCESS把控制权交给 shim特别巧妙的是shim lock 协议的支持install_protocol_interface对 shim 特有的 GUID 直接返回 SUCCESS让 shim 以为 Secure Boot 环境已就绪从而继续加载 GRUB2。2. Runtime Services时间与变量src/efi/runtime_services.rs 实现了get_time通过 RTC 读取日期时间get_variable/set_variable在启用efi-var特性时支持 EFI 变量读写src/efi/var.rs其余如胶囊更新、唤醒定时器全部返回 UNSUPPORTED3. 文件系统与分区解析固件自带一套精简的磁盘栈无需依赖任何外部驱动src/part.rsGPT 解析定位 EFI 系统分区src/fat.rsFAT12/16/32 目录遍历与文件读取src/efi/file.rs将 FAT 文件系统包装成 EFI 的 Simple File System 协议4. PE32 加载器shim 和 GRUB2 都是 PE 格式的可执行文件。src/pe.rs 实现了 PE32 解析与重定位把镜像加载到内存后通过efi_exec()见 src/efi/mod.rs构造 System Table 并跳转到入口点。它如何骗过 shimshim 的正常启动流程要求固件提供 Boot Services 和 Runtime Services 表提供 Loaded Image Protocolshim 需要读取自身信息提供文件系统协议读取 GRUB2在 Secure Boot 场景下shim 会检查 shim lock 协议RHF 在内存中静态构造了完整的SystemTable、BootServices和RuntimeServices结构体src/efi/mod.rs 中的ST、BS、RS并按需填充协议。对于 shim 而言它看到的是一套看起来正常的 EFI 环境于是按部就班地完成 Secure Boot 校验并加载 GRUB2。快速上手编译与运行 编译固件cargo build --release --target x86_64-unknown-none.json \ -Zbuild-stdcore -Zbuild-std-featurescompiler-builtins-mem产物位于target/x86_64-unknown-none/release/hypervisor-fw。用 QEMU 引导 Ubuntu 镜像qemu-system-x86_64 -machine q35,accelkvm -cpu host,-vmx -m 1G \ -kernel ./target/x86_64-unknown-none/release/hypervisor-fw \ -display none -nodefaults -serial stdio \ -drive idos,filefocal-server-cloudimg-amd64.raw,ifnone \ -device virtio-blk-pci,driveos,disable-legacyon固件会自动扫描 virtio-blk 设备、找到 EFI 分区、加载 shim一路引导到 GRUB2 和内核。Cloud Hypervisor 用户只需把--kernel参数指向hypervisor-fw即可。不止 x86_64三架构支持 除了 x86_64Rust Hypervisor Firmware 还支持架构默认 EFI 引导路径运行方式x86_64\EFI\BOOT\BOOTX64.EFIQEMU/Cloud Hypervisor PVHaarch64\EFI\BOOT\BOOTAA64.EFIQEMU 直接加载riscv64\EFI\BOOT\BOOTRISCV64.EFIOpenSBI payload总结 Rust Hypervisor Firmware 证明了一个观点在虚拟化场景下固件不需要全只需要够。通过精心挑选 EFI 接口的子集它用极少的代码量打通了 shim GRUB2 这条最流行的 Linux 引导链同时保持启动快速、代码可审计、无安全后顾之忧。如果你想深入了解推荐从这几个文件入手src/efi/mod.rsEFI 环境搭建核心src/efi/boot_services.rsBoot Services 实现src/loader.rsBoot Loader Specification 解析scripts/run_integration_tests.sh集成测试脚本对于想摆脱重型 UEFI 固件的云原生开发者来说这无疑是一个值得研究的极简范例。【免费下载链接】rust-hypervisor-firmware项目地址: https://gitcode.com/gh_mirrors/ru/rust-hypervisor-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考