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


Answers:


334

命令行方法:

首先检查您的内核版本,以免删除正在运行的正在使用的内核映像:

uname -r

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

dpkg --list 'linux-image*' | grep ^ii

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

sudo apt-get remove linux-image-VERSION

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

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

sudo apt-get autoremove

最后,您可以运行此命令以更新grub内核列表:

sudo update-grub

34
sudo dpkg --list 'linux-image*' | grep ^ii使仅查看已安装的内核变得容易一些。同样,我认为,它update-grub是无害的,但不是绝对必要的,它在卸载内核时自动运行。
尼尔森2014年

9
使用sudo dpkg --list 'linux-image*' | grep ^ii | awk '{print $2}' | sort | egrep "[0-9]-generic" | head -n -3 | tr '\n' ' '; echo ""去与使用的包名称的列表sudo apt-get removehead -n -3用于将3个最新内核保留在系统中。
Sithsu 2014年

2
我简单的一个班轮:apt-get remove `dpkg --list 'linux-image*' |grep ^ii | awk '{print $2}'\ | grep -v \`uname -r\``
gcb

27
sudo apt-get autoremove应该足够了(通常只剩下最后三个内核)
mbx

6
这是一个很好的答案,但我怀疑它是否可以在大多数(如果不是全部)情况下使用:问题/boot是已满,因此apt-get会因某些错误代码或其他错误而失败。下面的答案有点“骇客”(我必须承认,我必须让自己下决心要rm -rf在中发布/boot),但是唯一可能在这种情况下起作用的答案。
Marco Marco

283

注意:仅在由于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清除已经由手动启动清理孤立的旧内核映像程序包。

在等待您发现完整的/ boot分区时,建议运行sudo apt-get updatesudo apt-get upgrade照顾所有可能备份的升级。

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


3
这样,我可以获取下一次重新启动的最新信息,然后再获取一次最新信息,以防万一在该次重新启动时遇到问题。通常,我有足够的空间,因此拥有一些空间不会有什么坏处,这满足了我在任何给定情况下都没有足够的备份选项的偏执狂。
flickerfly 2014年

1
我从未遇到因无人值守升级而引起的问题。我可以想象这样的场景,这可能是主要围绕非deb打包安装丢失的依赖关系而引起的问题说您安装php,决定将其卸载并从源代码安装更新的版本。此版本具有先前安装提供的依赖关系,但是apt并未意识到仍需要它。下次运行自动删除时,这些依赖项将消失。如果是自动化的,这可能会有些混乱。如果您不安装在存储库之外,我相信它是完全安全的。
flickerfly

3
几台 vSphere虚拟服务器(其中的内核被自动升级但之后没有删除)中看到这一点之后,我编写了一个python脚本来使其自动化。我希望对此有更多关注
EvanK 2015年

2
如果使用dpkg --purge完整启动,您将获得以下内容 $ sudo dpkg --purge linux-image-3.13.0-65-generic dpkg: dependency problems prevent removal of linux-image-3.13.0-65-generic: linux-image-extra-3.13.0-65-generic depends on linux-image-3.13.0-65-generic. dpkg: error processing package linux-image-3.13.0-65-generic (--purge): dependency problems - not removing Errors were encountered while processing: linux-image-3.13.0-65-generic
flickerfly

1
清理完/ boot apt-get install -f后,仍然无法使用。使用df -i我发现,/由于旧内核的源代码文件数量巨大,我的索引节点也用光了/usr/src
Kristofer

51

有关此文档,访问https://help.ubuntu.com/community/RemoveOldKernels

总结:使用

sudo apt-get autoremove --purge
# and/or:
sudo purge-old-kernels

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

3
在我看来,由于内核待定,apt无法正常工作,建议的修复方法是catch-22:
James Bowery,2016年

我必须先通过askubuntu.com/a/304388/284313修复损坏的程序包,之后,您的解决方案才能奏效。
James Bowery

3
我认为这应该是目前公认的解决方案。
Fran Marzoa '17

3
这比公认的答案安全得多。我认为apt-get autoremove --purge应该足够了。
伍德罗·巴洛

7

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

首先,将数据从启动分区移至根目录(以方式运行sudo -s):

cp -a /boot /boot2
umount /boot
rmdir /boot
mv /boot2 /boot

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

vim /etc/fstab

更新grub并确保一切正确:

update-grub

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

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


5
这是个好主意,但如果您想对根分区进行全盘加密,则此方法将无效。
圣保罗Ebermann

是的,在某些情况下,/ boot应该是一个单独的分区。另一个例子是Grub以前无法从LVM分区加载。
堡垒

4

删除旧内核(以释放/ 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]+//')")

然后跑

sudo apt-get update

1
这是唯一起作用的方法。...更好的解决方案
约翰·

最佳答案!这是唯一对我有用的解决方案。autoremove很愚蠢;它会尝试在正式删除所有未满足依赖项的内核之前重新安装它们。我一圈又一遍地圈出了空间。这个答案是金。
朗尼·贝斯特

3

sudo apt-get autoremove

这将删除除最后2个内核之外的所有内核。在Ubuntu 16.04 LTS上进行了测试,当时/boot容量为100%,apt-get upgrade但上次内核升级失败。内核自动删除是一个迭代过程,因此,如果您有多个内核,则一次将它们删除一次。所以要耐心点。


1

当您可以使用工具进行操作时,为什么要手工操作呢?您知道您将在30秒内再次需要它,因为这些天他们需要30秒来推送新的内核更新= P

我建议使用该工具bootnukem

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

然后

sudo bootnukem --dry-run

--dry-run确认外观安全后,将其移除

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.