“du”和“df”之间的差异

“du”和“df”之间的差异

我有一个奇怪的差异。使用“df”我看到我的根磁盘使用了几乎 229G。

# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/dm-2                   241G  229G   13G  96% /

但“du”告诉我,我只使用了大约 12GB(向上舍入)。

# du -sh /* | grep G
3.2G    /run
2.1G    /usr
6.0G    /var

这两个命令均以 root 身份运行。我可以想象的是,现在挂载 NFS 共享的目录中存在“隐藏”数据。如果是这样的话。我怎样才能找出“隐藏”的文件。或者您对为什么这些数字如此完全不同有其他想法吗?

答案1

您可能有一个打开该文件的应用程序/进程。当您删除由应用程序保持打开状态的文件时,操作系统仍会在 df 中看到文件大小,因为该文件仍在内存中打开。

这是我为同事编写的一些文档,应该可以满足您的需求。

截断大的打开文件

您已删除文件以释放空间,但之后空间未释放。现在 df -lah 和 du -lah 显示不同的大小

使用 LSOF 获取已删除但保留的文件

lsof |grep deleted

这将显示所有已删除但由应用程序保持打开状态的文件。

java       2943  gateway  410w      REG              253,3  50482102     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3  46217973     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3  50483894     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

您可以重新启动应用程序以解锁文件或截断文件。

要截断文件,您必须查看上面的输出以获取 PID 和 fd(文件描述符编号)。

截断文件

echo > /proc/PID/fd/fd_number

示例:要将上面列出的三个文件大小归零,您将发出以下命令

echo > /proc/2943/fd/410 
echo > /proc/2943/fd/411
echo > /proc/2943/fd/412

如果你有很多可以截断 bash 来救援。

for n in {410..412}; do 'echo  > /proc/2943/fd/$n'; done;

df -lah 现在应该显示可用空间,但文件将在 lsof |grep 下显示已删除,但大小为 1

java       2943  gateway  410w      REG              253,3         1     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3         1     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3         1     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

文件描述符将在下次重新启动或重新启动/重新加载打开文件的应用程序时释放。

当然,您必须调整命令以匹配锁定文件的输出。

答案2

就我而言(你在私信中也告诉我同样的事情帮助了我)这是一个过度安装的问题。我在分区上的目录中有一些数据,但du无法看到,因为挂载隐藏了它们。

所以尝试卸载所有挂载并在其余目录中查找数据。

祝您玩得愉快,谢谢!

相关内容