Jam*_*all 5 kernel uefi secure-boot
我可以linux-signed*从我的 Ubuntu 16.10 (yakkety) 安装中安全地卸载和清除软件包吗?
我考虑这个的原因是我的 UEFI bios 不使用安全启动,我的启动分区只有 200 MiB (~210 MB)。我对其余分区进行了加密,我真的不想调整它们的大小以扩展引导分区。
不幸的是,200 MiB 几乎不足以容纳 3 个内核。当前的内核每个约为 61 MiB(包括 abi、config、initrd、map 以及已签名和未签名的内核二进制文件)。加入grub、memtest和分区表,把它推到198左右,这显然没有足够的可用空间来更新内核。我通常只保留 2 个内核(当前内核 + 最新内核),但显然在更新过程中我需要三分之一的空间。如果我没有签名的内核(每个 7.2 MiB),我会没事的。
截至今天,我已经安装了内核 4.8.0 的构建版本 41、45 和 46。
以下会破坏我的系统吗?
apt-get purge linux-signed*
grub-mkconfig -o /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)
(第二行在 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
Run Code Online (Sandbox Code Playgroud)
我安装了这些软件包的所有常规(未签名)版本。
作为一个附带问题,有谁知道为什么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
Run Code Online (Sandbox Code Playgroud)
我不是 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
Run Code Online (Sandbox Code Playgroud)
所以,如果我清除签名的内核包,然后重新运行grub-mkconfig,它应该将常规的未签名内核放入grub.cfg,对吗?
感谢所有帮助和链接。这个周末我花了几个小时并验证了以下内容
linux-signed*软件包,但是linux-generic如果您希望自动内核更新继续正常运行,则必须进行安装。所有 grub、内核和 initramfs 重新配置都是自动处理的。内核安装脚本确实可以毫无问题地处理所有事情。apt-get purge linux-signed* linux-generic+Run Code Online (Sandbox Code Playgroud)是的,您可以摆脱未签名的内核而不会产生任何不良影响,但它们会在内核更新后不断出现。这不能通过管理包来解决,但可以通过一个简短的脚本轻松解决。
apt-get purge linux-signed* linux-generic+Run Code Online (Sandbox Code Playgroud)在第一种情况下,解决方案非常简单。乍一看,它的工作原理与您的假设非常相似。我仍然学到了一些关于内核的 ubuntu 包结构的有用的东西。我想确定我了解副作用或后果,但我也想看看事物是如何构建的。正如一个侧面说明,我用的是通用内核,只是交换generic了lowlatency或者virtual如果这是你的事。此外,这里的一切都基于 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 autoremove 行为。通常,删除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(删除未签名的内核)。我会将其标记为正确答案。