磁盘上没有更多空间

磁盘上没有更多空间

我正在使用 Ubuntu 14.04。有一段时间我无法同时运行更多程序。这是为什么df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G   25G  3.4G  88% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev             16G  4.0K   16G   1% /dev
tmpfs           3.2G  724K  3.2G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none             16G   59M   16G   1% /run/shm
none            100M   40K  100M   1% /run/user
/dev/sda2       438G  138M  416G   1% /scratch
AFS             8.6G     0  8.6G   0% /afs

以及df -i

Filesystem       Inodes   IUsed    IFree IUse% Mounted on
/dev/sda1       1875968 1875968        0  100% /
none            4106915      11  4106904    1% /sys/fs/cgroup
udev            4103190     499  4102691    1% /dev
tmpfs           4106915     524  4106391    1% /run
none            4106915       3  4106912    1% /run/lock
none            4106915     122  4106793    1% /run/shm
none            4106915      27  4106888    1% /run/user
/dev/sda2      29138944     709 29138235    1% /scratch
AFS             9000000       0  9000000    0% /afs

我也尝试过这里的建议:bash:echo:写入错误:设备上没有剩余空间,没有帮助,实际上它使情况变得更糟。现在,如果我进入终端并部分写下文件夹的名称,我按下Tab 并得到:

cd Pybash: cannot create temp file for here-document: No space left on device

我只是想写

cd Python

编辑:的输出sudo du -hxd1 /是:

1.5G    /var
22G /usr
18M /etc
16K /lost+found
36K /home
349M    /opt
68K /tmp
9.7M    /bin
4.2M    /libx32
12K /.config
2.5M    /root
4.0K    /mnt
4.0K    /lib64
13M /sbin
81M /boot
505M    /lib
3.5M    /lib32
12K /media
4.0K    /srv
25G /

答案1

空间不是这里的问题。你有一个目录,里面有很多空文件(或接近空文件)。每个文件都占用一个 inode,而且你已经用完了它们。找到该目录:

for i in /* ; do echo "$i" ; find "$i" | wc -l ; done

(您应该以 root 身份执行此操作)。这可能会列出一个包含大量文件的目录。深入研究,直到找到耗尽 inode 的文件。删除所有这些文件。然后您暂时就没问题了。当然,这些文件来自哪里又是另一个故事。

答案2

从中可以看出df -h,您的根分区上仍有剩余空间。但是,df -i显示您的 inode 已用完。在我的计算机上,我的根分区上已使用了 7.3G,但只使用了 320,000 个 inode,因此您可能在某个地方有很多非常小的文件堵塞了系统。

有关 where 的讨论,请参见Stack Exchange - 查找 inode 的使用位置我将尝试从该页面执行以下操作:

sudo find / -xdev -printf '%h\0' | sort -z | uniq -cz | sort -nrzk 1 | tr '\0' '\n' | head -n 50

如果您使用的是较新版本的 Ubuntu(例如 15.10),那么这个较短的命令可能也会更快:

sudo du / --inodes -xS | sort -rh | head -n 50

两者都会为您提供按其使用的 inode 数量排序的目录列表。您可能会找到一个数字非常高的目录(可能在/var某个地方)。这应该可以让您了解可以删除哪些文件,但如果您有任何疑问,请先在此处询问。

作为正常情况的参考,在我的计算机(运行 Ubuntu 15.10)上,我从该命令获得以下输出:

3297    /usr/share/app-install/desktop
3022    /usr/share/man/man3
2325    /usr/bin
2149    /usr/share/man/man1
2104    /usr/share/app-install/icons
1816    /usr/lib/x86_64-linux-gnu
1089    /usr/src/linux-headers-4.2.0-19/include/linux
1089    /usr/src/linux-headers-4.2.0-18/include/linux
1089    /usr/src/linux-headers-4.2.0-16/include/linux
...

这里是对更简单命令的解释。 sudo需要以 root 身份运行 du 命令,这样我们才能找到普通用户可能无法读取的文件夹中的文件。 du /给出根目录的磁盘使用情况/--inodes告诉它列出 inode 使用情况,-S仅列出目录本身中的文件而不列出子目录中的文件,并且-x不要跨越文件系统边界(因为您的问题肯定是在/而不是 ,例如/scratch)。然后我们将该命令的输出通过管道传输到 以sort查找最严重的违规者;-r反转排序使最大的在顶部,并按-h数字顺序排序而不是按字母顺序排序。最后,head -n 50只输出前 50 行(即最严重的 50 名违规者)。


这里是对更复杂命令的解释。 sudo需要以 root 身份运行 find 命令,这样我们才能在普通用户可能无法读取的文件夹中找到文件。 find /给出根目录下所有文件的列表/-xdev告诉find不要跨越文件系统边界(因为您的问题肯定是 on/而不是 on,例如/scratch);-printf '%h\0'打印以零字节结尾的目录名。然后我们将该命令的输出通过管道传输到sort -z,然后uniq -cz计算每个目录被打印了多少次(即每个目录中有多少个文件);因为需要排序列表,sort所以这里是需要的。然后我们排序以找出最严重的违规者;反转排序使最大的在顶部,并按数字顺序排序而不是按字母顺序排序。 用新行替换零字节。最后,只输出前 50 行(即最严重的 50 个违规者)。uniq-r-ntr '\0' '\n'head -n 50

相关内容