原因:
我好像也没做什么,只是上次关机前解压了很多大文件,删了很多大文件。
开机提示:卷“文件系统根目录“仅剩0字节磁盘空盘。
Tab提示:无法为立即文档创建临时文件:设备没有空间
使用 磁盘使用情况分析器可以查看每个文档的大小
用 df -h查看磁盘空间,发现46G的系统根目录满了。
可能原因是Ubuntu删除文件的机制有关。
文件删除的原理
这里的原理涉及到文件系统,我对这里也不是很清楚,只说大概的理解,相信探究文件是怎样删除的足够再写一篇很不错的博客了。
当我们使用rm删除文件时,会调用unlink/unlinkat系统调用。
man如下
The unlink() function shall remove a link to a file.
…………
When the file’s link count becomes 0 and no process has the file open,
the space occupied by the file shall be freed and the file shall no
longer be accessible. If one or more processes have the file open when
the last link is removed, the link shall be removed before unlink()
returns, but the removal of the file contents shall be postponed until
all references to the file are closed.
大意 unlink是移除一个对目标文件的link,当这个link的计数到0,并且没有进程打开着这个文件,文件占用的空间会被释放,这个文件也不再能被访问了。
当最后一个link被移除时,如果有一个以上的进程打开着这个文件,那么这个文件内容的移除会直到所有引用(reference)关闭。
所以
我们删除大文件之后,还要确保打开它的进程也关闭才行,才能真正的释放磁盘空间。(没错这是个大日志文件)
1. 我们用 du -h -x --max-depth=1 依次查看文件系统
删除较大的日志文件。
2.当删除大量小文件组成的文件夹时用 rm -rf *就不是很好用了,隔一段时间就要这样清理一次。在这种情况之下我们可以使用linux系统命令rsync来巧妙的处理。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
ubuntu系统安装:sudo apt-get install rsync
rsync --help | grep delete
--del an alias for --delete-during
--delete delete extraneous files from destination dirs
--delete-before receiver deletes before transfer, not during
--delete-during receiver deletes during transfer (default)
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
--delete-excluded also delete excluded files from destination dirs
--ignore-errors delete even if there are I/O errors
--max-delete=NUM don't delete more than NUM files
其中--delete-before接收者在传输之前进行删除操作
当要清空目录或文件时,先建立一个空目录:
mkdir /data/blank
然后用rsync删除目标目录
rsync --delete-before -d -a -H -v --progress --stats /data/blank/ /var/edatacache/
或者
rsync --delete-before -d /data/blank/ /var/edatacache/
这样/var/edatacache目录就被快速的清空了。
选项说明:
–delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
–stats 给出某些文件的传输状态
-d transfer directories without recursing