df、du 报告不正确的磁盘使用情况

df、du 报告不正确的磁盘使用情况

df两者du都错误地报告我的根分区(100GB SSD)没有剩余空间并分别使用了 100G;单独85G /home/steven。然而,对 提供的磁盘使用情况进行简单求和后du,报告的使用量少于 13G。

我怎样才能解决这个问题?

具体来说:

~ » du -sh ~
85G   /home/steven

~ » du -b ~ | wc -l
15041

~ » du -h ~ | sort -h | tail -n 1
85G   /home/steven # 91088489808 bytes if using -b for du

~ » du -b ~ | sort -n | head -n 15040 | cut -f 1 | perl -ne 'BEGIN{$i=0;}$i+=$_;END{print $i.qq|\n|;}'
12735983847 # 11-12G, roughly

显然,85G 与 11G 或 12G 之间存在巨大差异。我运行lsof +L1并消除了所有带有标记文件的进程deleted,但仍然没有运气。

我有几个软链接指向外部硬盘驱动器上$HOME的目录(例如,repos),这可能是基于我读过的一些 Stack Exchange 帖子的问题,但我似乎无法理解它。

接下来我应该做什么?

答案1

du对给定的树进行深度优先遍历。默认情况下,它显示每个目录树的使用情况,显示每个目录树的包含磁盘使用情况:

$ du ~
4      /home/bob/Videos
40     /home/bob/.cache/abrt
43284  /home/bob/.cache/mozilla/firefox
43288  /home/bob/.cache/mozilla
12     /home/bob/.cache/imsettings
48340  /home/bob/.cache
4      /home/bob/Documents
48348  /home/bob

如果给定-a选项,它将另外显示每个文件的大小。

使用该-s选项,它将仅显示每个参数文件或目录树的总大小。

$ du -s ~
48348  /home/bob
$ du -s ~/*
4      /home/bob/Videos
4      /home/bob/Documents

所以,当你跑步时

$ du -b ~ | wc -l
15041

$ du -b ~ | sort -n | head -n 15040 | cut -f 1 | \
    perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
12735983847

您正在总结主目录下所有内容的大小 - 不幸的是,多次总结,因为每行报告的大小都包含所有子目录 - 但因为您省略了 du 输出的最后一行,这将是/home/steven,du 没有计算主目录顶层中任何常规文件的大小。所以这个总和不包括你的非常大的.xsession-errors文件。

当你跑的时候

du -sb ~ returns 91296460205, but the sum of du -sb ~/* is only 1690166532

您的du -sb ~/*输出不包含主目录中以..

du ~ | tail -1和都du -s ~应该合理地显示主目录的磁盘使用情况(当然不包括已删除但打开的文件),但是如果您想在不依赖 的情况下汇总所有文件大小du,您可以执行以下操作(假设现代find支持printf %s以字节为单位显示大小的格式):

find ~ -type f -printf '%s\n' | perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'

答案2

您正在对字节求和,但文件系统的块大小可能远大于 1 字节。为了获得准确的计数,您应该将每个文件的大小向上舍入,使其成为文件系统块大小的倍数。

安装 GNU coreutils 后,您可以运行stat --file-system $HOME来查找文件系统的块大小。

平均而言,文件会浪费半个块。将半个块乘以 $HOME 中的文件数量,看看结果是否接近 70GiB。如果是这样,那么你的谜团就解开了。

相关内容