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
、、和目录占用空间(其他的不占用太多空间)temp
manjaro-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.ext4
akae2fsck
可能会有帮助。 (最有可能的)至少有一个文件已被删除(指向相应 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
之间出现巨大差异。df
du
因此,查看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
,而不是其自身已用的空间。