193 linux filesystems disk-space-utilization
我有用于存储文件的文件服务器。文件可能会在那里驻留一周或一年。不幸的是,当我从服务器中删除文件时,df命令不会反映释放的空间。所以最终,服务器被填满(df显示 99%),并且我的脚本不会在那里发送更多文件,除非那里可能有几十 GB 的可用空间。
noatime如果这有什么不同,我会在已安装的分区上得到标志。
Ign*_*ams 316
删除文件名实际上并没有删除文件。其他一些进程正在保持文件打开,导致它不被删除;重新启动或终止该进程以释放文件。
用
lsof +L1
Run Code Online (Sandbox Code Playgroud)
找出哪个进程正在使用已删除(未链接)的文件。
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)
如果有其他进程持有该文件,您可能需要重复该操作。
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)
该文件仍被打开它的进程锁定。要释放空间,请执行以下步骤:
运行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)使用sudo kill -9 {PID}. 在上面的示例中,PID 为 1623。
$ sudo kill -9 1623
Run Code Online (Sandbox Code Playgroud)运行df以检查空间是否已被释放。如果它仍然已满,也许您需要等待几秒钟并再次检查。