Gentoo Secure Boot 配置记录:shim + GRUB + MOK
本文使用:
- shim
- GRUB
- MOK
gentoo-kernel-bin(distribution)和gentoo-sources(自编内核)分开处理
没有使用:
- sbctl
- systemd-boot
- UKI
TL;DR
- 为 distribution kernel 导出证书并导入 MOK(需要重启并在 MokManager 中确认)
- 为自己用的内核 / 模块生成私钥,妥善保护,把证书导入 MOK
- 自编内核的模块走 Portage / make.conf 自动签名;内核镜像 (
vmlinuz) 需手动sbsign - 更新内核后必须更新 GRUB 配置,然后重启验证
一、启动链
UEFI Secure Boot
→ shimx64.efi
→ grubx64.efi
→ Linux kernel即:UEFI 信任 shim → shim 验证 GRUB 签名 → GRUB 加载已被 MOK 信任的内核。
ESP 上关键文件:
/efi/EFI/Gentoo/shimx64.efi
/efi/EFI/Gentoo/mmx64.efi
/efi/EFI/Gentoo/grubx64.efi
/efi/EFI/Gentoo/grub.cfgshimx64.efi— shim 入口mmx64.efi— MokManager(导入 / 删除 MOK 的界面)grubx64.efi— 已签名的 GRUBgrub.cfg— GRUB 配置
二、两条信任链(概览)
这里实际用了两套信任链,都挂在 MOK 下面:
| 路线 A:distribution | 路线 B:自建 | |
|---|---|---|
| 内核来源 | gentoo-kernel-bin | gentoo-sources |
| 签名者 | Gentoo 官方 | 你自己 |
| 需要做的事 | 把 Gentoo 证书导入 MOK(一次性) | 生成 key、配置签名、手动签 vmlinuz |
| 模块签名 | 内核自带 | Portage + 内核 .config 自动签 |
两条线可以并存:日常用 distribution kernel 兜底,开发 / 尝鲜时切换到自编内核。
三、摆放 shim 与 GRUB
安装:
sudo emerge --noreplace sys-boot/grub sys-boot/shim sys-boot/mokutil sys-boot/efibootmgr把 shim、MokManager、已签名的 GRUB 放到 ESP:
sudo mkdir -p /efi/EFI/Gentoo
sudo cp /usr/share/shim/BOOTX64.EFI /efi/EFI/Gentoo/shimx64.efi
sudo cp /usr/share/shim/mmx64.efi /efi/EFI/Gentoo/mmx64.efi
sudo cp /usr/lib/grub/grub-x86_64.efi.signed /efi/EFI/Gentoo/grubx64.efiGRUB 配置放在 ESP(而非默认 /boot/grub/grub.cfg):
echo 'GRUB_CFG=/efi/EFI/Gentoo/grub.cfg' | sudo tee /etc/env.d/99grub
sudo env-update && source /etc/profile
sudo grub-mkconfig -o /efi/EFI/Gentoo/grub.cfg创建 EFI 启动项(按实际磁盘 / 分区调整 --disk 和 --part):
sudo efibootmgr --create --disk /dev/sda --part 1 \
--loader '\EFI\Gentoo\shimx64.efi' \
--label 'GRUB via shim' --unicode四、路线 A:信任 Gentoo distribution kernel
gentoo-kernel-bin 的内核镜像已由 Gentoo 官方签名,只需把它的证书导入 MOK。
openssl x509 -in /usr/src/linux/certs/signing_key.x509 \
-outform der -out dist_mok.der
sudo mokutil --import dist_mok.der # 重启后在 MokManager 中确认关键:
mokutil --import只是创建一个待确认的导入请求。必须重启,在 shim 弹出的 MokManager 界面中选择 "Enroll MOK" 并确认,证书才会真正生效。
确认后可检查:
sudo mokutil --list-enrolled
sudo sbverify --list /boot/vmlinuz-*-gentoo-dist结果:distribution kernel 可以不经额外签名直接启动。
五、路线 B:自建 key,信任自己的内核和模块
这条线负责:自编内核模块签名、第三方模块(NVIDIA 等)签名、自编 vmlinuz 签名。
5.1 生成并保护私钥
sudo mkdir -p /etc/ssl/private/secure_boot
sudo openssl req -new -noenc -sha256 -x509 \
-outform PEM \
-out /etc/ssl/private/secure_boot/kernel_key.pem \
-keyout /etc/ssl/private/secure_boot/kernel_key.pem
sudo chown root:root /etc/ssl/private/secure_boot/kernel_key.pem
sudo chmod 400 /etc/ssl/private/secure_boot/kernel_key.pem备份私钥(离线介质),没有它将来无法给新内核签名。
5.2 导入 MOK
openssl x509 -in /etc/ssl/private/secure_boot/kernel_key.pem \
-inform PEM -outform DER -out /tmp/kernel_key.der
sudo mokutil --import /tmp/kernel_key.der # 重启后在 MokManager 中确认5.3 make.conf 配置
# /etc/portage/make.conf
MODULES_SIGN_KEY="/etc/ssl/private/secure_boot/kernel_key.pem"
MODULES_SIGN_CERT="/etc/ssl/private/secure_boot/kernel_key.pem"
MODULES_SIGN_HASH="sha512"
SECUREBOOT_SIGN_KEY="/etc/ssl/private/secure_boot/kernel_key.pem"
SECUREBOOT_SIGN_CERT="/etc/ssl/private/secure_boot/kernel_key.pem"并确保全局 USE flags 包含 modules-sign secureboot。
两层签名机制速查:
| 变量组 | 负责范围 | 生效方式 |
|---|---|---|
MODULES_SIGN_* | 内核模块(含 @module-rebuild 的外部模块如 NVIDIA) | Portage 在安装 / 重建时自动调用签名 |
SECUREBOOT_SIGN_* | EFI 文件(GRUB、某些 ebuild 安装的 EFI 二进制) | 各 ebuild 的 secureboot USE flag 触发 |
CONFIG_MODULE_SIG_KEY(内核 .config) | make modules_install 时的 built-in 模块签名 | 内核构建系统自身调用,不经过 Portage |
SECUREBOOT_SIGN_*通常不会自动为你签make install出来的vmlinuz,所以需要手动sbsign。
5.4 编译并签内核镜像
内核 .config 中设置:
CONFIG_MODULE_SIG_KEY="/etc/ssl/private/secure_boot/kernel_key.pem"编译安装:
cd /usr/src/linux
make LLVM=1 -j16 && make modules_install
emerge @module-rebuild # 重建外部模块,此时走 MODULES_SIGN_* 自动签名
make install手动签 vmlinuz:
sudo sbsign --cert /etc/ssl/private/secure_boot/kernel_key.pem \
--key /etc/ssl/private/secure_boot/kernel_key.pem \
/boot/vmlinuz-<version> --output /boot/vmlinuz-<version>更新 GRUB:
sudo grub-mkconfig -o /efi/EFI/Gentoo/grub.cfg六、验证
每次更新签名链后执行以下检查,避免重启后才发现问题:
# 已导入的 MOK 列表
sudo mokutil --list-enrolled
# 查看内核签名信息
sudo sbverify --list /boot/vmlinuz-*
# 查看 EFI 引导项
sudo efibootmgr -v
# 启动后确认 Secure Boot 状态
dmesg | grep -i secure若 GRUB 报 prohibited by secure boot policy 或 shim_lock protocol not found:
- 检查 GRUB 是否以
--disable-shim-lock安装 - 检查内核 / GRUB 是否已用正确的 db key 签名
七、日常维护速查
| 场景 | 要做什么 |
|---|---|
新装 / 切换 gentoo-kernel-bin | 无需额外操作(证书已在 MOK 中) |
自编 gentoo-sources 更新 | 模块自动签 → 手动 sbsign → 更新 grub.cfg → 重启 |
| GRUB 更新 | 重新 grub-mkconfig;若 GRUB 本体更新则重签其 EFI |
| 更换 key | 生成新 key → 导入新证书到 MOK → 删除旧证书 → 重签所有文件 |
八、安全注意事项
- 私钥放在受限路径(如
/etc/ssl/private/secure_boot),chown root:root+chmod 400。 openssl ... -noenc生成无密码保护的私钥。仅在你可以确保路径受磁盘加密保护且权限严格时使用。- 离线备份私钥和证书;没有私钥就无法给新内核签名。
mokutil --import后必须重启并在 MokManager 界面确认,否则新 key 不生效。