清理 /boot 分区最安全的方法是什么?

kob*_*101 302 kernel boot-partition

我为该/boot分区分配了 200 MB 。每当我尝试更新内核时,我都会收到一条错误消息,指出基本上/boot已满。

我可以做些什么来清理/boot和删除/备份旧内核?

Pep*_*rio 370

命令行方法:

首先检查您的内核版本,这样您就不会删除正在使用的内核映像,运行:

uname -r
Run Code Online (Sandbox Code Playgroud)

现在运行此命令以获取已安装内核的列表:

dpkg --list 'linux-image*' | grep ^ii
Run Code Online (Sandbox Code Playgroud)

并通过运行以下命令删除您不再需要/不再需要的内核:

sudo apt-get remove linux-image-VERSION
Run Code Online (Sandbox Code Playgroud)

将 VERSION 替换为要删除的内核版本。

完成删除旧内核后,您可以运行此命令以删除不再需要的软件包:

sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

最后你可以运行它来更新 grub 内核列表:

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

  • `sudo dpkg --list 'linux-image*' | grep ^ii` 可以更轻松地查看已安装的内核。此外,我认为 `update-grub` 是无害的,但不是绝对必要的,它会在您卸载内核时自动运行。 (35认同)
  • `sudo apt-get autoremove` 应该就足够了(通常会留下最后 3 个内核) (28认同)
  • 使用`sudo dpkg --list 'linux-image*' | grep ^ii | awk '{print $2}' | 排序 | egrep "[0-9]-generic" | 头-n -3 | tr '\n' ' '; echo ""` 获取要与 `sudo apt-get remove` 一起使用的包名称列表。`head -n -3` 用于保留系统中剩余的 3 个最新内核。 (9认同)
  • 这是一个很好的答案,但我怀疑它是否可以在大多数(如果不是全部)情况下工作:问题是 `/boot` 已满,因此 `apt-get` 将失败并显示一些错误代码或其他。下面的答案有点“骇人听闻”(我必须承认,我必须坚定自己才能在 `/boot` 中发出 `rm -rf`),但这是唯一可能在这种情况下工作的答案。 (6认同)
  • 我的简单一行代码:`apt-get remove \`dpkg --list 'linux-image*' |grep ^ii | awk '{print $2}'\ | grep -v \\`uname -r\\`\`` (2认同)
  • 对于`dpkg --list`(或等效地,`dpkg -l`),您不需要`sudo`。 (2认同)

fli*_*fly 304

注意:这仅适用于由于 100% 已满 /boot 而无法使用 apt 进行清理的情况

如果 apt-get 由于您的 /boot 为 100% 而无法运行,则您需要先清除 /boot。这可能在部分安装中捕获了内核升级,这意味着 apt 几乎完全冻结,并且apt-get -f install即使该命令不断失败也会不断告诉您运行。

获取内核映像列表并确定您可以在没有的情况下做什么。此命令将显示已安装的内核,但当前正在运行的内核除外sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`。请注意列表中的两个最新版本。您无需担心正在运行的程序,因为此处未列出它。您可以使用uname -r.

制作一个命令来删除 /boot 中所有与您无关的内核文件,使用大括号扩展来保持您的理智。请记住排除当前和两个最新的内核映像。例子:sudo rm -rf /boot/*-3.2.0-{23,45,49,51,52,53,54,55}-*。您还可以使用语法为 {80..84} 的范围。

sudo apt-get -f install 清理使部分安装变得脾气暴躁的原因。

如果遇到包含“内部错误:找不到映像 (/boot/vmlinuz-3.2.0-56-generic)”之类的行的错误,请运行该命令sudo apt-get purge linux-image-3.2.0-56-generic(使用适当的版本)。

最后,sudo apt-get autoremove清除被手动引导清理孤立的旧内核映像包。

建议,运行sudo apt-get updatesudo apt-get upgrade处理可能已备份的任何升级,同时等待您发现完整的 /boot 分区。

建议 2,查看https://help.ubuntu.com/community/AutomaticSecurityUpdates并考虑在 /etc/apt/apt.conf.d/50unattended-upgrades 中将 Unattended-Upgrade::Remove-Unused-Dependencies 设置为 true。这相当于在每次安全更新后运行 autoremove 以确保您清除未使用的内核,但也会删除它认为未使用的其他内容,从而避免将来出现此问题。

  • 这样我就有了下一次重启的最新版本,然后是之前的版本,以防万一在那个重启中出现问题。通常我有足够的空间,所以拥有一些空间并没有什么坏处,它满足了我在任何给定情况下没有足够的备份选项的偏执。 (3认同)
  • 在 _several_ vsphere 虚拟服务器(其中内核会自动升级但之后未删除)中看到这一点后,我编写了一个 [python 脚本](https://github.com/EvanK/ubuntu-purge-kernels) 来自动化它。我希望有更多人关注它 (3认同)
  • 我从未遇到过因无人值守升级而导致的问题。我可以想象这样的场景,这可能是一个问题,主要是在非 deb 打包安装上丢失依赖项假设您安装了 php,决定卸载它并从源代码安装更新版本。此版本具有先前安装提供的依赖项,但 apt 不知道它仍然是必需的。下次运行自动删除时,这些依赖项将消失。如果自动化的话,这可能会有点混乱。如果您不在存储库之外安装,我相信它是完全安全的。 (2认同)
  • 如果您在完全启动时使用 `dpkg --purge`,您将获得以下内容 `$ sudo dpkg --purge linux-image-3.13.0-65-generic dpkg: 依赖问题阻止了 linux-image-3.13 的删除。 0-65-generic:linux-image-extra-3.13.0-65-generic 依赖于 linux-image-3.13.0-65-generic。dpkg:错误处理包 linux-image-3.13.0-65-generic (--purge):依赖问题 - 未删除处理时遇到错误:linux-image-3.13.0-65-generic` (2认同)

Pet*_*ler 57

https://help.ubuntu.com/community/RemoveOldKernels 上有关于此的文档

总结:使用

sudo apt-get autoremove --purge
# and/or:
sudo purge-old-kernels
Run Code Online (Sandbox Code Playgroud)

purge-old-kernels工具可以通过sudo apt install byobu. 以下是其手册页的描述:

该程序将从系统中删除旧的内核和头文件包,释放磁盘空间。它永远不会删除当前运行的内核。默认情况下,它至少会保留最新的 2 个内核,但用户可以使用--keep 参数覆盖该值。

如果您需要复制粘贴解决方案,ReSearchIT Eng 建议如下:

sudo apt install -y byobu
sudo purge-old-kernels -y --keep 1
sudo apt-get -y autoremove --purge
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下 apt 由于挂起的内核而无法工作,建议的修复程序是 catch-22: (3认同)
  • 我认为这应该是目前公认的解决方案。 (3认同)
  • 这比公认的答案要安全得多。不过,我认为 `apt-get autoremove --purge` 应该足够了。 (3认同)
  • 也许事情已经改变了。我收到此错误消息:“E:命令行选项 --keep 与其他选项结合使用时无法理解” (2认同)

lak*_*tak 9

我发现放弃小分区并移至/boot根目录要容易得多。这也可以防止将来出现任何空间不足的问题。

首先将您的数据从引导分区移动到根目录(以 身份运行sudo -s):

cp -a /boot /boot2
umount /boot
rmdir /boot
mv /boot2 /boot
Run Code Online (Sandbox Code Playgroud)

删除(或评论)中的/boot条目/etc/fstab

vim /etc/fstab
Run Code Online (Sandbox Code Playgroud)

更新 grub 并确保一切正确:

update-grub
Run Code Online (Sandbox Code Playgroud)

apt 现在应该可以毫无问题地升级了。

这留下了一个未使用的 200mb 分区(如果您觉得值得麻烦的话,您可以将其用于其他用途)。

  • 这是个好主意,但如果您想对根分区进行全盘加密,则行不通。 (5认同)

Amo*_*rin 6

删除旧内核(以释放 /boot 上的空间)请参阅:http : //askubuntu.com/questions/89710/how-do-i-free-up-more-space-in-boot

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")
Run Code Online (Sandbox Code Playgroud)

然后运行

sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一有效的解决方案......很棒的解决方案 (2认同)
  • 最佳答案!这是唯一对我有用的解决方案;自动删除是愚蠢的;它会尝试重新安装任何具有未满足依赖项的内核,然后再正式删除它们。我一遍又一遍地兜圈子,耗尽了空间。这个答案是黄金。 (2认同)