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


142

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

noatime如果有任何区别,我会在挂载的分区上得到标志。


这是在单个分区上还是在所有分区上发生?
哈立德

好吧,它发生在我的主数据分区上,这是我唯一关心的分区,因为我只在其上写入/删除文件。

请提供解决方案或一个链接给我启发。

什么文件系统?DF执行了超级块的统计,可能是您的文件系统没有更新sb inode。您是否尝试过刷新缓存?
豆子

使用ext4。您如何刷新缓存?

Answers:


234

删除文件名实际上并不会删除文件。其他一些过程使文件保持打开状态,从而导致该文件不被删除;重新启动或终止该过程以释放文件。

采用

lsof +L1

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


2
一个月以来没有访问过被删除的文件,访问它们的唯一过程是nginx,因此值得怀疑。

39
+1。同样,“ lsof + L1”将告诉您哪个程序正在打开文件。
pehrs 2011年

4
以root用户身份运行“ lsof -n | grep文件”,您会惊讶于由于各种原因使文件保持打开状态的文件会停留多长时间。如果所有其他方法均失败,请重新启动,建议您这样做很不好,但是它肯定会确保文件上没有任何内容。每秒钟,lsof + L1可能是更好的方法。
ScottZ 2011年

3
你救了我!删除了93G日志文件,但没有收回空间,也无法弄清原因。谢谢。
路加·考辛斯

1
同样,如果这对其他人有帮助,我擦除了一个较大的nginx access.log文件,但仅在重新启动nginx之后才能够回收该空间:service nginx restart
尼克

27

正如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)

然后执行:

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

如果还有其他保存文件的进程,则可能需要重复该操作。


1
怎么> FD办?
2015年

它消除了文件描述符
阿德里安Deccico

2
这个>命令有名字​​吗?我必须从zsh切换到bash才能使用它。可以在zsh上运行它吗?
ariera

1
它是输出重定向,因此会截断文件。的长整数将是“ echo -n> 1”或“ true> 1”。它并没有真正删除FD,而是仅指向一个空文件。
eckes

8

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

如果事实证明文件是在其他地方引用的,我想您必须对文件ls -i进行查找以找到inode编号,然后使用-inum <inode-number>进行查找。对文件的其他引用(您可能还希望使用-mount来保持在同一文件系统内)。


4

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

  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)
    
  2. 使用终止进程sudo kill -9 {PID}。在上面的示例中,PID为1623。

    $ sudo kill -9 1623
    
  3. 运行df以检查是否已释放空间。如果仍然满了,也许您需要等待几秒钟,然后再次检查。


4

如果已将分区配置为仅保留磁盘空间的一部分以供root用户使用,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>

1

其他答案是正确的:如果删除文件,但空间没有被释放,则通常是因为文件仍保持打开状态,或存在其他硬链接。

为了帮助进行故障排除,请使用一种工具来告诉您驱动器空间的使用位置:您可以du用来获取空间使用情况的概述。更好的是,使用xdiskusage之类的图形工具(有很多这样的工具)来追查罪魁祸首。xdiskusage和朋友可以让您深入研究最大的太空猪,以找到空间的方向。

这样,您将迅速找到由于第二个硬链接而仍然占用空间的文件。它还将显示已删除但打开的文件所占用的空间(我相信,(因为权限未被允许),因为它无法读取文件名)。


1

由于我知道您中的许多人正在这样做,以用于Redhat /var和gzip压缩文件,期望FS会缩小,但实际上会增长,因此请确保您为syslog重新启动服务。和

lsof -v file

无论如何都会向您显示。


1
这实际上并没有增加多少。可接受的答案涵盖了2001年的逻辑。当您有50个代表时,如果要在现有答案中添加限定词,请使用注释。
安德鲁B

0

另一个选择:由于不断创建数据的过程(例如日志,核心等),磁盘可能已满。实际上有可能释放了空间但立即将其填满。我实际上已经看到过这种情况。df在这种情况下,根本无法给出孔的图片。使用du以了解详情。


0

我正在使用EXT2,在这种情况下FSCK帮助了我。立即尝试shudown -F,重新启动和fscks后,我看到一半的已用空间。


1
亲爱的马塞勒斯,您的解决方案已包含在已接受的答案中;有时如果您不被迫执行以下操作,则不想重新启动...
Deer Hunter 2013年

-1

要检查哪些已删除文件已占用内存,请输入以下命令

 $ sudo lsof | grep deleted

它将显示已删除的文件,其中包含内存。

然后使用pid或name终止进程

$ sudo kill <pid>
$ df -h

现在检查,您将拥有相同的内存

如果不是,请键入以下命令以查看哪个文件正在占用内存

# cd /
# du --threshold=(SIZE)

提及任何大小,它将显示超出阈值大小的文件正在占用,并删除文件,您会发现保留的内存


-4

打开终端,尝试此命令df -Th接下来使用此命令sudo du -h --max-depth = 1 /在此命令中,您将找到磁盘使用情况详细信息,然后以root用户身份打开,删除文件(root-local-share-trash)并删除您的文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.