我可以安全地清除 EFI 签名的内核吗?(或者,我可以摆脱未签名的内核吗?)

我可以安全地清除 EFI 签名的内核吗?(或者,我可以摆脱未签名的内核吗?)

我可以安全地卸载并清除linux-signed*Ubuntu 16.10(yakkety)安装中的软件包吗?

我考虑这个问题的原因是我的 UEFI bios 不使用安全启动,而且我的启动分区只有 200 MiB (~210 MB)。我对其余分区进行了加密,我真的不想调整它们的大小来扩展启动分区。

不幸的是,200 MiB 几乎不足以容纳 3 个内核。当前每个内核大约有 61 MiB(包括 abi、config、initrd、map,以及已签名和未签名的内核二进制文件)。添加 grub、memtest 和分区表会将其推到大约 198,这显然没有足够的可用空间供 apt 更新内核。我通常只保留 2 个内核(当前 + 最后一个),但显然在更新过程中我需要空间来容纳第三个内核。如果我没有已签名的内核(每个 7.2 MiB),那就没问题了。

截至今天,我已经安装了内核 4.8.0 的版本 41、45 和 46。

以下操作会破坏我的系统吗?

apt-get purge linux-signed*
grub-mkconfig -o /boot/grub/grub.cfg

(第二行在 ubfan1 的评论后添加,见下文)

我认为它应该删除以下内核包并阻止安装新的签名内核:

linux-signed-generic
linux-signed-image-4.8.0-41-generic
linux-signed-image-4.8.0-45-generic
linux-signed-image-4.8.0-46-generic
linux-signed-image-generic

我已经安装了这些软件包的所有常规(未签名)版本。

顺便问一下,有人知道为什么文件unicode.pf2(2.3 MiB) 出现在和中/boot/grub/boot/grub/fonts?我比较了文件,发现它们完全相同。我假设这是 grub 菜单上使用的字体,但为什么它会在同一个分区上出现两次?我觉得争论 2.3 MiB 很愚蠢,但这在我的特定情况下也可能产生巨大差异。

谢谢!

为 ubfan1 的评论添加了信息

内核.efi.signed出现在 中的每个菜单项中/boot/grub/grub.cfg。我知道我的 uefi 固件(我猜 bios 不再是正确的术语)不使用安全启动,但 grub 配置文件似乎认为它使用安全启动。显然我的系统可以很好地启动签名的内核,所以也许我可以清除未签名内核呢?

我深入/etc/grub.d/10_linux研究了这些行的来源,并找到了以下代码:

if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then
    sed "s/^/$submenu_indentation/" << EOF
    linux   ${rel_dirname}/${basename}.efi.signed
      root=${linux_root_device_thisversion} ro ${args}
EOF
  else
    sed "s/^/$submenu_indentation/" << EOF
    linux   ${rel_dirname}/${basename}
      root=${linux_root_device_thisversion} ro ${args}
EOF
  fi

我不是 bash 专家,但我认为我在伪代码中遵循了这一点

if /sys/firmware/efi AND /boot/vmlinuz-x.x.x-xx.efi.signed exist
  echo linux vmlinuz-x.x-xx-generic.efi.signed to /boot/grub/grub.cfg
else
  echo linux vmlinuz-x.x.x-xx-generic to /boot/grub/grub.cfg

因此,如果我清除已签名的内核包,然后重新运行grub-mkconfig,它应该将常规未签名的内核放入grub.cfg,对吗?

答案1

感谢大家的帮助和链接。这个周末我花了几个小时验证了以下内容

简短的答案

  1. 是的,您可以清除所有linux-signed*软件包,但如果您希望自动内核更新继续正常运行,则必须安装linux-generic。所有 grub、内核和 initramfs 重新配置都是自动处理的。内核安装脚本确实可以毫无问题地处理所有事情。
    apt-get purge linux-signed* linux-generic+
  2. 是的,您可以删除未签名的内核而不会产生任何不良影响,但它们会在内核更新后不断出现。这无法通过管理软件包来解决,但使用一个简短的脚本很容易修复。

    #!/bin/sh
    #
    # user script: 
    /etc/kernel/postinst.d/zzz-remove-unsigned-kernel
    #
    # after a new signed kernel image is installed, this script removes
    # the unsigned image
    #
    if [ -e "$2.efi.signed" ]; then
        echo "/etc/kernel/postinst.d/zzz-remove-unsigned-kernel: removing $2"
        rm "$2";
    fi
    

较长的答案

在第一种情况下,解决方案非常简单。它的工作方式与你乍一看时所想的差不多。不过,我还是学到了一些关于内核的 ubuntu 包结构的有用知识。我想确保我理解了副作用或后果,但我也只是想看看事情是如何构建的。顺便说一句,我使用通用内核,但只要换成genericlowlatencyvirtual行了,如果你喜欢的话。此外,这里的所有内容都基于 16.10(yakkety)。以下是内核包层次结构: 内核软件包层次

  • linux-signed-generic元包,这意味着它不包含任何代码。它只有一个依赖项列表,其中始终包含最新内核更新的完整安装。“完整”意味着所有内核头文件、内核映像、(分离的)映像签名以及 ubuntu 可以支持的几乎所有设备的额外内核模块。

  • linux-generic是另一个元包,包含除映像签名之外的所有相同实际包。实际的内核映像是仅有的包含在linux-image-x.x.x-yy包中。linux-signed-image-x.x.x-yy包仅包含一个分离的签名,构建脚本会将此签名附加到/boot/vmlinuz-x.x.x.yy-generic并创建/boot/vmlinuz-x.x.x.yy-generic.efi.signed。脚本不会清理未签名的图像。

  • 内核软件包中有特殊脚本/etc/kernel可以修改默认的 apt 自动移除行为。通常,移除linux-signed-generic会标记所有下游软件包以进行自动移除,但对于内核软件包,除非有两个相同版本的较新版本,否则不会发生这种情况。

在第二种情况下(尝试仅保留签名的内核映像),安装完成后删除似乎没有任何后果/boot/vmlinuz-x.x.x.yy-generic。除了签名之外,这两个内核映像完全相同,并且它们共享所有相同的模块和配置文件。但是,一旦安装了更新的内核,它就会留下未签名的映像。幸运的是,每次安装新内核时,都有简单的钩子来运行脚本。 中的任何脚本都由两个参数/etc/kernel/postinst.d执行,一个是内核版本,另一个是映像的完整路径(即)run-parts$1$2/boot/vmlinuz-x.x.x-yy-generic

唯一需要注意的是,必须删除未签名的图像grub 已完成更新grub.cfg。如果/boot/vmlinuz-x.x.x-yy-generic.efi.signed存在,grub 会将该映像添加到grub.cfg并忽略未签名的映像。但是,进程中一定有某个地方仍然需要未签名的映像,因为如果没有它,grub 就无法正确配置。启动 grub 配置的脚本是/etc/kernel/postinst.d/zz-update-grub。我将脚本命名为zzz-remove-unsigned-kernel,以便run-parts在其他所有操作完成后执行它。

编辑:我现在已经将此脚本与一些内核构建更新一起使用,一切似乎都运行良好。我正在使用上面的选项 2(删除未签名的内核)。我将把这个标记为正确答案。

答案2

据我所知,这些.efi.signed内核与常规内核相同,只是它们是用 Canonical 的 EFI 安全启动密钥签名的。因此,如果您没有在安全启动处于活动状态的情况下启动,则可以安全地删除这些.efi.signed内核。如果我正确解析了软件包信息,您应该能够删除linux-signed-image-genericlinux-signed-generic软件包,以防止将来安装对签名内核的更新。

话虽如此,从长远来看,更好的解决方案是增加/boot分区的大小。这可能很麻烦,甚至对您的数据有风险,特别是如果您使用 LVM 或软件 RAID;但是,具体细节在很大程度上取决于您当前的磁盘布局以及出于其他原因更改该布局的计划。请注意,根据您的布局,最好从末尾缩小数据分区,然后/boot在现在缩小的数据分区之后创建一个更大的分区,而不是尝试从头开始缩小数据分区,以便为/boot分区的增长腾出空间。

最后,如果您迫切需要释放几兆字节的空间,而您正在查看/boot/grub目录树中的重复文件,那么您可以考虑完全放弃 GRUB。大多数其他引导加载程序不需要像 GRUB 那样多的文件。/boot如果您在 EFI 模式下启动,我自己的rEFInd 启动管理器可能是最容易安装的,您可以在 USB 驱动器或 CD-R 上试用它,看看在弄乱硬盘之前它是什么样子。如果您在 BIOS 模式下启动,LILO、SYSLINUX 甚至 GRUB Legacy 都是选项,但我暂时没有关于如何安装其中任何一个的说明。

答案3

..signed 内核稍大一些,因此如果您没有在启用安全启动的情况下运行并且想要节省空间,请使用未签名的内核并清除签名的内核。我也认为您重建 grub 的方法会奏效。如果您在重建 grub.cfg 之前断电,您可以随时编辑旧的 grub 菜单并删除签名部分。当然,您可以保留一个签名版本(最新版本)并删除其他版本以查看是否按预期工作,然后对最后一个版本再次执行此操作,这样您就永远不会没有已知的可启动设置。至于 unicode.pf2 文件 - 它们也存在于我的系统中。您可以尝试用指向另一个文件的链接替换一个文件(使用启动媒体,以防您需要将文件放回链接所在的位置)。

相关内容