Linux上的稀疏文件(用ls和du命令看到的大小不一样)

在用find查看系统中一些大文件时,发现一些/var/log下面的文件其真实磁盘占用空间的大小与find中设置的size选项筛选的不一致。如下:

尽管是用find筛选出文件大小大于200MB的,但其中的/var/log/rpmdbdata.mdb 占用的磁盘空间只有47MB,/var/log/lastlog 则更少 只占用200KB的磁盘空间。

原来 find 中的size筛选针对的是文件大小,而 ls 的 -s 选项是显示实际占用的磁盘空间大小,du 命令也是查看文件占用的磁盘空间。(当然平时的ls -l 不用 -s 选项时 显示的文件大小 而非磁盘空间占用量)
当发现du看到的占用磁盘大小比ls看到的文件大小 小一些时,说明该文件是稀疏文件。

现代很多文件系统都支持稀疏文件(sparse file),稀疏文件内存在空洞(hole)就是一些值为0的空间,在存储时这部分只存储一些元数据表示空洞而不是真正存有为0的值,这样起到节省磁盘空间的作用。在虚拟化中的磁盘镜像,经常用到稀疏文件(qcow2/raw等格式都支持sparse file)。稀疏文件示意图 如下图所示:

同时在find命令中使用 -printf "%S" 也是可以直接打印出稀疏文件的稀疏值的,稀疏文件的稀疏值是小于1的。演示如下:

可以看到 /var/log/rpmdbdata.mdb 的稀疏值为0.181564,/var/log/lastlog 的稀疏值则更小。满足这个公式:文件大小 * 稀疏值 = 实际的磁盘占用空间大小

查询的man手册中关键信息:

参考资料:
https://wiki.archlinux.org/index.php/sparse_file

Handling Sparse Files on Linux


https://www.lisenet.com/2014/so-what-is-the-size-of-that-file/
man ls, man find

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*