apt-get:设备上没有剩余空间(12.04)

我已经阅读了所有我能找到的帖子,甚至那些说问题已在其他地方得到解答的帖子,但它们都没有解决我遇到的具体问题。更新管理器运行时出现了与未满足依赖关系相关的错误,并建议使用apt-get install -f命令,但该命令失败并显示以下消息:
Unpacking linux-headers-3.5.0-36 (from .../linux-headers-3.5.0-36_3.5.0-36.57~precise1_all.deb) ...
dpkg: error processing /var/cache/apt/archives/linux-headers-3.5.0-36_3.5.0-36.57~precise1_all.deb (--unpack):
 unable to create `/usr/src/linux-headers-3.5.0-36/arch/arm/mach-iop32x/include/mach/glantank.h.dpkg-new' (while processing `./usr/src/linux-headers-3.5.0-36/arch/arm/mach-iop32x/include/mach/glantank.h'): No space left on device

我怀疑最后的五个字设备上没有剩余空间非常重要,但是df和du都显示有足够的空间。所以我想知道,哪个设备需要更多空间? df -h的输出结果
Filesystem 
Size Used Avail Use% 
Mounted on /dev/sda1 5.5G 4.4G 786M 86% 
/ udev 996M 4.0K 996M 1% 
/dev tmpfs 402M 880K 401M 1% 
/run none 5.0M 0 5.0M 0% /run/lock none 1004M 156K 1004M 1% 
/run/shm /dev/sdb1 30G 1.4G 27G 5% 
/home /dev/sdc1 299G 31G 268G 11% /media/HD-PCTU2 

你的根分区还有空间吗? - don.joey
1请粘贴以下内容:(i)df -h的输出结果和 (ii)mount的输出结果。dpkg在完成工作后会清理文件,所以可能看起来你有足够的空间,但实际上并非如此。建议在开始dpkg之前运行apt-get clean命令。 - January
1在进行apt-get install时,在终端中执行watch -n 1 df -h命令来监视(它会稍微降低IO速度,但您将知道哪个文件系统太小)。 - Emmanuel
问题也出现在Ubuntu 14.04和内核版本3.13.0.108中的一台电脑上,而其他两台电脑没有这个问题。我最初参考了http://askubuntu.com/questions/223143/broken-package-after-update-linux-headers-error-brokencount-0,但这里给出的答案都是相同的。 - XavierStuvw
https://askubuntu.com/questions/911865/no-more-disk-space-how-can-i-find-what-is-taking-up-the-space - martinho
5个回答

我刚刚遇到了同样的问题。我在其他地方看到有关inode的提及,并在终端中运行以检查inode使用情况:
  df -i 

这显示了inode使用率达到了99%。因此,尽管我的磁盘还有足够的空间,但由于inode数量的限制,我无法创建更多的文件。进行一些磁盘清理是解决我的问题的方法。

8我遇到了同样的问题,是由于内核更新没有自动删除旧内核引起的。每次内核更新都会占用大量的inode!--- 我的“安全”解决方案是将两个内核头文件目录移动到不同的文件系统中:cd /usr/src ; cp -a linux-headers-3.2.0-3{2,3}* /home/tmp-hdr ; rm -r linux-headers-3.2.0-3{2,3}*apt-get-install -f,以正确的方式删除其他一些头文件:apt-get purge linux-headers-...,然后将头文件从tmp目录移回:cd /usr/src ; cp -a /home/tmp-hdr/* .。使用apt-get purge删除更多旧内核。 - pabouk - Ukraine stay strong
1请考虑参与那些活动较少的错误报告:Bug #1089195 linux-headers会占用你的inode空间(在LTS版本中),Bug #690911 无格式化安装无法删除旧内核 - pabouk - Ukraine stay strong
@pabouk 我在想,你是否可以使用 dpkg --purge linux-headers-3.2.0-3{2,3}*; apt-get -f install 这个命令,这样就不需要复制了吗? - jarno
@jarno 这是很久之前的事了,但我认为使用 dpkg 或 apt 数据库的所有命令都失败了。我认为这是由于自动升级期间不足的索引节点数导致的依赖损坏和其他不一致性所致。 - pabouk - Ukraine stay strong
一旦脚本发布,可以通过sudo linux-purge --fix来完成所需的磁盘清理。 - jarno
由于空间不足,dpkg 无法工作,您如何删除软件包?我认为只有pabouk的解决方案(手动使用mvcp等命令)是可行的。 - chefarov
pabouk的解决方案确实有效:dpkg --purge <pkg>可以立即删除,即使设备上没有剩余空间。 - Adrian Zaugg

我觉得你的引导分区里面装满了旧的内核镜像,所以没有空间来安装 apt-get 尝试安装的新内核。你可以输入
dpkg -l linux-headers-\* linux-image-\* | grep ^ii

在终端窗口中输入这个命令。当我这样做时,会得到以下结果。
ii  linux-headers-3.8.0-18                    3.8.0-18.28                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-18-generic            3.8.0-18.28                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-3.8.0-19                    3.8.0-19.30                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-19-generic            3.8.0-19.30                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-3.8.0-21                    3.8.0-21.32                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-21-generic            3.8.0-21.32                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-3.8.0-22                    3.8.0-22.33                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-22-generic            3.8.0-22.33                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-3.8.0-23                    3.8.0-23.34                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-23-generic            3.8.0-23.34                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-3.8.0-25                    3.8.0-25.37                            all          Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-25-generic            3.8.0-25.37                            amd64        Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-generic                     3.8.0.25.43                            amd64        Generic Linux kernel headers

由于我有很多,我可以删除一些最旧的

sudo apt-get remove linux-headers-3.8.0-18

如果 apt-get 因为缺少某些软件包依赖项而失败(由于空闲的inode不足,无法安装),您可以直接使用 dpkg
sudo dpkg --remove linux-headers-3.8.0-18

把这个操作重复几次应用在你最旧的linux-headers-*上,你就会有足够的空间了。

4这揭示了另一个问题。每次我尝试运行dpkg时,它告诉我有一个未满足的依赖关系。以下软件包存在未满足的依赖关系: linux-headers-3.5.0-36-generic:依赖于linux-headers-3.5.0-36,但它将不会被安装。而这正是因为没有足够的空间而无法安装的东西。 - Don A
也许在你搞乱启动分区之前,备份一下用户文件是个好主意?我从来没有遇到过这样的麻烦,但如果真的发生了,我会有所有重新安装所需的东西。当然,无论如何,我每天都会备份一次。 - Marc
我本来希望不必去处理引导分区,而是有一种方法可以打破这个无休止的依赖循环。现在我明白了,备份数据并重新开始可能会更容易。既然我知道清理旧物品的重要性,我会养成这个习惯。感谢大家的帮助。 - Don A
完全没有问题...备份总是一个好主意,而且你并没有真正对引导分区进行太多操作,只是用apt-get卸载了一些软件包。这应该很容易。我只是建议你备份数据,因为如果你遇到问题(甚至没有问题),我总是建议备份数据!实际上,我在自己的系统上运行了这些命令来测试它们。我只用了三分钟就移除了linux-headers-3.8.0-18 - Marc
1如果sudo dpkg --remove linux-headers-3.8.0-18再次失败,那就移除sudo dpkg --remove linux-headers-3.8.0-18-generic,它会连同另一个头文件一起被移除。 - Sam
如果没有剩余空间,你就不能使用dpkg - chefarov

我使用了sudo apt-get autoremove命令,它删除了一堆旧的内核头文件包。之后一切都正常了。

在我的情况下,apt-get拒绝执行autoremove,优先考虑需要解决的破损软件包问题。这个破损软件包是由inode饱和引起的。请参考此AskUbuntu帖子 - XavierStuvw
好的,这真是救了我!在更新后,我的 X 会话一直无法进入,只是不断要求重新登录,并且我经常收到“没有剩余空间”的消息。我原以为必须格式化我的硬盘,但你的技巧救了我 :) - user5193682
1哈哈,我运行不了这个,因为我有太多的文件... - Brian Leishman

据我所知,Linux ext*文件系统中的inode限制大约为40亿个,而不是更少,这是一个巨大的文件数量。所以你的问题是有某些东西正在生成大量的文件。 我建议你首先检查一下这个链接: http://blog.scoutapp.com/articles/2014/10/08/understanding-disk-inodes 这样你就能找到是什么填满了你的文件系统的inodes。 我还建议清理apt缓存:
sudo apt-get clean

并且

sudo apt-get autoclean

2其他解决方案都给我报了空间不足的错误。令人惊讶的是,在清理后我可以腾出一些空间。谢谢。 - Yasin Okumuş

如果你的磁盘空间不足,apt-get clean / apt-get autoclean 无法释放足够的空间,并且你有一些可用的内存,可以尝试我的解决方案,链接如下:

https://unix.stackexchange.com/a/726355/250404

我使用了一个RAM磁盘来腾出足够的空间完成apt --fix-broken install,并从中恢复过来。