文件夹是空的,但 du 报告使用率很高

文件夹是空的,但 du 报告使用率很高

115GB我的硬盘上有一个分区(输出cgdisk /dev/sda如下):

Part. #     Size        Partition Type            Partition Name
----------------------------------------------------------------
            1007.0 KiB  free space
   1        499.0 MiB   Windows RE                Basi
   2        100.0 MiB   EFI System                EFI 
   3        16.0 MiB    Microsoft reserved        Micr
   5        43.9 GiB    Linux filesystem          ubuntu-root
   6        43.9 GiB    Linux filesystem          ubuntu-home
   4        114.9 GiB   Linux filesystem          data         <--- this partition
   7        29.5 GiB    Linux filesystem

我已经/data在我的 上安装了该分区/etc/fstab

UUID=<drive-uuid>  /data  ext4  defaults  0  0

当我这样做时df -h /data,我得到以下输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4       113G   96G   11G  90% /data

当我du这样使用时:du /data -h --max-depth=1 | sort -hr,我看到的是:

51G    /data
40G    /data/virtual-box
4.4G   /data/temp
4.1G   /data/manjaro-minikube
1.9G   /data/.nuget
764M   /data/OneDrive
62M    /data/manjaro-lxd
40K    /data/.minikube
16K    /data/lost+found

如果我没记错的话,这表明/data正在占用空间,51G然后我有virtual-box、、和目录占用空间(其他的不占用太多空间)tempmanjaro-minikube.nuget

如果我对我的目录进行长列表(ls -alh /data):

total 68K
drwxr-xr-x  10 farzad farzad 4.0K Aug 13 21:47 .
drwxr-xr-x  19 root   root   4.0K Jul 13 10:32 ..
drwx------   2 farzad farzad  16K Mar 22 18:22 lost+found
drwx--x--x  15 root   root   4.0K Aug 20 17:47 manjaro-lxd
drwxr-xr-x   3 farzad farzad 4.0K Jul  3 18:16 manjaro-minikube
drwxrwxr-x   9 farzad farzad 4.0K Jul 30 17:38 .minikube
drwxr-xr-x 202 farzad farzad  16K Aug 17 10:00 .nuget
drwxr-xr-x   3 farzad farzad 4.0K Aug 13 21:47 OneDrive
drwxrwxr-x  16 farzad farzad 4.0K Jun  3 21:45 temp
drwxr-xr-x   6 farzad farzad 4.0K Aug 20 20:21 virtual-box

我没有看到任何文件或其他导致该51G报告的内容/data,因此我预计我的驱动器几乎65G有空空间,但由于某种原因,父目录自行/data占用了空间!51G

我尝试搜索互联网,但什么也没找到。有人能告诉我发生了什么吗?


更新

正如答案中所建议的,我运行了lsof /data | grep deleted(以 root 身份),但没有任何结果,尽管我看到了一条警告,但我不确定是否相关:

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.

答案1

您的/data数据为51G。这包括其中的所有子目录和文件。如果您将 报告的大小添加到du子目录(并考虑舍入问题),您将得到51G。如果 中直接有常规文件/data,它们也会对 报告的值有所贡献/data

因此du不会报告高使用率。df报告高使用率的是:96G文件系统正在使用中。

由于/data是挂载点,您可能希望这两个值相同。但这两个工具的工作方式不同:du遍历目录并添加遇到的对象的大小,df查询文件系统以了解其自身状态。

造成如此大的差异可能是因为:

  • du无法获取所有对象(或获取有关所有对象的信息)。是否有任何permission denied错误?
  • 文件系统存在不一致;fsck.ext4akae2fsck可能会有帮助。
  • 最有可能的)至少有一个文件已被删除(指向相应 inode 的所有目录条目均已被删除,该文件未出现在任何目录列表中,因此du无法知晓它),但它仍在被某个进程使用(因此文件系统会保留数据并在向 报告时将其考虑在内df)。请参阅这个答案这个问题

    以下命令应该找到此类文件以及使用它们的进程:

    lsof /data | grep deleted
    

    示例输出:

    some_daemon  …  …  …  …  …  …  …  /data/temp/huge_file (deleted)
    

    这意味着文件系统huge_file只有在停止使用后才会真正删除some_daemon。请注意,通常情况下,进程仍可以附加到文件或截断文件,因此文件可能会增大或缩小。这会影响 的内容df,但不会影响du

答案2

因此,事实证明这里存在一些问题(感谢@Kamil 帮助发现这些问题):

du虽然我最初的直觉是报告的金额/data是其所有子目录的总和(经过四舍五入),但我想我试图证明df和之间的差异du,并认为我应该将du的输出/data和其所有子目录相加以获得与 相同的结果df

另一个问题,也是导致差异的主要原因,是由于我的配置方式/etc/fstab

UUID=<uuid>  /data  ext4  defaults  0  0
                                       ^
                                     ISSUE

当我创建我的时/etc/fstab,我认为我不需要通过fsck在我的挂载上启用文件系统检查()来延长我的启动时间,因此对于第六个字段,但事实证明,这导致 inode 无法清理,因此导致和0之间出现巨大差异。dfdu

因此,查看man 5 fstab,我们可以看到,为了启用检查,根文件系统应该具有值1,而其他文件系统应该具有值2,因此我将该行更改为:

UUID=<uuid>  /data  ext4  defaults  0  2

重启后,报告了很多问题fsck,我选择修复它们,现在是的输出du /data -h --max-depth=1 | sort -hr

28G    /data
16G    /data/virtual-box
4.5G   /data/temp
4.1G   /data/manjaro-minikube
1.9G   /data/.nuget
824M   /data/OneDrive
64M    /data/manjaro-lxd
40K    /data/.minikube
16K    /data/lost+found

输出df /data -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4       113G   28G   80G  26% /data

值得注意的是,与我原来的问题相比,我删除了一些文件(因此28G使用 而不是51G),但好处是du和都df报告相同的值:)

答案3

您的命令是从高到低对结果进行排序。最高值是全部的所用的空间/data,而不是其自身已用的空间。

相关内容