我在运行16.04的其中一台服务器上遇到了问题:磁盘空间已经用尽。
我不知道是什么占用了这些空间。有没有一个命令可以列出当前目录的大小,这样我就可以遍历并找到占用所有空间的目录了?
我在运行16.04的其中一台服务器上遇到了问题:磁盘空间已经用尽。
我不知道是什么占用了这些空间。有没有一个命令可以列出当前目录的大小,这样我就可以遍历并找到占用所有空间的目录了?
像往常一样,在Linux中,有多种方法可以完成工作。但是,如果您需要通过命令行界面(CLI)完成它,这是我首选的方法:
我首先以root或使用sudo来运行以下命令:
du -cha --max-depth=1 / | grep -E "M|G"
du -cha --max-depth=1 /var | grep -E "M|G"
这应该会引导你找到问题儿童!
额外考虑事项
虽然上述命令肯定能解决问题,但下面的评论中有一些建设性的批评指出了你还可以包括一些其他内容。
我提供的grep
命令可能会导致偶尔返回带有大写G或M的目录或文件的“K”值。如果您绝对不希望出现任何带有K值的目录,您需要提升正则表达式的创造性和复杂性。例如:grep -E "^[0-9\.]*[MG]"
如果您知道哪个驱动器存在问题,并且它上面还挂载了其他驱动器,您不想浪费时间在搜索中包括它们,您可以在du
命令中添加-x
标志。该标志的手册描述如下:du
命令的输出进行排序,使最高值位于底部。只需将以下内容附加到命令的末尾:| sort -h
"^[0-9]*[.]*[0-9]*[MG]"
。 - Xen2050-x
选项让du
只针对那个驱动器进行扫描(在命令行中提供)。你还可以通过管道传递给sort -h
来正确排序以兆字节/千兆字节为单位的可读值。通常我会省略--max-depth
选项,直接搜索整个驱动器,然后根据需要进行适当排序,将最大的文件显示在底部。 - Muzer-x
来搞这个?只需将驱动器的挂载点作为参数传递给du
命令即可。 - alexis/
),使用-x
可以确保我不会错误计算东西。如果你的/
已经满了,而你又有一个单独挂载的/home
或其他目录,使用-x
几乎是必要的,以摆脱无关的东西。所以我发现一直使用它更容易,以防万一。 - Muzer--max-depth
,我还不确定是否完全同意。这样做会强迫你等待系统计算整个系统上每个目录的磁盘使用情况。这会增加很多额外的开销,而你只需自己查看哪个目录要遍历一次最大深度,而无需深入其他目录。 - TopHatdu
显示它。唯一的计算方法是将每个文件和子目录的大小相加,而计算这些大小的唯一方法是将这些大小相加等等。 - Muzerdu -cha /*/
,而不是 du -cha --max-depth=1 /
。 - phuclvsort -hr
命令,它会先显示较大的结果,如果你更喜欢这样的话。我也是先进行排序,然后再进行grep操作,这样仍然可以突出显示“G”或“M”。 - JohnRDOraziocurl http://path/to/ncdu | sh
命令,它将在内存中运行,并使用IO stdin缓存,但这需要一些运气。可能还有一种方法可以创建一个RAM磁盘。 - hanshenriksudo ncdu /
。使用sudo
是因为如果不加sudo,它将无法报告由root拥有的文件夹的大小,而输入/
是因为如果不输入这个,它只会从你所在的文件夹递归地报告下去。 - Max Carrollncdu
支持一个 -x
标志,你可能希望传递该标志以排除 /
下的其他已挂载文件系统。 - dimo414sudo du -aBM -d 1 . | sort -nr | head -20
/
运行它,因为我把一些东西放在了一个奇怪的位置。-d 1
开关的情况下更有用(通常是使用less
而不是head -20
),这样我就可以得到一个完整的递归列出的按照它们消耗的空间排序的文件和目录列表。这样,如果我看到一个占用很多空间的目录,我可以向下滚动查看是否大部分空间实际上被其中某个特定文件或子目录占用。这是找到一些不需要的文件和目录以便释放一些空间的好方法:只需向下滚动,直到您看到您确定不想保留的内容,然后删除它并重复此操作。 - Ilmari Karonensort
在开始输出之前等待输出完成。 - muru已经有很多关于如何找出占用大部分空间的目录的好答案了。如果你有理由相信只有少数几个大文件是主要问题,而不是许多小文件,你可以使用类似以下的方法:
find / -size +10M
ssh -X <你的主机>
,然后从命令行运行你的程序。 - user595510找出哪个文件系统的空间不足
df -h
将列出所有文件系统,它们的大小和可用空间。如果你调查有足够空间的文件系统,那么你只是浪费时间。假设满的文件系统是/myfilesystem。检查df输出是否有挂载在/myfilesystem子目录下的文件系统。如果有的话,下面的步骤必须针对这种情况进行调整。
找出该文件系统中文件占用了多少空间
du -sh /myfilesystem
可以使用-x选项来确保只计算属于该文件系统的文件。某些Unix变体(例如Solaris)不支持du的-x选项。那么你需要使用一些解决方法来找到你的文件系统的du。
现在检查可见文件的du是否大致等于df显示的已用空间大小。如果是这样,你可以开始查找/myfilesystem文件系统中的大文件/目录进行清理。
要查找目录/.../dir的最大子目录,请使用以下命令
du -sk /.../dir/*|sort -n
-k选项强制du以千字节为单位输出大小,没有任何单位。这可能是某些系统的默认设置。然后你可以省略此选项。最大的文件/子目录将显示在输出的底部。
如果你找到了一个不再需要的大文件/目录,可以以适当的方式删除它。不要担心输出顶部的小目录。如果你删除它们,问题不会得到解决。如果你仍然没有足够的空间,那么你可以在列表底部显示的最大子目录中重复第4步。
du -sh /*/
cd big_dir
du -sh */
du -s /*/ | sort -n
sudo apt-get autoremove
命令来删除未使用的文件,如果你还没有这样做的话。不是真正的答案,而是一个附录。
你的空间已经用完了,无法从 @erman 的回答中安装 ncdu。
一些建议:
sudo apt clean all
删除已经下载的软件包。安全sudo rm -f /var/log/*gz
清理一周或两周前的日志文件 - 不会删除较新/当前的日志。大部分安全sudo lsof | grep deleted
列出所有打开的文件,但只显示已从磁盘上删除的文件。相对安全sudo rm /tmp/*
删除一些临时文件 - 如果有进程正在使用它们,可能会干扰该进程。并不是非常安全那个 `lsof` 命令可能会返回类似以下的行:
server456 ~ $ lsof | grep deleted
init 1 root 9r REG 253,0 10406312 3104 /var/lib/sss/mc/initgro ups (deleted)
salt-mini 4532 root 0r REG 253,0 17 393614 /tmp/sh-thd-1492991421 (deleted)
初始行无法做太多事情,但第二行建议salt-minion打开了一个已删除的文件,并且一旦由服务重新启动关闭所有文件句柄,则磁盘块将返回。
其他常见嫌疑人包括syslog / rsyslog / syslog-ng、squid、apache或任何您的服务器运行的“重型”进程。
du
命令始终可用。du
的输出写入文件(du / > du_output.txt
);
- 将文件复制到我的计算机上;
- 使用DuFS
在临时目录中“挂载”du
的输出;DuFS
使用FUSE根据du
的输出创建一个虚拟文件系统(实际上没有创建任何文件,都是虚假的);
- 在这个临时目录上运行Filelight或其他图形界面工具。dufs
- 正是因为我经常需要找出无头机器上占用磁盘空间的原因。
export DISPLAY=:0.0; ssh -Y <user>@<server> filelight
(将filelight
替换为你喜欢的工具)。当然,如果绝对没有剩余空间,如果你还没有安装该工具,你需要使用其他工具! - David Spillettdu -sh * | sort -h
。 - Dnyaneshwar Harer