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

193 linux filesystems disk-space-utilization

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

noatime如果这有什么不同,我会在已安装的分区上得到标志。

Ign*_*ams 316

删除文件名实际上并没有删除文件。其他一些进程正在保持文件打开,导致它不被删除;重新启动或终止该进程以释放文件。

lsof +L1
Run Code Online (Sandbox Code Playgroud)

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

  • +1。此外,“lsof +L1”会告诉您哪个程序正在打开文件。 (49认同)
  • 你刚刚救了我!删除了一个 93G 的日志文件,但没有取回空间,也不知道为什么。谢谢。 (5认同)
  • 作为 root 运行“lsof -n | grep 文件”,您会惊讶于文件可以保留多长时间,因为无论出于何种原因,进程都使它们保持打开状态。如果所有其他方法都失败了,请重新启动,我很抱歉建议它,但它肯定会确保没有任何内容保留在文件中。对于每个人, lsof +L1 可能是更好的方法。 (4认同)
  • 删除的文件一个多月都没有访问过,访问它们的唯一进程是nginx,所以值得怀疑。 (2认同)

Adr*_*ico 40

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

尽管如此,您可以在不终止进程的情况下回收空间。您需要做的就是删除文件描述符。

先执行lsof | 删除 grep 以识别持有文件的进程

[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)
Run Code Online (Sandbox Code Playgroud)

然后执行:

cd /proc/PID/fd
Run Code Online (Sandbox Code Playgroud)

然后

[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)
Run Code Online (Sandbox Code Playgroud)

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

> 1
Run Code Online (Sandbox Code Playgroud)

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

  • `> FD` 有什么作用? (2认同)
  • 这个 `>` 命令有名字​​吗?我必须从 zsh 切换到 bash 才能使用它。可以在zsh上运行吗? (2认同)
  • 它是一个输出重定向,因此会截断文件。long from 将是“echo -n > 1”或“true > 1”。它并没有真正删除 FD,它只是在之后指向一个空文件。 (2认同)

Kje*_*sen 11

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

如果事实证明这些文件在其他地方被引用,我想你必须 ls -i the file(s) 来找到 inode-number,然后用 -inum <inode-number> 做一个 find 来找到对该文件的其他引用(您可能还想使用 -mount 来保持在同一文件系统中)。


小智 10

如果分区已配置为仅保留特定部分的磁盘空间供 root 使用,df则不会将此空间包括为可用空间。

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

tune2fs -l <device> | egrep "Block count|Reserved block count
Run Code Online (Sandbox Code Playgroud)

并自行计算实际百分比。

要更改仅为 root 用户保留的磁盘 %,请执行

tune2fs -m <percentage> <device>
Run Code Online (Sandbox Code Playgroud)


Ami*_*ini 5

该文件仍被打开它的进程锁定。要释放空间,请执行以下步骤:

  1. 运行sudo lsof | grep deleted并查看哪个进程正在保存该文件。结果示例:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用sudo kill -9 {PID}. 在上面的示例中,PID 为 1623。

    $ sudo kill -9 1623
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行df以检查空间是否已被释放。如果它仍然已满,也许您需要等待几秒钟并再次检查。