Mar*_*cos 77 ext4 disk-usage ext3 proc df
有没有办法告诉内核现在返还可用磁盘空间?就像在 /proc/ 中写入内容一样?使用 Ubuntu 11.10 和 ext4。
这可能是一个古老而重复的主题。只有当我的编辑器无法保存我打开的源代码文件时才注意到 0 空间后,令我恐惧的是文件夹列表中现在有 0 字节大小,我继续疯狂删除。
我从用户和 root 中删除了 100 MB 的大文件,并且还做了一些硬链接。
就在我这样做之前apt-get clean
,/var/cache/apt/archives 中有超过 900MB,现在只有 108KB:
# du
108 /var/cache/apt/archives
Run Code Online (Sandbox Code Playgroud)
一个小时后仍然没有可用空间并且无法保存我在编辑器中打开的宝贵文件,但请注意以下差异:
# sync; df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda4 13915072 13304004 0 100% /
Run Code Online (Sandbox Code Playgroud)
有什么建议?我关闭了一些服务/进程,但不确定如何检查谁可能正在积极占用磁盘空间。
更多信息
# dumpe2fs /dev/sda4
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 884736
Block count: 3534300
Reserved block count: 176715
Free blocks: 422679
Free inodes: 520239
First block: 0
Block size: 4096
Fragment size: 4096
Run Code Online (Sandbox Code Playgroud)
小智 123
检查lsof
是否有打开的文件。在它们关闭之前不会释放空间。
sudo /usr/sbin/lsof | grep deleted
Run Code Online (Sandbox Code Playgroud)
会告诉您哪些已删除的文件仍处于打开状态。
小智 38
使用lsof
查找删除,但是打开,文件仍然占用空间:
lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome 3446 user 128u REG 253,2 16400 2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
Run Code Online (Sandbox Code Playgroud)
找到/proc/<pid>/fd/
与文件句柄对应的条目:
ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
Run Code Online (Sandbox Code Playgroud)
现在,只需cat /dev/null
进入 fd:
cat /dev/null > /proc/3446/fd/128
Run Code Online (Sandbox Code Playgroud)
请注意,inode 仍处于打开状态,但现在长度为 0
chrome 3446 user 128u REG 253,2 0 2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
Run Code Online (Sandbox Code Playgroud)
Mar*_*cos 13
df
不会显示保留的空间root
(即使作为 运行root
):
# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/optvol 625G 607G 0 100% /opt
...
Run Code Online (Sandbox Code Playgroud)
将保留空间减少到 4%
# tune2fs -m4 /dev/sda4
df -h
现在显示45M免费。
把它放回 5%
# tune2fs -m5 /dev/sda4
在 Ubuntu 中,如果您使用垃圾箱删除文件,您的文件很可能不会被完全删除。
即使清空垃圾箱后,您的文件仍将保留,~/.local/share/Trash/expunged
直到重新启动后,甚至可能更长时间。
我还没有找到一个很好的理由,但是如果我的空间用完了,我总是手动rm
删除已删除的垃圾文件。
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done
Run Code Online (Sandbox Code Playgroud)
说明:
Greplsof
输出仅提取已删除的文件。sed 从每一行中提取进程 id 和文件描述符 id,并创建一个格式为 的字符串{pid}/fd/{fid}
。While 循环并向每个文件输出任何内容,将它们设置为空。
我想知道sync
这里是否有任何帮助 - 但它不应该是,因为在大多数(“许多”?)系统中,文件系统每 30 秒同步一次。
我会检查内核日志(so dmesg
)以查找是否有任何令人讨厌的事情发生并运行lsof
以查看是否有任何已删除的大文件仍然打开(实际上,我认为已删除的文件将在lsof
输出中标记为如此)。
可能导致已删除文件不释放空间的两个原因(其中一个在您链接的问题中指出)是
unlink()
链接的文件(更准确地说,您编辑了一个包含多个链接的文件)但我不知道为什么这么多文件会发生这种情况的具体原因......