我可以手动删除/boot目录下的旧vmlinuz文件吗?

我的/boot已经满了。apt-get autoremove autoclean不起作用。 我选择手动删除旧的linux-image*。有很多类似的文件:configVERSION, vmlinuzVERSION, initrd.img*VERSION...
这些文件也可以手动删除吗?
VERSION是旧版本(其中一些日期是2012年!)。

你可以手动删除这些文件,但是在系统更新期间,许多文件将会重新生成,除非移除创建这些文件的软件包。在删除这些文件之前,你应该确保自己知道正在运行的Ubuntu版本,以免意外删除正在运行的操作系统镜像。使用命令uname -r可以获取当前执行的版本信息。 - Charles Green
1个回答

可以手动删除几乎任何文件,包括内核和初始RAM磁盘(initrd)。然而,如果这些文件是由软件包安装的(就像这些文件一样),手动删除它们会导致软件包系统处于不一致的状态。因此,不建议手动删除这些文件。我有三个建议供您参考。

方法一:

我的首选是这个:

  1. 输入uname -r来查看当前正在运行的内核版本。例如,我的系统之一返回4.8.0-51-generic
  2. 输入ls /boot/vml*来查看所有已安装的内核。
  3. 从列出的内核中选择一个与当前使用的内核不同且不是最旧的内核(最旧的内核可能是内核系列的“基础”)。位于当前正在运行的内核之前的内核是一个很好的选择。例如,可能是vmlinuz-4.8.0-46-generic
  4. 输入dpkg -S /boot/vmlinuz-4.8.0-46-generic,根据需要更改内核版本。(请注意命令中的大写-S)。这将显示与该内核关联的软件包名称。在此示例中,它是linux-image-4.8.0-46-generic。请注意,您不应将以.efi.signed结尾的内核传递给dpkg -S;这些内核是以不同的方式安装的,无法使用此命令。
  5. 输入sudo dpkg -P linux-image-4.8.0-46-generic(当然要更改内核版本号)。这告诉系统删除该软件包。这可能会导致关于损坏依赖项的投诉。在这种情况下,您应该添加它声称依赖于您要删除的软件包的软件包。在我的情况下,我必须执行命令sudo dpkg -P linux-image-4.8.0-46-generic linux-signed-image-4.8.0-46-generic linux-image-extra-4.8.0-46-generic(删除三个软件包而不是一个)。
  6. 希望前面的命令能够成功并释放足够的空间供sudo apt-get autoremove使用。

方法二:

如果这个方法不起作用,我建议手动删除你没有使用的内核的.efi.signed版本,如果存在的话。这些文件不是直接安装的;它们是通过将标准内核映像与从另一个软件包安装的小型签名文件合并而创建的。因此,删除它们不会像手动删除非签名内核文件那样影响软件包系统。然而,请注意,如果你的计算机启用了安全启动,或者即使没有启用但GRUB配置为通过.efi.signed版本的内核引导,删除这个文件将使得无法引导该内核。因此,重要的是不要删除你当前正在使用的内核的.efi.signed版本。


方法三:

另一种方法是暂时/boot目录从独立分区移到常规根目录(/)文件系统上。请注意,尽管我曾因其他原因做过类似的操作,但我并没有尝试过针对您的确切原因而进行这个确切的过程;但它应该有效。还请注意,这样做相当有风险;在错误的时间点犯错可能导致无法启动您的系统!如果您愿意冒险,可以按照以下步骤操作:

  1. 输入sudo mkdir /boot2创建临时存放内核的/boot2目录。
  2. 输入sudo umount /boot/efi。这个命令在基于BIOS的计算机上会失败,但如果您的计算机通过EFI引导,则是必需的。
  3. 输入sudo cp -a /boot/* /boot2//boot中的所有内容复制到/boot2
  4. 输入sudo umount /boot卸载/boot目录。
  5. 输入sudo rm -rf /boot。这将删除旧的/boot挂载点和可能意外放置在其下的任何文件。
  6. 输入sudo mv /boot2 /boot。这将根据Linux的观点将副本重命名为原始位置。
  7. 继续进行sudo apt-get autoremove操作。这应该成功。
  8. 输入sudo mv /boot /boot2将更新后的内核副本移出路径。
  9. 输入sudo mkdir /boot创建一个新的/boot分区挂载点。
  10. 输入sudo mount /boot恢复原始的/boot分区。请注意,它仍然会过满。
  11. 输入sudo rm -rf /boot/*删除原始/boot分区的内容。
  12. 输入sudo cp -a /boot2/* /boot/将修改后的/boot目录复制到/boot分区。
  13. 重新启动以确保一切正常。
  14. 输入sudo rm -rf /boot2删除临时文件。
一个错误(无论是由我还是由您)可能会造成严重的问题,包括完全无法引导系统。因此,这种方法是一种最后的手段。

向前迈进

非常重要的是定期执行sudo apt-get autoremove命令,以防止/boot分区过度填充。就个人而言,我几乎每次升级软件包时都会执行此操作,尤其是如果我注意到有新的内核被安装。请注意,与此问题相关的有几个官方错误报告:

第一个错误可以修复现有系统,但由于各种原因,即使官方发布的修复程序也不是100%有效。第二个错误是关于在系统安装时做出的选择,所以现有系统将继续受到过小的/boot分区的困扰。解决这个问题的唯一方法是调整分区大小,增加/boot的大小。就个人而言,我认为500 MiB 是这些天/boot的最小合理大小。

第三种方法看起来有点吓人。我得再读两三遍才能弄清楚逻辑。但是在第三步和第十二步,cp不应该是递归的吗?可能还有其他问题,但这是一个开始。 - heynnema
对方法2进行微调的一个办法是将与旧内核相关的/boot目录下的所有文件清零(而不是删除)。这样可以让软件包管理器保持满意,并且可能为使用方法1彻底清除/删除不需要的文件提供足够的空间。 - ubfan1
@heynnema,cp命令中的-a选项会进行递归复制,但与-r不同的是,它会保留所有权和权限。@ubfan1,这是个有趣的想法,而且可能有效。 - Rod Smith