如何在 Linux 上为 'No space left on device' 识别大目录

TL;DR

cd / 并运行

find_largest_dirs.sh
sudo du -sh * --exclude proc --exclude sys --exclude dev

然后对显示的最大目录重复(通过 cd 到该目录并运行上面的命令)

详细答案

如果你在 Linux 上遇到 No space left on device 错误,这意味着你的一个挂载磁盘(实际上)没有剩余空间可写。

首先,检查哪个设备没有剩余空间:

df_h_output.sh
$ sudo df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.4G     0  2.4G   0% /dev
tmpfs           494M   51M  444M  11% /run
/dev/xvda1       46G   17G   11M 100% /
tmpfs           2.5G     0  2.5G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.5G     0  2.5G   0% /sys/fs/cgroup
tmpfs           494M     0  494M   0% /run/user/1003

检查 Use % 列 - 你可以看到挂载在 /(你的根文件系统,即系统挂载的文件系统)上的设备已满。在 95% 的情况下是根文件系统已满。

**此文章仅涵盖根文件系统已满的情况。**在大多数其他情况下,要么是 /dev/shm(在这种情况下重启系统通常有效),要么是外部驱动器(在这种情况下你必须自己弄清楚哪些目录可以删除)。

概率方法:

此快速检查尝试首先识别最可能的候选者(基于管理员经验)。在你的 shell 中运行此命令:

du_check_common_dirs.sh
sudo du -sh /var/lib/docker /var/lib/mysql /var/lib/postgresql /home/

这可能需要一些时间才能完成。

检查这些目录中是否有一个如此之大以至于占用了你驱动器空间的很大一部分。如果没有,我建议继续使用简单方法:

简单方法:

复制并粘贴此内容到你的 shell:

findLargestSubdir_function.sh
function findLargestSubdir { cd "$1" && sudo du -sb * --exclude proc --exclude sys --exclude dev | sort -n ; }

然后运行

findLargestSubdir_root.sh
findLargestSubdir /

这将告诉你哪个目录最大。计算所有目录的大小可能需要很长时间。*此命令只会在完成后打印任何内容!*数字以字节为单位。

列表中的最后一个元素是最大的!

现在,在最大目录内运行相同的命令以找到最大的子目录。例如,如果 /var 恰好是最大目录,运行

findLargestSubdir_var.sh
findLargestSubdir /var

这将显示 /var 中的最大目录。继续使用 findLargestSubdir 检查最大的子目录,直到你找出是什么占用了磁盘上的所有空间。

高级方法:快得多但更复杂

如果计算所有目录的大小超过 2 分钟,我建议**以 root(sudo)**遵循此交互过程:

  1. ls -1 显示 / 中的所有文件和目录。示例输出:
ls_root_output.sh
# ls -1 /
bin
boot
dev
etc
home
initrd.img
initrd.img.old
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
snap
srv
sys
tmp
usr
var
vmlinuz
vmlinuz.old
  1. 现在运行 du -sh *。这将尝试计算每个文件和目录的大小。通常此命令在尝试计算一个目录的大小时会停滞很长时间(如果该目录中有大量文件)。例如,当你看到输出
du_sh_output.sh
# du -sh *
17M     bin
157M    boot
0       dev
7.7M    etc

然后超过 30 秒没有发生任何事情,ls -1 输出中查找列表中最后一个条目之后的下一个条目(在此示例中为 etc)。在此示例中,这将是 /home。由于 du -sh 计算 /home 大小花费了这么长时间,因此 /home 很可能(虽然不保证)是占用这么多空间的目录。还要检查数字 3. 在你找到的作为最大目录候选的任何目录中,再次运行 ls -1 <directory> 并检查

注意此方法有时倾向于识别递归包含许多文件的目录,而不是总大小较大的目录。因此,如果你无法识别占用硬盘空间很大一部分的任何目录,你可能需要返回。


Check out similar posts by category: Linux