我的一台运行16.04的服务器遇到了问题:磁盘空间不足。
我不知道占用了什么空间。有没有列出当前目录大小的命令,所以我可以遍历并最终占用所有空间的目录?
export DISPLAY=:0.0; ssh -Y <user>@<server> filelight
(filelight
用您喜欢的工具代替)。当然,绝对没有剩余空间,如果您尚未安装该工具,则仍然需要使用其他工具!
我的一台运行16.04的服务器遇到了问题:磁盘空间不足。
我不知道占用了什么空间。有没有列出当前目录大小的命令,所以我可以遍历并最终占用所有空间的目录?
export DISPLAY=:0.0; ssh -Y <user>@<server> filelight
(filelight
用您喜欢的工具代替)。当然,绝对没有剩余空间,如果您尚未安装该工具,则仍然需要使用其他工具!
Answers:
与Linux中一样,有多种方法可以完成工作。但是,如果需要通过CLI进行操作,这是我的首选方法:
我首先以root或sudo的身份运行它:
du -cha --max-depth=1 / | grep -E "M|G"
grep将返回行限制为以MB或Gigabyte范围内的值返回的行。如果磁盘足够大,则也可以添加|T
以包括TB级的数量。您可能会在/proc
,/sys
和/或上遇到一些错误,/dev
因为它们不是磁盘上的真实文件。但是,它仍应为根目录中的其余目录提供有效的输出。找到最大的目录后,可以在该目录内运行命令以缩小罪魁祸首的范围。因此,例如,如果/var
最大的话,您可以接下来执行以下操作:
du -cha --max-depth=1 /var | grep -E "M|G"
那应该导致您遇到问题的孩子们!
其他注意事项
尽管上面的命令肯定可以解决问题,但我在下面的评论中提出了一些建设性的批评,指出了您还可以包括的一些内容。
grep
如果目录或文件的名字有一个大写G或M.如果你绝对不希望任何K个有价值的目录显示出来,你会想起来的返回提供了可能导致偶尔的“K”值I您的正则表达式游戏更具创意和复杂性。例如grep -E "^[0-9\.]*[MG]"
如果您知道哪个驱动器是问题所在,并且它上面还有其他装载的驱动器,而且您不想浪费时间在搜索中,则可以将-x
标志添加到du
命令中。该标志的手册页描述:
-x, --one-file-system
skip directories on different file systems
您可以对du
命令的输出进行排序,以使最大值位于底部。只需将其附加到命令末尾:| sort -h
"^[0-9]*[.]*[0-9]*[MG]"
-x
选项使du
该驱动器停留在该驱动器上(在命令行上提供)。您也可以通过管道sort -h
进行正确排序,以区分兆字节/千兆字节人类可读的值。我通常会不--max-depth
选择该选项,而是以这种方式搜索整个驱动器,进行适当的排序以使最大的内容位于底部。
/
),并且使用-x
可以保证我不会误算东西。如果您/
已装满东西,并且有单独安装的/home
东西或其他东西,则使用-x
摆脱不相关的东西非常有必要。因此,以防万一,我发现始终可以更轻松地使用它。
curl http://path/to/ncdu | sh
,它将在内存中的IO stdin缓存中运行,但这需要一些运气。也可能有一种制作ram磁盘的方法
sudo ncdu /
后,从命令行输入。sudo
因为如果您不放置sudo,它就不会报告root拥有的文件夹的大小,并且/
因为如果您不键入sudo,它只会回溯性地报告您所在文件夹的大小
我用这个命令
sudo du -aBM -d 1 . | sort -nr | head -20
有时,我需要从/
目录中运行它,因为我已将某些东西放置在一个奇怪的位置。
-d 1
开关(通常使用less
而不是head -20
)来执行此操作更有用,这样我就可以得到所有文件和目录的完整的递归枚举列表,这些列表按它们所占用的空间排序。这样,如果我看到目录占用了大量空间,则可以向下滚动以查看其中大部分空间是否实际上被其中的某些特定文件或子目录占用。这是查找一些不需要的文件和目录以删除它们以释放一些空间的好方法:向下滚动直到看到确定您不想保留的内容,然后删除并重复。
sort
在开始输出之前等待输出完成。
我不知道Ubuntu,也无法检查我的答案,但是根据我很久以前作为Unix管理员的经验在这里发布我的答案。
找出哪个文件系统空间不足
df -h
将列出所有文件系统,其大小和可用空间。仅在调查具有足够空间的文件系统时才浪费时间。假设完整的文件系统是/ myfilesystem。检查df输出是否在/ myfilesystems的子目录上挂载了文件系统。如果是这样,则必须根据以下情况调整以下飞溅。
找出此文件系统的文件使用了多少空间
du -sh /myfilesystem
-x选项可用于确保仅考虑属于该文件系统的文件。某些Unix变体(例如Solaris)不知道du的-x选项。然后,您必须使用一些解决方法来找到文件系统的du。
现在检查可见文件的du是否大约等于df显示的已用空间的大小。如果是这样,您可以开始查找/ myfilesystem文件系统的大型文件/目录进行清理。
查找目录最大的子目录/.../dir使用
du -sk /.../dir/*|sort -n
-k选项强制du以千字节为单位输出sie,不带任何单位。在某些系统上,这可能是默认设置。然后,您可以忽略此选项。最大的文件/子目录将显示在输出的底部。
如果发现不再需要的大文件/目录,则可以通过适当的方式将其删除。不要担心输出顶部的小目录。如果删除它们,将无法解决您的问题。如果您仍然没有足够的空间,可以在列表底部显示的大子目录中重复步骤4。
但是,如果du输出不是df所显示的可用空间,该怎么办?
如果du输出较大,则说明您错过了挂载另一个文件系统的子目录。如果du输出小得多,则som文件不会显示在du du检查的任何目录中。他的现象可能有不同的原因。
一些进程使用的是已经删除的文件。因此,此文件已从目录中删除,并且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,以便在正确的文件系统上工作
/tmp
一个单独的文件系统(例如tmpfs),并且/tmp
在它成为另一个文件系统的挂载点之前已经创建了一些文件。现在,这些文件位于根文件系统中,并被安装点遮盖,如果不重新启动到恢复模式(不会处理/etc/fstab
)或像您建议的那样进行绑定安装,就无法访问它们。
并不是真正的答案-而是附录。
您空间有限,无法通过@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)
对于init行并不能做很多事情,但是第二行建议salt-minion已打开一个已删除的文件,并且一旦通过服务重新启动关闭了所有文件句柄,便会返回磁盘块。
其他常见的可疑对象包括syslog / rsyslog / syslog-ng,squid,apache或服务器运行的“繁重”进程。
我发现Filelight之类的工具的输出特别有价值,但是,就像您的情况一样,在服务器上,通常没有安装GUI,但是该du
命令始终可用。
我通常要做的是:
du
输出写入文件(du / > du_output.txt
);DuFS
将du
输出“挂载”到临时目录中;DuFS
根据输出使用FUSE创建虚拟文件系统(=实际上没有创建文件,都是假的)du
;免责声明:我写的dufs
-正是因为我经常不得不找出无头机器上的磁盘空间。