linux 中的 df 在文件删除后未显示正确的可用空间

linux 中的 df 在文件删除后未显示正确的可用空间

我有用于存储文件的文件服务器。文件可能会在那里驻留一周或一年。不幸的是,当我从服务器上删除文件时,df命令不会反映释放的空间。因此最终,服务器会被填满(df显示 99%),并且我的脚本不会再向那里发送任何文件,除非那里可能有几十 GB 的可用空间。

如果有任何区别的话,我noatime在已安装的分区上得到了标记。

答案1

删除文件名实际上并不会删除文件。其他进程正在打开该文件,导致无法删除它;重新启动或终止该进程以释放该文件。

使用

lsof +L1

找出哪个进程正在使用已删除(未链接)的文件。

答案2

正如 Ignacio 提到的,删除该文件不会释放空间,直到您删除对该文件有打开句柄的进程。

不过,你可以不用终止进程来回收空间。你只需要删除文件描述符即可。

首先执行 lsof | grep removed 来识别持有该文件的进程

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

然后执行:

cd /proc/PID/fd

然后

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

“1” 将是文件描述符。现在输入“> FD”来回收该空间

> 1

如果有其他进程持有该文件,您可能需要重复该操作。

答案3

如果分区已配置为仅保留一定比例的磁盘空间供根使用,df则不会将该空间视为可用空间。

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

即使通过删除文件/目录回收了空间,非 root 用户也无法写入特定分区。

您可以尝试以 root 和非 root 用户身份在设备上创建文件,轻松检查是否属于这种情况。

此外,您还可以通过运行来检查文件系统配置

tune2fs -l <device> | egrep "Block count|Reserved block count

并自行计算实际百分比。

要更改仅供 root 使用而保留的磁盘百分比,请执行

tune2fs -m <percentage> <device>

答案4

一种可能性是,您删除的文件在文件系统中有更多引用。如果您创建了硬链接,则多个文件名将指向相同的数据,并且数据(实际内容)将不会被标记为可用/可用,直到所有对它的引用都被删除。在删除文件之前,请对其进行统计(名为 Links 的条目)或对它们执行 ls -l(应该是第二列)。

如果确实证明这些文件在其他地方被引用,我猜你必须使用 ls -i 文件来找到 inode 号,然后使用 -inum <inode-number> 执行 find 来查找对该文件的其他引用(你可能还想使用 -mount 来保持在同一个文件系统内)。

相关内容