Linux對稀疏(Sparse)文件的支持



稀疏(Sparse)文件可以節省大量的磁盤空間,目前很多文件系統都支持。下面介紹了Linux對稀疏(Sparse)文件的支持。

稀疏(Sparse)文件的創建

在EXT2/EXT3文件系統上可以使用dd創建稀疏文件:
$ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0
0+0 records in
0+0 records out
$ ls -lh fs.img
-rw-rw-r-- 1 zhigang zhigang 1.0G Feb 5 19:50 fs.img
$ du -sh fs.img
0 fs.img
使用C語言來創建一個稀疏文件的方法如下:
$ cat sparse.c
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    int fd = open("sparse.file", O_RDWR|O_CREAT);
    lseek(fd, 1024, SEEK_CUR);
    write(fd, "\0", 1);

    return 0;
}

$ gcc -o sparse sparse.c
$ ./sparse
$ ls -l sparse.file
-rx--x--- 1 zhigang zhigang 1025 Feb 5 23:12 sparse.file
$ du sparse.file
4 sparse.file
使用python來創建一個稀疏文件的方法如下:
$ cat sparse.py
#!/usr/bin/env python

f = open('fs.img', 'w')
f.seek(1023)
f.write('\n')

$ python sparse.py
$ ls -l fs.img
-rw-rw-r-- 1 zhigang zhigang 1024 Feb 5 20:15 fs.img
$ du fs.img
4 fs.img
文件稀疏化(sparsify)

下面的方法都可以將一個文件稀疏化。

cp:
$ cp --sparse=always file file.sparse
cp缺省使用--sparse=auto,會自動探測源文件中是否有空洞,以決定目標文件是否為稀疏文件;使用--sparse=never會禁止創建稀疏文件。
cpio:
$ find file |cpio -pdmuv --sparse /tmp
如果不加--sparse參數,稀疏文件中的空洞將被填滿。
tar:
$ tar cSf - file | (cd /tmp/tt; tar xpSf -)
如果不加-S --sparse參數,稀疏文件中的空洞將被填滿。
文件稀疏化(sparsify)效率比較

下面我們創建一個500M的稀疏文件,比較一下幾種文件稀疏化方法的效率。
$ dd if=/dev/zero of=file count=100 bs=1M seek=400
100+0 records in
100+0 records out
$ time cp --sparse=always file file.sparse
real 0m0.626s
user 0m0.205s
sys 0m0.390s

$ time tar cSf - file | (cd /tmp; tar xpSf -)
real 0m2.732s
user 0m1.706s
sys 0m0.915s

$ time find file |cpio -pdmuv --sparse /tmp
/tmp/file
1024000 blocks
real 0m2.763s
user 0m1.793s
sys 0m0.946s
由此可見,上面幾種文件稀疏化的方法中,cp的效率最高;tar和cpio由於使用管道,效率下降。
使EXT2/EXT3文件系統稀疏化(sparsify)

如何是一個文件系統的映像文件稀疏化?Ron Yorston為大家提供了幾種方法,我覺得下面的方法最簡單:
使用Ron Yorston的zerofree將文件系統中未使用的塊清零。
$ gcc -o zerofree zerofree.c -lext2fs
$ ./zerofree fs.img
使用cp命令使映像文件稀疏化:
$ cp --sparse=always fs.img fs_sparse.img
EXT2/EXT3文件系統的sparse_super參數

這個參數與EXT2/EXT3是否支持Sparse文件無關;當打開該參數時,文件系統將使用更少的超級塊(Super block)備份,以節省空間。

如下的命令可以查看該參數:
# echo stats | debugfs /dev/hda2 | grep -i features
Filesystem features: has_​​journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
或者:
# tune2fs -l /dev/hda2 |grep "Filesystem features"
Filesystem features: has_​​journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
可以通過使用:
# tune2fs -O sparse_super
或者:
# tune2fs -s [0|1]
來設置該參數。
參考資料

Keeping filesystem images sparse: http://intgat.tigress.co.uk/rmy/uml/sparsify.html .

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

遠程控制管理工具ipmitool