Bootstrap

解决linux内核因缺少签名而无法安全启动的方法

方法 1: 禁用 Secure Boot

  1. 进入 BIOS/UEFI 设置

    • 重启电脑。
    • 在开机时按下特定键(如 F2, DEL, 或 ESC,具体按键因设备而异)进入 BIOS/UEFI 设置。
  2. 查找 Secure Boot 设置

    • 在 BIOS/UEFI 设置中,通常在 SecurityBoot 菜单中可以找到 Secure Boot 选项。
  3. 禁用 Secure Boot

    • Secure Boot 设置为 DisabledOff
  4. 保存并退出

    • 保存更改并退出 BIOS 设置(通常按 F10)。

重启后,你应该能够使用未签名的内核启动。


方法 2: 为内核签名

如果你不想禁用 Secure Boot,可以手动为内核签名。以下是步骤:

a. 生成密钥对
  1. 创建一个新的签名密钥对:

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My Kernel Signing Key/"
    
    • MOK.priv 是私钥文件。
    • MOK.der 是公钥文件,用于注册到系统。
  2. 添加权限保护密钥文件:

    chmod 600 MOK.priv
    

b. 签名内核映像

假设你编译的内核映像位于 /boot/vmlinuz-<version>,运行以下命令进行签名:

sudo sbsign --key MOK.priv --cert MOK.der --output /boot/vmlinuz-<version>.signed /boot/vmlinuz-<version>

此命令会生成一个签名的内核映像。

c. 注册签名密钥
  1. 注册密钥到系统的 MOK(Machine Owner Key)数据库:

    sudo mokutil --import MOK.der
    
  2. 系统会要求设置一个密码,这个密码稍后会在系统重启时使用。

  3. 重启系统,按提示进入 MOK 管理界面并完成密钥注册:

    • 选择 Enroll MOK
    • 输入之前设置的密码。
d. 使用签名内核启动

重启后,你可以正常使用签名的内核映像。


方法 3: 编译时关闭内核签名检查

如果你正在编译自己的内核,可以禁用签名检查。在内核配置中,执行以下步骤:

  1. 进入内核源码目录:

    cd linux-source-*

  2. 打开配置菜单:

    make menuconfig

  3. 查找并禁用以下选项:

    • CONFIG_MODULE_SIG=y
    • CONFIG_MODULE_SIG_FORCE=y

    将它们设为 n 或完全去掉。

  4. 保存配置并重新编译内核。

重新编译的内核不会强制要求模块签名验证,从而跳过证书检查。


总结

  • 如果你对安全性要求不高,建议直接禁用 Secure Boot(方法 1)。
  • 如果希望保持 Secure Boot 的启用状态,可以选择签名自己的内核(方法 2)。
  • 编译内核时禁用签名验证(方法 3)适用于不依赖 Secure Boot 环境的场景。

根据你的实际需求选择适合的方法即可解决问题。

;