磁盘满了,du 就不同了。如何进一步调查?

ini*_*all 149 linux ext3 disk-space-utilization scsi

我在服务器(硬件 Raid 1)中有一个 SCSI 磁盘,32G,ext3 文件系统。df告诉我磁盘已 100% 已满。如果我删除 1G,这将正确显示。

但是,如果我运行 adu -h -x /然后du告诉我只使用了 12G(我使用-x是因为一些 Samba 安装)。

所以我的问题不是关于 du 和 df 命令之间的细微差别,而是关于我如何找出造成这种巨大差异的原因?

我为 fsck 重新启动了机器,但没有错误。我应该跑badblocks吗?lsof向我显示没有打开的已删除文件,lost+found是空的,并且消息文件中没有明显的警告/错误/失败语句。

请随时询问有关设置的更多详细信息。

小智 138

在尝试追踪本地服务器上的问题时偶然发现了此页面。

在我的情况下,df -hdu -sh大约 50% 的硬盘大小不匹配。

这是由 apache (httpd) 在内存中保存已从磁盘中删除的大型日志文件引起的。

这是通过运行追查lsof | grep "/var" | grep deleted那里/var是我需要清理分区。

输出显示如下几行:
httpd 32617 nobody 106w REG 9,4 1835222944 688166 /var/log/apache/awstats_log (deleted)

然后通过重新启动 apache ( service httpd restart)解决了这种情况,并清除了 2GB 的磁盘空间,允许清除对已删除文件的锁定。

  • 小注:您可能必须将 `lsof` 作为 `sudo` 运行,否则并非所有打开的文件描述符都会显示出来 (7认同)
  • 您可以跳过 grep 并只执行 `lsof -a +L1 /var`,其中 `-a` 表示 AND 所有条件(默认为 OR),`+L1` 表示仅列出链接计数小于 1 的文件(即,删除的文件和打开的文件描述符),并且 `/var` 限制在该挂载点下的文件 (5认同)

Old*_*oll 113

检查位于挂载点下的文件。通常,如果您将一个目录(比如 sambafs)挂载到一个已经有一个或多个目录的文件系统上,您将无法看到这些文件,但它们仍然在消耗底层磁盘上的空间。在单用户模式下,我有文件副本,将文件转储到除了单用户模式之外我看不到的目录中(由于其他目录系统安装在它们之上)。

  • 您无需卸载目录即可找到这些隐藏文件。看看下面 Marcel G 的回答,它解释了如何做。 (7认同)
  • 您应该在答案中显示 CLI 命令来执行此操作 (2认同)
  • 注意:这个答案是在谈论位于*下面*挂载点(即隐藏在原始文件系统上)的文件,而不是*在*挂载点内。(不要像我一样傻。) (2认同)

Mar*_*l G 73

我同意 OldTroll 的回答,认为这是您“丢失”空间的最可能原因。

在 Linux 上,您可以轻松地将整个根分区(或任何其他分区)重新挂载到文件系统中的另一个位置,例如 /mnt,只需发出

mount -o bind / /mnt
Run Code Online (Sandbox Code Playgroud)

那么你可以做一个

du -h /mnt
Run Code Online (Sandbox Code Playgroud)

看看是什么占用了你的空间。

Ps:抱歉添加了新答案而不是评论,但我需要一些格式才能使这篇文章可读。

  • 非常感谢这个提示。允许我在不停机的情况下查找和删除我的大型“隐藏”文件! (5认同)
  • 谢谢!通过这些命令,我​​设法找到了导致磁盘使用率达到 10% 的原因并释放了它。为了只列出最大的文件夹和文件,我使用了 `du /mnt | 排序 -n -r | 头-20` (2认同)

eir*_*cot 28

看看怎么df -i说。可能是因为您没有 inode,如果该文件系统中有大量小文件,这可能会发生这种情况,这会耗尽所有可用的 inode 而不会消耗所有可用空间。

  • 文件的大小和它在文件系统上占用的空间量是两个不同的东西。文件越小,它们之间的差异就越大。如果您编写一个脚本来汇总文件的大小,并将其与同一子树的“du -s”进行比较,您就会清楚这里是否是这种情况。 (2认同)

小智 26

就我而言,这与已删除的大文件有关。在我找到这个页面之前解决起来相当痛苦,这让我走上了正确的道路。

我终于通过使用解决了这个问题lsof | grep deleted,它向我展示了哪个程序保存了两个非常大的日志文件(总共 5GB 的可用 8GB 根分区)。


Pau*_*lin 9

由程序打开的文件实际上并不会在您删除它们时消失(停止消耗磁盘空间),而是在程序关闭它们时消失。一个程序可能有一个你(和 du)看不到的巨大临时文件。如果它是僵尸程序,您可能需要重新启动才能清除这些文件。


小智 9

对我来说,我需要运行,sudo du因为在/var/lib/docker非 sudo 用户没有读取权限的情况下有大量 docker 文件。


小智 5

试试这个,看看死/挂起的进程是否在仍在写入磁盘时被锁定: lsof | grep "/mnt"

然后尝试清除任何卡住的 PID(特别是寻找以“(已删除”)结尾的行)


Ria*_*aan 5

这是迄今为止我发现的最简单的查找大文件的方法!

这是一个示例,如果您的根挂载已满 / (mount /root) 示例:

cd /(所以你在 root 中)

ls | xargs du -hs

示例输出:

 9.4M 仓
 63M开机
 4.0K cgroup
 680K 开发
 31M等
 6.3G家庭
 313M库
 32M lib64
 16K 丢失+找到
 61G媒体
 4.0 千吨
 113M 选择
 du:无法访问`proc/6102/task/6102/fd/4':没有那个文件或目录
 0 进程
 19M根
 840K 运行
 19M sbin
 4.0K selinux
 4.0K 伺服器
 25G商店
 26M tmp

然后你会注意到商店很大做一个 cd /store

并再次运行

ls | xargs du -hs

示例输出: 
 109M备份
 358M上网
 4.0G ISO
 8.0K 秒
 16K 丢失+找到
 47M根
 11M 脚本
 79M tmp
 21G 虚拟机

在这种情况下,vms 目录是空间猪。

  • 嗯`ls` + `xargs` 似乎有点矫枉过正,`du -sh /*` 本身就很好用 (3认同)
  • 如果你不知道 ncdu ......你稍后会感谢我:https://dev.yorhel.nl/ncdu (3认同)