df -h 给出假数据?
Posted
技术标签:
【中文标题】df -h 给出假数据?【英文标题】:df -h giving fake data? 【发布时间】:2022-01-02 23:27:29 【问题描述】:当我在我的实例中写 df -h
时,我正在获取这些数据:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 7.7G 408K 7.7G 1% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/nvme0n1p1 32G 24G 8.5G 74% /
tmpfs 1.6G 0 1.6G 0% /run/user/1000
但是当我点击sudo du -sh /
时,我得到:
11G /
所以在df -h
,/
大小为 24G,但在 du -sh
同一目录中,大小为 11G。
我正在尝试在我的实例上获得一些可用空间,但找不到导致该问题的文件。
我错过了什么?
df -h
真的是在提供假数据吗?
【问题讨论】:
【参考方案1】:这个问题经常出现。文件系统在文件系统中分配磁盘块来记录其数据。此数据称为元数据,大多数用户级程序(例如 du)不可见。元数据的示例包括索引节点、磁盘映射、间接块和超级块。
du 命令是一个用户级程序,它不知道文件系统元数据,而 df 查看文件系统磁盘分配图并知道文件系统元数据。 df 获得真实的文件系统统计信息,而 du 只看到部分图片。
运行 du 或 df 命令时使用或可用的磁盘空间不同的原因有很多。
也许最常见的是被删除的文件。已删除的文件可能仍被至少一个进程打开。此类文件的条目会从关联目录中删除,从而使文件无法访问。因此,只计算文件的命令 du 不考虑这些文件,并得出一个较小的值。但是,只要进程仍在使用已删除的文件,相关块尚未在文件系统中释放,因此在内核级别工作的 df 正确地将这些显示为已占用。您可以通过运行以下命令来了解是否是这种情况:
lsof | grep '(deleted)'
解决此问题的方法是重新启动仍然打开这些已删除文件的服务。
第二个最常见的原因是您在同名目录的顶部安装了一个分区或驱动器。例如,如果您在 / 下有一个名为 backup 的目录,其中包含数据,然后您在该目录顶部安装一个新驱动器并将其标记为 /backup 但它不包含数据,那么即使使用 df 命令,使用的空间也会显示du 命令不显示任何文件。
要确定是否有任何文件或目录隐藏在活动挂载点下,您可以尝试使用绑定挂载来挂载 / 文件系统,这将使我能够在其他挂载点下进行检查。请注意,这只建议有经验的系统管理员使用。
mkdir /tmp/tmpmnt
mount -o bind //tmp/tmpmnt
du /tmp/tmpmnt
在您确认这是问题后,可以通过运行删除绑定挂载:
umount /tmp/tmpmnt/
rmdir /tmp/tmpmnt
另一个可能的原因可能是文件系统损坏。如果怀疑有这种情况,请确保您有良好的备份,并在方便时卸载文件系统并运行 fsck。
同样,这应该由有经验的系统管理员来完成。
你也可以通过运行来检查计算:
strace -e statfs df /
这将为您提供类似于以下内容的输出:
statfs("/", f_type=XFS_SB_MAGIC, f_bsize=4096, f_blocks=20968699, f_bfree=17420469,
f_bavail=17420469, f_files=41942464, f_ffree=41509188, f_fsid=val=[64769, 0],
f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME) = 0
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 83874796 14192920 69681876 17% /
+++ exited with 0 +++
注意到 f_bfree 和 f_bavail 之间的区别了吗?这些是文件系统中的空闲块与非特权用户可用的空闲块。使用的列只是两者之间的计算。
希望这将使您的想法清晰。如果您仍有任何疑问,请告诉我。
【讨论】:
首先非常感谢您的详细回答。其次,我只是想了解,我的文件系统安装在“/”上并使用了 75% 的存储空间,我的实际日志文件和我可以“看到”的所有内容都是 34%,我经历了你写的但没有一个实际上帮我解决了哪里可以找到丢失的 41% 的存储空间,只是想清理系统。 好的,使用终端检查存储和删除系统中的文件和文件夹的简单方法是 ncdu 只需键入“sudo apt install ncdu -y”,然后键入“ncdu /" 你将存储你的数据。 如果你愿意,我可以添加另一个答案发布解决方案。 当我运行 'ncdu' 命令时,它仍然只显示 11G 而不是显示 usgae 中的所有 25G 正如我所说,只有 df 命令会给你实时数据。不要相信du数据。以上是关于df -h 给出假数据?的主要内容,如果未能解决你的问题,请参考以下文章