没有更多的磁盘空间:如何找到占用的空间?


81

我的一台运行16.04的服务器遇到了问题:磁盘空间不足。

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


1
检查磁盘使用情况分析器
Pranal Narayan

@PranalNarayan我的服务器上没有GUI,恐怕:(
Karl Morrison

1
该死的,现在我去寻找,发现了这个bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255,希望这是一件事情。
山姆

1
wrt“没有GUI,是服务器”:您可以安装GUI应用程序(假设您对此感到满意,并且支持库位于服务器上),并通过X11-tunnelled-through-SSH通过SSH在本地屏幕上使用,例如export DISPLAY=:0.0; ssh -Y <user>@<server> filelightfilelight用您喜欢的工具代替)。当然,绝对没有剩余空间,如果您尚未安装该工具,则仍然需要使用其他工具!
David Spillett's

4
@DavidSpillett如前所述,服务器上没有剩余空间。所以我什么也不能安装。
莫里森

Answers:


93

与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"

那应该导致您遇到问题的孩子们!

其他注意事项

尽管上面的命令肯定可以解决问题,但我在下面的评论中提出了一些建设性的批评,指出了您还可以包括的一些内容。

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

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


这正是我所做的。
Lightness Races in Orbit

5
您的grep也会返回名称中也带有字母M或G的所有文件夹,创造性的正则表达式应使用可选的dot + M | G击中数字,例如"^[0-9]*[.]*[0-9]*[MG]"
Xen2050

4
如果您知道问题出在一个驱动器上,则可以使用该-x选项使du该驱动器停留在该驱动器上(在命令行上提供)。您也可以通过管道sort -h进行正确排序,以区分兆字节/千兆字节人类可读的值。我通常会不--max-depth选择该选项,而是以这种方式搜索整个驱动​​器,进行适当的排序以使最大的内容位于底部。
Muzer's

1
@alexis我的经验是,有时我有时会在感兴趣的安装点下方安装其他垃圾(尤其是在/),并且使用-x可以保证我不会误算东西。如果您/已装满东西,并且有单独安装的/home东西或其他东西,则使用-x摆脱不相关的东西非常有必要。因此,以防万一,我发现始终可以更轻松地使用它。
Muzer's

1
如果您有排序,则不需要grep。
OrangeDog's

77

您可以ncdu为此使用。效果很好。

sudo apt install ncdu

在此处输入图片说明


34
我会踢自己,因为我实际上通常在使用该程序,但是由于没有空间,我无法安装它哈哈
Karl Morrison

@KarlMorrison我看到了几种可能的解决方案,只需将其安装在另一台计算机上的sshfs上,然后在该计算机上运行ncdu(假设您已经有ssh服务器..)-或者,如果您没有ssh服务器,则可以执行此操作反之,在另一台服务器上安装ncdu并用sshfs挂载,并从该挂载运行ncdu(假设服务器上已经有sshfs)-或如果没有,则...如果ncdu是单个脚本,则可以curl http://path/to/ncdu | sh,它将在内存中的IO stdin缓存中运行,但这需要一些运气。也可能有一种制作ram磁盘的方法
hanshenrik

@KarlMorrison或您可以引导Linux的实时映像并将其安装在其中。

安装完成sudo ncdu /后,从命令行输入。sudo因为如果您不放置sudo,它就不会报告root拥有的文件夹的大小,并且/因为如果您不键入sudo,它只会回溯性地报告您所在文件夹的大小
Max Carroll

19

我用这个命令

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

有时,我需要从/目录中运行它,因为我已将某些东西放置在一个奇怪的位置。


给您+1使其正常工作!但是,TopHats解决方案实际上可以更快地读取我的驱动器!
卡尔·莫里森

我经常发现不使用-d 1开关(通常使用less而不是head -20)来执行此操作更有用,这样我就可以得到所有文件和目录的完整的递归枚举列表,这些列表按它们所占用的空间排序。这样,如果我看到目录占用了大量空间,则可以向下滚动以查看其中大部分空间是否实际上被其中的某些特定文件或子目录占用。这是查找一些不需要的文件和目录以删除它们以释放一些空间的好方法:向下滚动直到看到确定您不想保留的内容,然后删除并重复。
Ilmari Karonen'5

@KarlMorrison它不会更快地读取它,只是sort在开始输出之前等待输出完成。
muru

@muru嗯,好的。但是,我可以更快地获取信息,以便在更好的条件下可以更快地遍历!
莫里森

13

关于找到占用大部分空间的目录的方法,已经有了许多不错的答案。如果您有理由相信主要问题是大型文件很少,而不是小型文件,则可以使用find / -size +10M


11

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

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

    df -h
    

    将列出所有文件系统,其大小和可用空间。仅在调查具有足够空间的文件系统时才浪费时间。假设完整的文件系统是/ myfilesystem。检查df输出是否在/ myfilesystems的子目录上挂载了文件系统。如果是这样,则必须根据以下情况调整以下飞溅。

  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. 如果发现不再需要的大文件/目录,则可以通过适当的方式将其删除。不要担心输出顶部的小目录。如果删除它们,将无法解决您的问题。如果您仍然没有足够的空间,可以在列表底部显示的大子目录中重复步骤4。

但是,如果du输出不是df所显示的可用空间,该怎么办?

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

  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,以便在正确的文件系统上工作


在繁忙的服务器上,您无法始终卸载东西。但是您可以将上层目录绑定安装到一个临时位置,并且它不包括其他安装,并允许访问隐藏文件。
Zan Lynx

在systemd之前,我经常发生安装失败,导致/装载满垃圾。例如,在未连接USB驱动器的情况下将备份写入/ mnt / backup。现在,我确保这些作业单元具有安装要求。
Zan Lynx

@ZanLynx谢谢你,我从来没有听说过的绑定安装
miracle173

@ZanLynx:不仅在繁忙的服务器上。想象一下,您拥有/tmp一个单独的文件系统(例如tmpfs),并且/tmp在它成为另一个文件系统的挂载点之前已经创建了一些文件。现在,这些文件位于根文件系统中,并被安装点遮盖,如果不重新启动到恢复模式(不会处理/etc/fstab)或像您建议的那样进行绑定安装,就无法访问它们。
David Foerster

9

如果您还对不使用命令感兴趣,请使用以下应用程序:Filelight

它使您可以快速可视化任何文件夹中正在使用的磁盘空间。

在此处输入图片说明


这是我通过SSH连接到的服务器,没有GUI。
莫里森

@KarlMorrison我认为可以通过ssh运行GUI程序,但这是以后的想法,当您有空间安装软件包时
Xen2050,17年

@David哦,是的,我正在努力摆脱困境。在我使用的另一个平台上,以前它是必需的。我将修复该评论。

@Karl是的,如果客户端上已经安装了X,那就很容易了:ssh -X <your host>然后从命令行运行程序

@MarkYisri的重点是您需要安装程序及其依赖项。在Filelight的情况下,至少需要KDElibs和Qt,它们并不是很小。请参见此页面以获取Filelight Ubuntu软件包,请注意它具有多少依赖关系。
Ruslan


3

我经常用这个

du -sh /*/

然后,如果我发现一些大文件夹,我将切换至该文件夹并进行进一步调查

cd big_dir
du -sh */

如果需要,您还可以使用

du -s /*/ | sort -n

2

并不是真正的答案-而是附录。

您空间有限,无法通过@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或服务器运行的“繁重”进程。


2

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

我通常要做的是:

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

免责声明:我写的dufs-正是因为我经常不得不找出无头机器上的磁盘空间。


您可以只排序-n du_output.txt
Zan Lynx

我发现所用空间方式的图形显示更加直观。
Matteo Italia

-1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.