告诉 fs 现在从已删除的文件中释放空间

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)

会告诉您哪些已删除的文件仍处于打开状态。

  • 您也可以使用 `lsof +L1`(选择已取消链接的打开文件)。 (19认同)

小智 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)

  • 多余地使用 `cat` 来截断。在 Bourne shell 中,只需 `&gt; /proc/3446/fd/128` 就可以了。 (5认同)
  • 如果您的程序实际上希望将来重新读取文件的任何部分,这些部分可能在页面缓存中可用,也可能不可用,请不要这样做。 (2认同)

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)

如何更改“保留块百分比”

  1. 将保留空间减少到 4%

    # tune2fs -m4 /dev/sda4

df -h 现在显示45M免费。

  1. 快速保存我的文件
  2. 把它放回 5%

    # tune2fs -m5 /dev/sda4

  • @jofel,不,不是。每当利用率超过 90% 时,就会开始出现大量碎片。您需要释放更多空间,而不是接近 100% 的利用率。 (4认同)
  • for root 保留空间现在几乎总是太大。您可以将其减少到几个百分点。`df` 显示普通用户可用空间。由于 apt 以 root 身份运行,保留空间仅用于防止由非 root 用户(=普通用户和拥有自己用户的服务)引起的填充。 (2认同)

kwa*_*ick 9

在 Ubuntu 中,如果您使用垃圾箱删除文件,您的文件很可能不会被完全删除。

即使清空垃圾箱后,您的文件仍将保留,~/.local/share/Trash/expunged直到重新启动后,甚至可能更长时间。

我还没有找到一个很好的理由,但是如果我的空间用完了,我总是手动rm删除已删除的垃圾文件。


Sep*_*ero 6

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 循环并向每个文件输出任何内容,将它们设置为空。

  • 我在意外标记“(”附近遇到了一个错误“语法错误” (3认同)

njs*_*jsg 5

我想知道sync这里是否有任何帮助 - 但它不应该是,因为在大多数(“许多”?)系统中,文件系统每 30 秒同步一次。

我会检查内核日志(so dmesg)以查找是否有任何令人讨厌的事情发生并运行lsof以查看是否有任何已删除的大文件仍然打开(实际上,我认为已删除的文件将在lsof输出中标记为如此)。

可能导致已删除文件不释放空间的两个原因(其中一个在您链接的问题中指出)是

  • 未实际删除的文件:您删除了一个在其他地方硬unlink()链接的文件(更准确地说,您编辑了一个包含多个链接的文件)
  • 仍然打开的文件:打开的文件是使用文件、inode本身而不是目录条目来保存的,如果删除条目,只要它仍然打开,inode 就会保留在那里。

但我不知道为什么这么多文件会发生这种情况的具体原因......