告诉fs立即释放已删除文件中的空间


73

有没有办法告诉内核现在释放可用磁盘空间?就像在/ proc /中写东西一样?结合使用Ubuntu 11.10和ext4。

这可能是一个古老且反复出现的主题。在只有我的编辑器无法保存我打开的源代码文件时才注意到0的空间后,令我感到恐惧的是,现在文件夹列表中的文件大小为0字节,我继续疯狂删除。

我从用户和根目录删除了100兆MB的大文件,并且也进行了一些硬链接。

就在我这样做之前apt-get clean,/ var / cache / apt / archives中有900MB以上的空间,现在只有108KB:

# du
108 /var/cache/apt/archives

一个小时后,仍然没有可用空间,无法保存在编辑器中打开的宝贵文件,但是请注意以下差异:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

有什么建议么?我关闭了一些服务/进程,但不确定如何检查谁可能正在主动占用磁盘空间。

更多信息

# 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

4
文件系统立即释放空间。但是,ext [234]的根保留块功能以及内核如何保留打开的文件保留可能会显示出丢失的空间。
hhaamu'3

如果您有多个文件系统(分区),则释放一个文件系统中的空间不会对另一个文件系统产生任何好处。
vonbrand 2014年

为什么在“保留的” 5Go块回收之前,我能够填充分区?
Psddp 2014年

Answers:


116

检查lsof以查看是否有打开的文件。除非关闭,否则不会释放空间。

sudo /usr/sbin/lsof | grep deleted

会告诉您哪些已删除文件仍保持打开状态。


好。向我展示了mysqld/ tmp中的一些锁,但是apport-gt/ var / lib / apt / lists / partial /中的绝种文件的许多使用显然正在积累。因此,我可能killall apport-gt但会先进行调查。
马科斯(Marcos)2012年

1
标记为最接近的答案,尽管在关闭使用它们的文件句柄/进程之后,绝对不会立即“退回”该空间。寻找其他基于内核/ proc / fs的方法。
马科斯(Marcos)2012年

18
您也可以使用lsof +L1(选择已取消链接的打开文件)。
马丁·菲多

该答案中的信息是正确的,但是OP所遇到的问题可能不是由此引起的,而是由根保留空间(另一个答案解决了)引起的。
marcelm

37

使用lsof查找删除,但是打开,文件仍然占用空间:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

/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)

现在,cat /dev/null进入fd:

cat /dev/null > /proc/3446/fd/128

请注意,索引节点仍处于打开状态,但是长度为0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
多余的使用cat来截断。在Bourne shell中,就> /proc/3446/fd/128可以了。
200_success 2014年

2
如果实际上希望您的程序将来重新读取文件的任何部分,而该部分在页面高速缓存中可能不可用,则不要执行此操作。
Michael R. Hines

13

df不会显示保留的空间root(即使以方式运行root):

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

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

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

    # tune2fs -m4 /dev/sda4

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

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

    # tune2fs -m5 /dev/sda4


2
如今,用于根保留的空间几乎总是太大。您可以将其减少到百分之几。df显示普通用户可用空间。由于apt以root身份运行,因此保留的空间仅用于防止非root用户(=普通用户和拥有自己用户的服务)引起的填充。
jofel 2012年

我同意; 在mkfs这些日子里应该预留如。5%或300MB,以较小者为准。只需将我的某些服务器重新调整为2%,然后释放GB!
马科斯

3
@jofel,不,不是。每当利用率超过90%时,就会开始出现大量碎片。您需要释放更多空间,而不要接近100%的利用率。
psusi 2012年

@psusi是的,谢谢您的评论。但是,以普通用户的身份使用(临时)几乎所有可用空间的机会实际上是切实可行的,而使用ext4,情况不再那么糟糕,请参见unix.stackexchange.com/a/7965/15241
jofel 2012年

7

在Ubuntu中,如果使用垃圾桶删除了文件,则文件很可能不会被完全删除。

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

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


1
好点子。即使我是在命令行中生死攸关的人之一,也很少使用图形文件管理器。尚未注意到删除的文件夹是一个藏身之处- 空垃圾桶单击始终是最终操作,并在需要时返回我的磁盘空间。
马科斯(Marcos)2012年

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

说明:
Grep lsof输出仅提取已删除的文件。Sed从每一行中提取进程ID和FileDescriptor ID,并创建格式为的字符串{pid}/fd/{fid}。while循环,不输出任何内容到每个文件,将它们设置为空。


3
我在意外的令牌`('附近收到错误“语法错误
Majid Golshadi

5

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

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

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

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

但是我不知道为什么这么多文件可能会发生的具体原因...


sync从来没有帮助。至于日志,它是一个Ubuntu系统,所以它有很多bug,是的,它们通常很吵。apport之所以经常进行部署,是因为每个每晚的apt-get更新都会崩溃,尽管/ var / crash只有77MB。还注意到atd/ var / log / syslog充满了重复的行,atd[8892]: File a0015c0152ab76 is in wrong format - aborting可能是因为/ var / spool / cron / atspool中的几个文件都是0,这使问题成圆形了
Marcos

1

当您清空垃圾桶时,CentOS 6.3也会执行实际上不是清空的垃圾桶。直到我刚跑完,我才找到一种回收空间的方法rm -rf ~/.local/share/Trash/expunged/。造成了很多头疼。

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.