没有更多的磁盘空间:我怎样才能找到占用空间的空间?

我在我的一台运行16.04的服务器上遇到问题:没有剩余磁盘空间。

我不知道是什么占据了空间。 是否有一个命令列出当前的目录大小,所以我可以遍历并最终占用占用所有空间的目录?

和Linux一样,完成工作的方法不止一种。 但是,如果您需要从CLI执行此操作,这是我首选的方法:

我首先以root用户或sudo运行它:

 du -cha --max-depth=1 / | grep -E "M|G" 

grep是将返回的行限制为返回值为兆字节或千兆字节范围的行。 如果您的磁盘足够大,您还可以添加|T以包含Terabyte金额。 您可能会在/proc/sys和/或/dev上遇到一些错误,因为它们不是磁盘上的真实文件。 但是,它仍应为root中的其余目录提供有效输出。 找到最大的那个之后,你就可以在该目录中运行命令,以便缩小你的道路。 所以,例如,如果/var是最大的,你可以像下一样做:

 du -cha --max-depth=1 /var | grep -E "M|G" 

这应该引导你解决孩子们的问题!

其他考虑因素

虽然上面的命令肯定会起到作用,但我在下面的评论中有一些建设性的批评指出了你可以包括的一些事情。

  1. 如果目录或文件的名称有大写字母G或M,我提供的grep可能会导致偶尔返回“K”值。如果你绝对不希望任何K值目录出现,你想要你的正则表达式游戏更具创意和复杂性。 例如grep -E "^[0-9\.]*[MG]"
  2. 如果你知道哪个驱动器是问题,并且它上面有其他已安装的驱动器,你不想浪费时间,包括在搜索中,你可以在你的du命令中添加-x标志。 该标志的手册页描述:

      -x, --one-file-system skip directories on different file systems 
  3. 您可以对du命令的输出进行排序,以使最高值位于底部。 只需将其附加到命令的末尾: | sort -h | sort -h

您可以使用ncdu 。 它工作得很好。

 sudo apt install ncdu 

在此处输入图像描述

我用这个命令

sudo du -aBM -d 1 . | sort -nr | head -20

偶尔,我需要从/目录运行它,因为我已经在奇怪的位置放置了一些东西。

关于如何找到占据大部分空间的目录,已经有很多很好的答案。 如果你有理由相信很少有大文件是主要问题,而不是很多小文件,你可以使用find / -size +10M类的东西。

我不知道Ubuntu并且无法检查我的答案但是根据我很久以前作为unix管理员的经验在这里发布我的答案。

  1. 找出哪些文件系统空间不足

     df -h 

    将列出所有文件系统,它们的大小和可用空间。 如果您调查具有足够空间的文件系统,您只会浪费时间。 假设完整的文件系统是/ myfilesystem。 如果在/ myfilesystems的子目录中安装了文件系统,请检查df输出。 如果是这样,以下speps必须适应这种情况。

  2. 找出这个文件系统的文件使用了多少空间

     du -sh /myfilesystem 

    -x选项可用于保证仅考虑作为此文件系统成员的文件。 某些Unix变体(例如Solaris)不知道du的-x选项。 然后,您必须使用一些变通方法来查找文件系统的du。

  3. 现在检查可见文件的du是否大约是df显示的已用空间的大小。 如果是这样,您可以开始查找/ myfilesystem文件系统的大文件/目录以进行清理。

  4. 找到目录/…/dir使用的最大子目录

     du -sk /.../dir/*|sort -n 

    -k选项强制du以千字节为单位输出sie而不使用任何单位。 这可能是某些系统的默认设置。 然后你可以省略这个选项。 最大的文件/子目录将显示在输出的底部。

  5. 如果您找到了不再需要的大型文件/目录,则可以以适当的方式将其删除。 不要打扰输出顶部的小目录。 如果删除它们将无法解决您的问题。 如果仍然没有足够的空间,则可以在列表底部显示的larges子目录中重复步骤4。

但是如果du输出大约不是df显示的可用空间会发生什么?

如果du输出较大,那么您错过了安装另一个文件系统的子目录。 如果du输出小得多,则som文件不会显示在任何目录中。 他的现象可能有不同的原因。

  1. 某些进程正在使用已删除的文件。 因此,这些文件已从目录中删除,du无法看到它们。 但对于文件系统,它们的块仍然在使用,直到进程关闭文件。 您可以尝试找出相关进程(例如使用lsof)并强制它们关闭此文件(例如,通过停止应用程序或通过终止进程)。 或者您只是重启机器。

  2. 目录中的文件不再可见,因为在其父目录之一上安装了另一个文件系统。 所以,如果你有一个文件/ myfilesysem / subdir / bigfile,现在在/ myfilesystem / subdir上安装另一个文件系统,那么你就再也看不到这个文件了

     du -shx /myfilesystem 

    将报告一个不包含/ myfilesystem / subdir / bigfile大小的值。 找出这些文件是否存在的唯一方法是卸载/ myfilesystem / subir并检查

     ls -la /myfilesystem/subdir 

    如果它包含文件。

  3. 可能有特殊类型的文件系统在磁盘上使用/保留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 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) 

对init行做不了多少,但是第二行表示salt-minion有一个已打开的文件被删除,并且一旦所有文件句柄被服务重启关闭,将返回磁盘块。

这里的其他常见嫌疑人将包括syslog / rsyslog / syslog-ng,squid,apache或您的服务器运行的任何“重”的进程。

我发现像Filelight这样的工具的输出特别有价值,但是,在你的情况下,在服务器上通常没有安装GUI,但du命令始终可用。

我通常做的是:

  • du输出写入文件( du / > du_output.txt );
  • 将文件复制到我的机器上;
  • 使用DuFSdu输出“挂载”到临时目录中; 根据du输出, DuFS使用FUSE创建虚拟文件系统(=实际上没有创建文件,它都是假的);
  • 在此临时目录上运行Filelight或其他GUI工具。

免责声明:我写了dufs – 正是因为我经常要找出无头机器上的什么占用磁盘空间。

与@TopHat类似,但如果名称中包含M,G或T,则过滤某些文件。 我不相信它会在第一列中错过大小,但除非您创造性地命名文件,否则它将与文件名不匹配。

 du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]' 

这里解释了命令行开关,因为我不知道c或a做了什么。