Linux中的df文件删除后没有显示正确的可用空间

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

如果这有什么区别的话,我在挂载的分区上得到了noatime标志。

删除文件名不会实际删除文件。 其他一些进程正在打开文件,导致它不被删除; 重新启动或终止该进程来释放该文件。

使用

 lsof +L1 

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

正如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”将是文件描述符。 现在input“> FD”来回收这个空间

 > 1 

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

一种可能是你删除的文件在文件系统中有更多的引用。 如果你已经创build了硬链接,几个文件名将指向相同的数据,而数据(实际内容)将不会被标记为可用/可用,直到所有引用都被删除。 在删除文件之前,要么将它们(Entry named Links)统一起来,要么对它们做ls -l(应该是第二列)。

如果确实文件被其他地方引用了,我想你将不得不使用ls -i文件来查找inode-number,然后使用-inum <inode-number>查找find的文件对这个文件的其他引用(你可能也想用-mount来保持在同一个文件系统中)。

其他答案是正确的:如果你删除了一个文件,并且空间没有被释放,通常是因为文件仍然保持打开状态,或者有其他的硬链接。

为了帮助解决问题,请使用一个工具来告诉您驱动器空间的使用位置:您可以使用du来了解空间的位置。 更好的是,使用像xdiskusage这样的graphics工具(有很多这样的)来追捕罪魁祸首。 xdiskusage和朋友让你深入到最大的空间猪寻找空间的去向。

这样,您将很快find仍然占用空间的文件,因为第二个硬链接。 它也将显示被删除,但打开的文件占用的空间(作为(权限被拒绝),我相信,因为它不能读取文件名)。

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

  1. 运行sudo lsof | grep deleted 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检查空间是否已经释放。 如果它还满,也许你需要等几秒钟再检查一次。

因为我知道很多人在/var和gzip文件中都是这样做的,希望FS能够缩小,但是却会增长,只要确保你的系统日志重启。 和

 lsof -v file 

无论如何会告诉你。

如果分区已经被configuration为只为root用户保留一定的磁盘空间部分,那么df将不包括这个可用的空间。

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

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

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

另外,您可以通过运行来检查文件系统configuration

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

并自行计算实际百分比。

要更改保留仅用于根目录的磁盘%,请执行

 tune2fs -m <percentage> <device> 

还有一个select:由于持续创build数据的进程,日志,核心等等,磁盘可能已满。 空间实际上可能被释放,但立即被填满。 我曾经见过这样的情况。 df在这种情况下根本不会给出洞图。 使用du了解更多。

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

打开terminal试试这个命令df -Th下一步使用这个命令sudo du -h –max-depth = 1 /在这个命令中你会发现磁盘使用情况,然后以root用户身份打开用户删除文件(root-local-share-trash)并删除你的文件