问题描述
我在我的一台运行16.04的服务器上遇到问题:没有剩余磁盘空间。
我不知道占用空间的是什么。是否有一个命令列出当前目录的大小,所以我可以遍历并最终占用占用所有空间的目录?
最佳解决方案
和Linux一样,完成工作的方法不止一种。但是,如果您需要从CLI执行此操作,这是我首选的方法:
我首先以root用户或sudo运行它:
du -cha --max-depth=1 / | grep -E "M|G"
grep是将返回的行限制为返回值为兆字节或千兆字节范围的行。如果您的磁盘足够大,您可以添加|T
以包含太字节数量。您可能会在/proc
,/sys
和/或/dev
上遇到一些错误,因为它们不是磁盘上的真实文件。但是,它仍应为root中的其余目录提供有效输出。在找到最大的那个之后,你可以在该目录中运行命令,以便缩小你的道路。因此,例如,如果/var
是最大的,你可以这样做下一个:
du -cha --max-depth=1 /var | grep -E "M|G"
这应该引导你解决孩子的问题!
其他考虑因素
虽然上面的命令肯定会起到作用,但我在下面的评论中有一些建设性的批评指出了你可以包括的一些事情。
-
我提供的
grep
可能导致如果目录或文件的名称具有大写字母G或M,则偶尔会返回”K”值。如果您绝对不希望任何K值目录显示,则您需要启动正则表达式游戏更具创造性和复杂性。例如grep -E "^[0-9\.]*[MG]"
-
如果你知道哪个驱动器是问题,并且它上面有其他安装的驱动器,你不想浪费时间,包括在搜索中,你可以将
-x
标志添加到您的du
命令。该标志的手册页描述:-x, --one-file-system skip directories on different file systems
-
您可以对
du
命令的输出进行排序,以使最高值位于底部。只需将其附加到命令的末尾:| sort -h
次佳解决方案
您可以使用ncdu
。它工作得很好。
sudo apt install ncdu
第三种解决方案
我用这个命令
sudo du -aBM -d 1 . | sort -nr | head -20
偶尔,我需要从/
目录运行它,因为我已经在奇怪的位置放置了一些东西。
第四种方案
关于如何找到占据大部分空间的目录,已经有很多很好的答案。如果你有理由相信很少有大文件是主要问题,而不是很多小文件,你可以使用像find / -size +10M
这样的东西。
第五种方案
我不知道Ubuntu并且无法检查我的答案但是根据我很久以前作为unix管理员的经验在这里发布我的答案。
-
找出哪些文件系统空间不足
df -h
将列出所有文件系统,它们的大小和可用空间。如果您调查具有足够空间的文件系统,您只会浪费时间。假设完整的文件系统是/myfilesystem。如果在/myfilesystems的子目录中安装了文件系统,请检查df输出。如果是这样,以下speps必须适应这种情况。
-
找出这个文件系统的文件使用了多少空间
du -sh /myfilesystem
-x选项可用于保证仅考虑作为此文件系统成员的文件。某些Unix变体(例如Solaris)不知道du的-x选项。然后,您必须使用一些变通方法来查找文件系统的du。
-
现在检查可见文件的du是否大约是df显示的已用空间的大小。如果是这样,您可以开始查找/myfilesystem文件系统的大文件/目录以进行清理。
-
找到目录/…/dir使用的最大子目录
du -sk /.../dir/*|sort -n
-k选项强制du以千字节为单位输出sie而不使用任何单位。这可能是某些系统的默认设置。然后你可以省略这个选项。最大的文件/子目录将显示在输出的底部。
-
如果您找到了不再需要的大文件/目录,则可以以适当的方式将其删除。不要打扰输出顶部的小目录。如果删除它们将无法解决您的问题。如果仍然没有足够的空间,则可以在列表底部显示的larges子目录中重复步骤4。
但是如果du输出大约不是df显示的可用空间会发生什么?
如果du输出较大,那么您错过了安装另一个文件系统的子目录。如果du输出小得多,则som文件不会显示在任何目录中。他的现象可能有不同的原因。
-
某些进程正在使用已删除的文件。因此,这些文件已从目录中删除,du无法看到它们。但对于文件系统,它们的块仍然在使用,直到进程关闭文件。您可以尝试找出相关进程(例如使用lsof)并强制它们关闭此文件(例如,通过停止应用程序或通过终止进程)。或者您只是重启机器。
-
目录中的文件不再可见,因为在其父目录之一上安装了另一个文件系统。所以,如果你有一个文件/myfilesysem /subdir /bigfile,现在在/myfilesystem /subdir上安装另一个文件系统,那么你就再也看不到这个文件了
du -shx /myfilesystem
将报告一个不包含/myfilesystem /subdir /bigfile大小的值。找出这些文件是否存在的唯一方法是卸载/myfilesystem /subir并检查
ls -la /myfilesystem/subdir
如果它包含文件。
-
可能有特殊类型的文件系统在磁盘上使用/保留ls命令不可见的空间。您需要使用特殊工具来显示它。
除了使用du命令的这种系统方式之外,您还可以使用其他一些方法。因此,您可以使用find命令查找比您提供的值大的文件,您可以搜索大于您提供的某个值或新创建的文件或具有特殊名称的文件(例如* .log,core,*带.trc)。但是你总是应该按照1中的描述做一个df,这样你才能使用正确的文件系统
第六种方案
如果您还对不使用命令感兴趣,可以使用以下应用程序:Filelight
它可以让您快速查看任何文件夹中使用磁盘空间的内容。
第七种方案
如果尚未执行此操作,请尝试使用sudo apt-get autoremove
删除未使用的文件
第八种方案
我经常使用这个
du -sh /*/
然后,如果我找到一些大文件夹,我会切换到它并进行进一步调查
cd big_dir
du -sh */
如果需要,您也可以自动排序
du -s /*/ | sort -n
第九种方案
不是一个真正的答案 – 而是一个附录。
你的空间很难,无法从@erman的回答中安装ncdu。
一些建议
-
sudo apt clean all
删除已下载的包。安全 -
sudo rm -f /var/log/*gz
清除日志文件超过一周或两周 – 不会删除更新/当前日志。非常安全 -
sudo lsof | grep deleted
列出所有打开的文件,但过滤到已从磁盘中删除的文件。公平安全 -
sudo rm /tmp/*
删除一些临时文件 – 如果某些东西正在使用它们,你可能会破坏一个进程。真的不安全
那个人可能会返回这样的行:
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或您的服务器运行的任何“重”的进程。
第十种方案
我发现像Filelight这样的工具的输出特别有价值,但是,在您的情况下,在服务器上通常没有安装GUI,但du
命令始终可用。
我通常做的是:
-
将
du
输出写入文件(du / > du_output.txt
); -
将文件复制到我的机器上;
-
使用
DuFS
将”mount”输出到临时目录中的du
;根据du
输出,DuFS
使用FUSE创建虚拟文件系统(=实际上没有创建文件,这都是假的); -
在此临时目录上运行Filelight或其他GUI工具。
免责声明:我写过dufs
– 正是因为我经常要找出无头机器上的什么占用磁盘空间。