我有一个奇怪的差异。使用“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
无法看到,因为挂载隐藏了它们。
所以尝试卸载所有挂载并在其余目录中查找数据。
祝您玩得愉快,谢谢!