升级时,磁盘空间不足。

我在软件更新程序中进行每日更新时遇到了一个错误。它显示如下信息:
The upgrade needs a total of 25.3 M free space on disk `/boot`.
Please free at least an additional 25.3 M of disk space on `/boot`.
Empty your trash and remove temporary packages of former installations 
using `sudo apt-get clean`.

我尝试在终端中输入“sudo apt-get clean”,但仍然收到这个消息。我阅读的所有页面似乎都是给有经验的Ubuntu用户的。我正在运行Ubuntu 12.10。我想升级到13.04,但我知道我必须先完成这些步骤。
这是在终端中输入“cat /etc/fstab”的输出:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/ubuntu-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=fa55c082-112d-4b10-bcf3-e7ffec6cebbc /boot           ext2    defaults        0       2
/dev/mapper/ubuntu-swap_1 none            swap    sw              0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
matty@matty-G41M-ES2L:~$ 

df -h的输出结果:

Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu-root  915G   27G  842G   4% /
udev                     984M  4.0K  984M   1% /dev
tmpfs                    397M  1.1M  396M   1% /run
none                     5.0M     0  5.0M   0% /run/lock
none                     992M  1.8M  990M   1% /run/shm
none                     100M   52K  100M   1% /run/user
/dev/sda1                228M  222M     0 100% /boot
matty@matty-G41M-ES2L:~$ 

而且 dpkg -l | grep linux-image 的结果是:
ii linux-image-3.5.0-17-generic 3.5.0-17.28 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-18-generic 3.5.0-18.29 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-19-generic 3.5.0-19.30 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-21-generic 3.5.0-21.32 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-22-generic 3.5.0-22.34 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-23-generic 3.5.0-23.35 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-24-generic 3.5.0-24.37 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-25-generic 3.5.0-25.39 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
ii linux-image-3.5.0-26-generic 3.5.0-26.42 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP
iF linux-image-3.5.0-28-generic 3.5.0-28.48 i386 Linux kernel image for version 3.5.0 on 32 bit x86 SMP

你能编辑你的问题,包括 df -hls -l /boot 的输出吗? - Alaa Ali
1此外,您的 /etc/fstab 的内容可能会有所帮助。看起来 /boot 被挂载在一个单独的分区上。 - Chuck R
1就像 @Githlar 说的那样,你的 fstab 文件可以提供关于硬盘分区的信息。 - ssoto
那么,我要怎样才能访问fstab呢?我对Linux相当陌生。有没有类似于Windows的比喻可以帮助理解?@alaa 感谢你的帮助。 - carmatt95
1fstab是一个包含在计算机启动时挂载的分区信息的文件。要显示此文件的内容,请在终端中键入cat /etc/fstab。将输出复制并添加到您的问题中(您可以编辑您的问题)。同时,复制df -hdpkg -l | grep linux-image的输出。 - Alaa Ali
不确定你是否收到了更新,所以我给你打个标签。@Alaa 谢谢。 - carmatt95
1你的问题是/boot分区中所有额外的linux-image...文件占用了空间 - 你只有6MB的可用空间。使用sudo dpkg -P purge 'older_linux_image_filename'命令删除除最新版本(3.5.0-28.48和3.5.0-26.42)以外的所有版本。这样应该可以让你进行更新/升级操作。 - douggro
在你做任何事情之前,uname -r 的输出是什么? - Alaa Ali
顺便说一句,我刚刚提交了一个关于这个问题根本原因的错误报告:https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1465050 - Rod Smith
3我刚刚不得不运行sudo apt-get autoremove来解决这个问题。 - Juampy NR
@Lekensteyn在这个帖子中比其他回答更好地回答了这个问题http://askubuntu.com/a/90219/22568 - Tom
我已经制作了一个高级脚本,可以在棘手的条件下完成工作。一旦达到我的赏金目标,我将公开发布它:https://www.bountysource.com/issues/38300038-feature-request-the-command-should-work-like-this - jarno
10个回答

注意:这个答案更多的是解释而不是提供删除旧内核的最佳/最简单方法。要了解删除旧内核的最佳/最简单方法,请查看其他答案。
好的,根据您发布的/etc/fstab的输出,似乎您的/boot被挂载在一个单独的分区上,并且根据df -h的输出,该分区已满。这是因为安装了不需要的旧内核;您可以通过查看您发布的dpkg -l | grep linux-image的输出来判断,其中可以看到多个具有不同版本的"linux-image"。我们需要删除旧版本。
首先,我希望你在终端中运行命令uname -r,这将显示你当前正在使用的内核版本。我们绝不希望删除该内核版本。该命令会显示类似于3.5.0-26-generic的内容。请记下那个数字,即26!接下来的命令将假设你正在运行该内核。
删除旧内核版本的命令是:
sudo apt-get purge linux-image-x.x.x-xx-generic

...其中x字符是数字。所以,在您的情况下,因为您有很多旧版本(17、18、19等等),我们需要为每个版本运行这个命令,像这样:
  • sudo apt-get purge linux-image-3.5.0-17-generic
  • sudo apt-get purge linux-image-3.5.0-18-generic
  • sudo apt-get purge linux-image-3.5.0-19-generic
...等等。但是,有一种方法可以通过一个命令完成所有操作。该命令如下(请勿立即运行该命令!请先阅读以下内容。):
sudo apt-get purge linux-image-3.5.0-{17,18,19,21,22,23,24}-generic

此命令将删除括号中提及的版本。我没有包括版本25、26和28,因为以下原因:

  • 显然不包括26,因为那是您当前正在运行的内核版本!那是我们从命令uname -r中获取的版本,还记得吗?我们永远不希望删除它!
  • 没有包括28,因为那是您的升级尝试要升级到的版本(您可以从其旁边的iF状态知道,表示它处于“部分配置”状态)。
  • 没有包括25,因为保留至少一个旧版本通常是良好的做法。所以,既然您正在运行26,我们会保留25,因此不会将其包含在上述命令中。
如果uname -r中的最后一个数字是26(或28,甚至25),那么运行上述命令是安全的。在提示时输入密码,并在询问时输入y。这将显示一堆行,并最终返回到命令提示符(在您的情况下,可能是matty@matty-G41M-ES2L:~$),希望没有错误发生。完成后,执行df -h并查看最后一行,即以/dev/sda1开头的行。您应该发现它现在有更多的空间,并且使用的百分比小于之前的100%。现在您可以继续进行更新。

1太好了!它起作用了!非常感谢!额外问题:当我第一次下载Ubuntu时,我不小心删除了主目录中的“图片”文件夹。因此,侧边栏上没有“图片”选项卡。我通过创建一个名为“图片”的文件夹来解决这个问题,但它没有显示在侧边栏上。你知道怎么让它显示在那里吗?我尝试了点击和拖动,但没有成功。 - carmatt95
3不客气!关于另一个问题,请提出另一个问题,我会回答它。这样,那些正在寻找解决方案的人就可以找到它了。 - Alaa Ali
另外,@carmatt95,我只是好奇,你的uname -r命令的输出是什么? - Alaa Ali
我的输出就像你猜的一样,是“3.5.0-26-generic”。 这是我新帖子的链接:http://askubuntu.com/questions/301244/picture-tab-is-missing - carmatt95
所描述的解决方案不起作用,因为apt-get purge仍然会尝试在删除旧内核之前安装损坏的新内核,并在无法执行此操作时停止。 - ali
16每次我回来参考这个,我都希望能给它点赞...现在应该已经有很多了。 - sevenseacat
4是的,又回到这里来参考同样的东西。你会觉得我现在应该记住了。 - sevenseacat
1我也经常回来这里。出于好奇,如果有人清除了当前的内核版本(以例子中的26为例),最好的(或者至少是一个可行的)恢复方式是什么?虽然我没有这样做,但如果发生了这种情况,知道如何修复会很好。 - Reinstate Monica -- notmaynard
1如果你没有重新启动,我认为你可以使用sudo apt-get --reinstall install linux-image-x.x.x-xx-generic来重新安装它。否则,按照这里的答案应该能解决问题:http://askubuntu.com/q/561251/52726。 - Alaa Ali
我正在运行4.2.0-19版本,遇到了同样的问题。我清除了旧的Linux映像。(我觉得这个方法有效 :) ) - moldovean
@iamnotmaynard 我做了。幸运的是,有一种方法可以返回到之前的状态。这并不是我最光辉的时刻。 :) - simbabque
5一个更简洁的命令来清除所有旧内核是:sudo apt-get autoremove --purge - ctrueden
@ctrueden除了在Ubuntu 14.04上无法使用,如果用户通过软件更新程序安装了内核。总的来说,它不能清除手动安装的内核。而且在某些情况下,系统可能会变得非常满,无法正常运行。 - jarno
清理过多的头文件包也非常重要。它们包含大量文件,可能导致系统的索引节点耗尽。 - jarno
我使用 sudo apt-get purge "${kernels_to_delete[@]}" 命令从我的37个内核中删除了35个,其中 kernels_to_delete 是包含它们的一个Bash数组。这样在我的705M的/boot分区上只释放了大约120MB的空间。我遇到了很多类似以下的错误信息:Purging configuration files for linux-image-5.4.0-59-generic (5.4.0-59.65) ...rmdir: failed to remove '/lib/modules/5.4.0-59-generic': Directory not empty。请问我的问题是什么,如何修复? - Gabriel Staples
对我没起作用。我认为这是我在半年内无法解决的第四个问题,有时是操作系统问题,有时是内核问题,例如目前我没有声音,因为内核更新引入了一个无法在6个月内恢复或修复的错误。连 FreeBSD 都比这更稳定。 - inf3rno
你还可以使用正则表达式来选择要删除的图像。添加 --dry-run 标志可以让你在不删除错误图像的风险下检查是否选择了正确的图像:$ sudo apt-get purge '^linux-image-5.1.*-generic' --dry-run。如果你的正则表达式按预期工作,你可以移除 dry run 标志来实际删除这些图像。 - undefined
运行$ sudo apt-get autoremove之后,这可能会释放相当多的额外空间。 - undefined

您可以安装 Ubuntu-Tweak。按照以下步骤进行安装: 打开终端。 使用以下命令添加所需的存储库:
sudo add-apt-repository ppa:tualatrix/ppa

更新软件列表的命令为:
sudo apt-get update

最后,使用以下命令安装Ubuntu Teak:
sudo apt-get install ubuntu-tweak

之后,打开Dash并输入“ubuntu tweak”。
然后转到“清理工具”选项卡,选择“应用程序”,“个人”和“系统”复选框,并点击右下角的“清理”按钮。

9比起在命令行中瞎搞,试图删除除了当前内核以外的所有内核(即使它们有不同的版本,不仅仅是以-32结尾的),还有额外的软件包,Ubuntu Tweak要好得多。它为我节省了5分钟,谢谢! - POMATu
更加方便。 - Saeed Amiri
我无法添加PPA,但是我从项目的网站ubuntu-tweak.com下载了.deb文件。 - Luigi Siri
不需要在Ubuntu 14.04上添加PPA。 - Alex Jones
1@edwardtorvalds 当然你可以在14.04和14.10上通过.deb包安装它,而不需要添加其PPA,但这并不是最理想的方式。你希望通过PPA安装它的原因是因为它能确保更新。 - αғsнιη
我需要在Ubuntu 14.04 LTS上添加PPA。 - ollydbg23

一个快速的方法来删除所有未使用的内核和头文件(不包括当前正在运行的内核)已经被@Lekensteyn指出,在他对问题“如何在/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]+//')") 

这应该为您释放足够的空间以进行升级。



如果你不确定如何表达“这个错误也影响到我”的话,因为它并不是很明显的话,请参考我在这里的回答:https://askubuntu.com/questions/521105/is-the-affects-me-button-in-launchpad-gone/1391526#1391526。 - Gabriel Staples
这个错误已被标记为重复。另一个错误报告已被关闭并修复。 - Flimm

在我的家用Ubuntu系统上,我遵循了一个类似于发布的方法,但它更简单,并且清理了更多的空间,包括内核头文件等。
1. 我检查正在运行的内核,这非常重要,不能对其进行干扰。 uname -a
2. 然后,我查看 /boot 目录,目的是删除与当前运行的内核无关的所有与内核相关的文件。这样我就可以得到一个我想要删除的所有内核版本的列表,例如:3.5.0-17,3.5.0-18 ls -l /boot
3. 现在,我从清除列表中取出第一个内核版本,并找到与其相关的所有软件包。 dpkg -l | grep 3.5.0-17
4. 从系统中清除它们 sudo apt-get purge <以空格分隔的软件包列表> 5. 回到第 3 步,并选择清除列表中的下一个内核版本。
6. 完成

marianoju的答案真的很有帮助,除了我在使用apt purge时遇到了一个错误。我找不到强制选项。

将较低级别的dpkg结合起来让我能够继续进行:

sudo dpkg -r $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' \
               | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")

太棒了!我不得不在最新版本的Ubuntu上添加modules-extra才能得到{image,headers,modules-extra} - undefined

我遇到了这个错误,这篇文章帮了我很大的忙。
我使用了df -h命令来查看启动盘已满,uname -r命令查看版本,然后使用上面列出的purge字符串来删除旧内核。单个内核的清理成功了,但对于多个内核来说没有成功(至少对我来说)。
我在Windows的东西里找到了这些文件;我无法删除它们,只能使用终端,但它确实显示了我之前安装的旧版本。
我不知道为什么/boot(sda2)要分区,而且为什么这么小。但现在我可以再次使用Ubuntu更新程序了。
我尝试了一些方法,比如sudo apt-get updatesudo apt-get upgradesudo apt-get clean,还试过了免费软件Bleachbit。使用清理字符串时,请不要针对当前版本进行清理。希望这对某人有所帮助。

编辑:我认为您不必将“-generic”添加到清除字符串中。 - Brian P

你有安装任何未使用的旧内核镜像包吗?这些可能占用了/boot上的空间。我建议使用以下命令来检查已安装的内核包集合:
dpkg -l "linux-image*" | grep "^i"

这应该提供了已安装的内核映像包集合的概述。对于那些未被使用且不会被预期用于恢复目的的linux-image包,例如,我喜欢保留至少一个内核版本作为备份,否则,您可以使用您喜欢的打包工具(如aptitude)删除任何此类未使用的包。
我还建议查看相关的inux-headerslinux-image-extras(如果适用)、linux-sourcelinux-tools包,以及可能与任何未使用的linux-image包一起安装的包。

我怀疑很少有人会遇到这个问题,但我在这里把它记录下来,以备有需要的人参考。
我的问题是,当我编译不同的自定义内核时,空间用尽了。我清理空间的方法是进入每个我曾经工作过的内核目录,并运行“sudo make clean”命令。
- 进入内核源代码目录:$ cd /usr/src - 进入自定义内核名称目录:$ cd linux-image-custom_kernel_name - 运行清理命令:$ sudo make clean

如果你有这些东西,你可以尝试使用下面的命令来删除旧的内核镜像包。
sudo apt autoremove

之后你就可以进行更新了