我的/boot分区已经满了,现在无法升级。无法删除旧的内核以腾出空间。

我的第一个问题是当我尝试执行`apt-get update`或`apt-get upgrade`命令时。在升级过程中,我遇到了以下错误:
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

我尝试运行apt-get install -f命令,并且这是输出结果(在提示上选择了是)
(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

我尝试运行apt-get autoremove,但它给我返回了与apt-get upgrade相同的错误。
当我运行df时,对于/boot,我得到了这个结果:
/dev/sda1                    233191     230297         0 100% /boot

所以,我在其他地方看到说我应该尝试清除旧的内核。我用以下命令检查了我有哪些内核:
$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

当我尝试使用这个方法删除最旧的时,
$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

如何在不搞乱我的安装的情况下释放或扩展启动空间?

3https://help.ubuntu.com/community/RemoveOldKernels - dskrvk
1@dskrvk 是的!为什么 Remove-Unused-Dependencies 不是默认设置呢? - Steven R. Loomis
18个回答

释放根文件系统的空间

要释放根文件系统的空间,您可以尝试执行apt-get clean命令。

如果这不起作用,您可以进入/var/cache/apt/archives目录,并手动从缓存中删除一些文件以腾出空间,例如:

sudo rm linux-headers-*

如果需要的话,删除这里的所有.deb文件是没有问题的 - 这就是apt-get clean的作用。如果再次需要,它们将会被apt自动重新下载。

释放/boot文件系统上的空间

原帖作者有一个单独的/boot分区,而且该分区已满,导致apt系统无法工作。他需要在那里释放空间。

如果空间几乎足够,进入/boot并删除一两个配置文件:

sudo rm config-3.2.0-19-generic-pae

例如,但使用您打算删除的内核版本之一的名称。这将释放一些空间(大约每个144K)。
如果您需要更多的空间,请逐个删除旧的vmlinuz、initrd、abi和System.map文件,直到您有足够的空间(对于我的一个i386内核版本大约为22M)。
无论您做什么,都不要全部删除它们。您至少应保留每种类型的文件的最新两个匹配版本,以及您使用的每种类型的内核。
然后继续执行apt-get install命令。如上所述,它们可能需要重新下载您删除的某些deb文件,但如果是这样,那将自动发生。当您再次使用apt时,通过使用apt-get删除与您删除的文件相对应的软件包来进行清理-以使一切匹配。

/boot中的配置文件是内核配置文件,由内核团队用于构建同名内核。除非您希望用作参考或帮助您构建自己的内核,否则删除它应该是无害的。

最后,您手动从/boot分区中删除一个或两个旧的内核包,为新的内核腾出更多空间。


我尝试删除了几乎所有的配置文件,但似乎还是没有足够的空间。那么还有哪些文件可以安全删除呢?我的根文件系统远未满,所以我不担心它。 - Strifey
我更新了我的回答,并列出了需要手动删除的进一步文件。在我看来,删除3.0.0.13和3.0.0.14版本(每个版本包括五个文件,其中包括abi文件)就足够了。 - John S Gruber
为什么不直接删除/var/cache/apt/archives目录下的所有文件呢?(可以使用sudo apt-get clean命令来完成,或者手动删除。)请注意,我并不建议删除/boot目录下的所有文件。 - Eliah Kagan
@EliahKagan,我已经编辑了答案,建议首先尝试apt-get clean命令,但我不确定在这种情况下是否有效。这对于楼主可能没有帮助,但对于没有单独/boot分区的其他人可能有所帮助。我试图从最温和的步骤到最激进的步骤进行尝试。 - John S Gruber
@EliahKagan 我也想这样做,但是原帖的作者在/boot分区中没有任何.deb文件可供删除。原帖的作者必须手动删除一些旧内核。请参考他上面的评论(第一个评论)。我将进行另一次编辑,建议删除缓存中的所有.deb文件。 - John S Gruber
2这解决了问题。我意识到最后可能要手动删除文件,但是对于通过apt安装的任何东西,我总是不太敢这样做,所以我先在这里问一下。 - Strifey
我想补充一下,类似的问题也可能发生在 /usr/src 目录(当然,前提是 /usr 在独立的分区上)。我曾经通过将旧内核的目录移出该目录来解决这个问题。 - Wtower
11不要使用sudo rm命令从/boot目录中删除文件。相反,使用sudo dpkg --purge命令来删除一些旧的linux-image软件包。然后使用sudo apt-get -f install命令修复损坏的依赖关系。 - jarno
5虽然有时候系统可能会非常满,以至于连dpkg都无法操作。但是可以使用rm命令来解决。 - jarno
尽管你的答案被接受了,但这是一个非常糟糕的解决方案。你很容易导致系统无法启动。而且你甚至没有提供要删除什么的解决方案。你应该考虑删除这个答案。 - machineaddict

在我的情况下,apt命令和dpkg命令无法完成,并且无法删除。 自动更新在安装2.6.32-56-server时失败了。
我的第一步是找到要使用的空间。
cd /boot
du -sk *|sort -n

我大约有30个内核和支持文件。
我执行了uname -a命令来获取正在运行的内核, 我确认我正在使用Linux备用版本2.6.32-43-server,并且对6个不在运行且已经过时的版本进行了tar打包。
tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

我然后执行了一个 rm -rf 命令,删除了我备份的内容。
rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

我将这些命令作为示例展示,你需要根据你的情况决定你要使用哪些命令。
现在我在/boot目录上有了一些空间,我可以运行。
apt-get -f install 

为了清理掉安装失败的2.6.32-56-server版本。
然后我进行了一次操作。
apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

这给了我重新放回备份内容的空间。
tar -xf ~username/boot.tar
rm  ~username/boot.tar    

清理时,我可以运行以下命令:
apt-get autoremove

我重新启动了,现在只使用了/boot的4%。

这是对我来说所有建议中最有帮助的。非常感谢! - Joshua F. Rountree
从/boot目录中删除文件会导致apt和dpkg彻底崩溃,因为它们的安装和卸载脚本在文件丢失时无法正常运行。我不明白你是如何使其正常工作的。 - FizxMike

你可以使用dpkg代替apt-get来删除旧的内核:
sudo dpkg -r linux-image-3.2.0-29-generic

也许使用这个有一些好处,但是当这个不起作用时,@mreiter的建议对我很有效(这个建议是在Ubuntu的IRC支持频道上提出的)。 - Aaron Hall
3@AaronHall 这个回答只包含了 mreiter的回答 的关键部分(最后一行),而且更加简短,因为它没有涉及清理头文件(这在存在单独的 /boot 分区的情况下无助于解决问题)。 - Melebius
几个提醒:使用 uname -r 命令来查看你不能删除的内核(即你当前正在使用的内核)。另外,在删除旧内核后,请记得运行 apt-get -f install 命令来修复可能存在的损坏依赖关系。 - Yajo
如果/boot没有剩余空间,这个选项将失败。 - Alf Pascu

我注意到在启动目录中仍然有一些旧版本的文件。
$ ls /boot
vmcoreinfo-2.6.31-17-server

而且软件包管理器会列出旧版本:
dpkg -l | grep linux-image

我因此使用了这个命令(autoremove会删除我不想删除的较新图片)。
sudo apt-get purge linux-image-2.6.31-17-server

我还剩下一些标题:

dpkg -l | grep linux-headers

所以我做了这个:
sudo apt-get purge linux-headers-2.6.32-34

最后还剩下一个我无法用apt-get purge移除的软件包。
$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

来源:通过dpkg删除标记为rc的软件包
sudo dpkg --purge linux-image-2.6.28-11-server

我发现对我有效的唯一方法是使用Aptitude。
sudo aptitude

然后当它打开时,通常底部会显示一些关于未满足的依赖关系的信息。您可以按下字母g来继续建议的删除操作。它将带您进入一个页面,列出将要发生的事情。

破损内核旁边应该有一个减号-。再次按下g键,它将删除破损的内核。按下q退出。然后您就可以使用sudo apt-get autoremove来清理旧内核并释放空间。

2022年更新: 另一种方法是手动删除一些内核文件,特别是如果没有安装aptitude:

首先检查您正在运行的内核,确保不要删除它:

uname -r

然后列出模块目录:
ls /usr/lib/modules/

例如,这是我其中一个服务器的列表:
drwxr-xr-x 5 root root 4096 Mar  2 14:16 5.4.0-100-generic
drwxr-xr-x 2 root root  250 Apr 27  2021 5.4.0-26-generic
drwxr-xr-x 2 root root  250 May 13  2021 5.4.0-28-generic
drwxr-xr-x 2 root root  250 Oct 26 14:01 5.4.0-72-generic
drwxr-xr-x 2 root root  250 Oct 26 14:01 5.4.0-73-generic
drwxr-xr-x 2 root root  250 Oct 26 14:01 5.4.0-80-generic
drwxr-xr-x 2 root root  250 Mar 11 16:20 5.4.0-84-generic
drwxr-xr-x 2 root root  250 Mar 11 16:20 5.4.0-89-generic
drwxr-xr-x 2 root root  250 Mar 11 16:20 5.4.0-91-generic
drwxr-xr-x 5 root root 4096 Feb  1 14:15 5.4.0-97-generic

从这个目录中删除除最新的2个之外的所有内容。例如:
sudo rm -rf 5.4.0-26-generic 5.4.0-28-generic 5.4.0-72-generic 5.4.0-73-generic 5.4.0-80-generic 5.4.0-84-generic 5.4.0-89-generic 5.4.0-91-generic

还要检查/boot目录,并在那里进行相同的处理。
然后检查是否释放了一些空间:
df -h

最后运行apt来修复损坏的软件包:
sudo apt -f install

1这是唯一有效的答案。所有其他答案都没有起作用,因为软件包管理器要求在删除任何内容之前先安装一个软件包。 - machineaddict

你不能对软件包进行操作,但是你可以对其他文件进行操作。首先,浏览你的主文件夹,看看是否有任何可以删除的东西。如果没有,尝试将大量文件移动到另一个分区(或闪存驱动器),然后尝试使用sudo apt-get install -f来清理软件包依赖问题(很可能你通过dpkg安装了一个.deb文件),然后清除任何旧内核。一旦你安全地拥有至少10 MB的空间,尝试清除不需要的软件或文件。

5主文件夹不在 /boot 目录中。 - Thorbjørn Ravn Andersen

检查使用/var/tmp的情况,使用du -sh /var/tmp/命令。该文件夹中的所有文件都可以删除以释放空间。
然后,您可以运行以下命令来删除旧内核:
sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub

/var/tmp与旧内核有什么关系?而且并不总是安全的删除/var/tmp中的所有内容... - fosslinux
据我所知,较新版本的byobu没有purge-old-kernels脚本。此外,如果/boot已满或存在损坏的依赖关系,您将无法安装byobu。 - jarno

安装linux-purge工具,就像this一样。
然后在终端中运行此命令:
sudo linux-purge --clear-boot --fix

然后继续通过例如去除核心来进行操作。
sudo linux-purge --keep 1 --choose

额外:
如果我没记错的话,在Ubuntu 18.04及更高版本中,有一个默认设置用于无人值守升级,可以删除不需要的内核,但是它无法处理系统已经满了的情况:该设置为Unattended-Upgrade::Remove-Unused-Kernel-Packages true
如果您想使用linux-purge来自动删除内核,而不是使用无人值守升级,您应该通过编辑/etc/apt/apt.conf.d/50unattended-upgrades或者最好是一个覆盖的单独文件(例如/etc/apt/apt.conf.d/52unattended-upgrades-local)来禁用删除未使用的内核;这意味着至少要设置at least
Unattended-Upgrade::Remove-Unused-Dependencies false;
Unattended-Upgrade::Remove-Unused-Kernel-Packages false;

随后设置一个执行systemd服务的命令。
/usr/local/bin/linux-purge --auto-only --keep 1 --yes

随时都可以。

如果空间已满,用户无法安装任何东西。 - alchemy
通常情况下,只是/boot分区满了。此外,这不需要软件包管理器进行安装。 - jarno
最好和最简单的解决方案!非常感谢。已保存。 - Reza Taba

这是我用的东西:
sudo apt-get autoremove linux-image-xxxx

对于所有旧内核都执行此操作,仅保留最近的两个。

如果您想自动删除旧内核并更新GRUB,请参阅:Ubuntu文档


2这应该是被接受的答案。如果你不介意清理一切,甚至不需要指定Linux镜像。 - CyberEd
1我尝试了这个选项来删除旧的内核(更具体地说,是Ubuntu文档中建议的那个选项,即sudo apt-get autoremove --purge),但它失败了,因为/boot没有剩余空间(这也是原问题中的情况)。 - Alf Pascu

使用Synaptic软件包管理器。只需选择要删除的软件包,它会提示您同时删除依赖于它的软件包。根据我的经验,内核软件包总是以两个(或更多,取决于如何计算)相互依赖的组形式出现。通常可以通过使用“本地/过时”筛选器快速找到旧版本。

2在一个(仅文字)服务器上,没有Synaptic,所以对于服务器来说并不是一个可行的解决方案。 - nerdoc