从 16.04 升级到 18.04 失败

从 16.04 升级到 18.04 失败

出现一条通知:

Cannot upgrade secure boot enforcement policy due to unsigned kernels
Your system has UEFI secure boot enabled firmware, and the following kernels present on your system are unsigned:
4.4.0-134-generic
The kernels cannot be verified under secure boot. To ensure your system remains bootable, GRUB will not be upgraded on your disk until these kernels are removed or replaced with signed kernels.

升级已停止。有人能告诉我该怎么办吗?

答案1

您可以在 BIOS/UEFI 设置中关闭安全启动并让未签名的软件包升级,或者在 16.04 系统上安装 linux-signed-generic、shim-signed、grub-efi-amd64-signed 和 fwupdate-signed 并使用安全启动进行升级。


如果您关闭安全启动并重试,升级应该会成功。要安装软件包,请启动终端(Ctrl + Alt + t)并输入:

sudo apt-get install  linux-signed-generic shim-signed grub-efi-amd64-signed fwupdate-signed

答案2

运行 uname -r 后重启后应该显示 18.04。如果重启失败,请进入恢复模式并修复安装 (dpkg),然后正常启动。

启动后,安装 linux-generic,它应该会安装最新的 (4.15) 内核。重新启动并在 grub 菜单中,选择高级并启动到 4.15 内核。然后运行 ​​sudo apt-get install linux-signed-generic shim-signed grub-efi-amd64-signed fwupdate-signed - 现在应该可以正常安装,不会出现错误

然后 sudo apt update && sudo apt upgrade 就可以了。

答案3

我也遇到了这个问题,最近通过签名内核解决了。
警告:替换未签名的内核是危险的;任何微小的错误都可能导致内核崩溃。请注意你正在做什么。

致谢

感谢以下两篇文章,我了解了如何签署内核来解决这个问题,您可以参考它们了解更多细节。

https://sqizit.bartletts.id.au/2019/04/23/fixing-grub-error-about-unsigned-kernel-in-ubuntu/ https://ubuntu.com/blog/how-to-sign-things-for-secure-boot

下面列出了我解决这个问题的笔记。

修复 Ubuntu 中有关未签名内核的 grub 错误

错误信息:

Cannot upgrade Secure Boot enforcement policy due to unsigned kernels

Your system has UEFI Secure Boot enabled in firmware, and the following kernels present on your system are unsigned:

 4.18.20-041820-generic

These kernels cannot be verified under Secure Boot. To ensure your system remains bootable, GRUB will not be upgraded on your disk until these kernels are removed or replaced with signed kernels.

垫片中的证书

  • cd 到要保存证书的目录
  • vim openssl.cnf创建新文件
  • 在文件中输入以下内容(如果愿意,可以修改req_distinguished_name信息,保持原样也可以)。
# This definition stops the following lines choking if HOME isn't
# defined.
HOME                    = .
RANDFILE                = $ENV::HOME/.rnd
[ req ]
distinguished_name      = req_distinguished_name
x509_extensions         = v3
string_mask             = utf8only
prompt                  = no

[ req_distinguished_name ]
countryName             = CA
stateOrProvinceName     = Quebec
localityName            = Montreal
0.organizationName      = cyphermox
commonName              = Secure Boot Signing
emailAddress            = [email protected]

[ v3 ]
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer
basicConstraints        = critical,CA:FALSE
extendedKeyUsage        = codeSigning,1.3.6.1.4.1.311.10.3.6
nsComment               = "OpenSSL Generated Certificate"
  • 创建私钥和公钥
openssl req -config ./openssl.cnf \
        -new -x509 -newkey rsa:2048 \
        -nodes -days 36500 -outform DER \
        -keyout "MOK.priv" \
        -out "MOK.der"

注册密钥

要注册密钥,请使用 mokutil 命令:

sudo mokutil --import MOK.der

按照提示输入密码,该密码将用于确保您确实想要在一分钟内注册密钥。

一旦完成,重启在加载 GRUB 之前,shim 将显示一个蓝屏(实际上是 shim 项目的另一个部分,名为“MokManager”)。使用该屏幕选择“注册 MOK”并按照菜单完成注册过程。您还可以查看要添加的密钥的一些属性,只需使用“查看密钥”确保它确实是正确的密钥。MokManager 会在运行 mokutil 时要求您输入我们之前输入的密码;并将保存密钥,然后我们将再次重新启动。

对要通过 shim 加载的自定义内核进行签名

  • 将我们之前创建的证书转换为 PEM:
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
  • 备份原始 vmlinuz 文件(例如,vmlinuz-4.18.5-041805-generic)
sudo cp /boot/vmlinuz-4.18.5-041805-generic ./
  • 使用以下命令对内核进行签名(相应修改内核名称)
sudo sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-4.18.5-041805-generic --output vmlinuz-4.18.5-041805-generic.signed
  • 将签名的内核移动到/boot/目录(并确保签名的内核与原始内核同名
sudo mv vmlinuz-4.18.5-041805-generic.signed /boot/vmlinuz-4.18.5-041805-generic
  • 使用以下命令重建 grub 菜单
sudo dpkg-reconfigure grub-pc

此命令使 grub 重建其菜单。确保每个 grub 菜单项(特别是签名的菜单项)都有一行linux ...一行initrd ....否则,下次重新启动系统时可能会遇到“内核恐慌”。

重建 grub 菜单可能不是必需的,因为我实际上并没有向 /boot/ 添加任何新内核,但值得运行以确保没有任何错误。

  • 这修复了损坏的软件包的安装。如果一切按计划进行,应该不会再显示错误。
sudo dpkg --configure grub-efi-amd64-signed

相关内容