稀疏(Sparse)文件的创建

  1. 在EXT2/EXT3文件系统上可以使用dd创建稀疏文件:

    Linux对稀疏(Sparse)文件的支持 _sparse$ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0
    Linux对稀疏(Sparse)文件的支持 _sparse0+0 records in
    Linux对稀疏(Sparse)文件的支持 _sparse0+0 records out
    Linux对稀疏(Sparse)文件的支持 _sparse$ ls -lh fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse-rw-rw-r--  1 zhigang zhigang 1.0G Feb  5 19:50 fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse$ du -sh fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse0       fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse

     
  2. 使用C语言来创建一个稀疏文件的方法如下:

    Linux对稀疏(Sparse)文件的支持 _sparse$ cat sparse.c
    Linux对稀疏(Sparse)文件的支持 _sparse#include 
    <sys/types.h>
    Linux对稀疏(Sparse)文件的支持 _sparse#include 
    <sys/stat.h>
    Linux对稀疏(Sparse)文件的支持 _sparse#include 
    <fcntl.h>
    Linux对稀疏(Sparse)文件的支持 _sparse#include 
    <unistd.h>
    Linux对稀疏(Sparse)文件的支持 _sparse
    Linux对稀疏(Sparse)文件的支持 _sparse
    int main(int argc, char *argv[])
    Linux对稀疏(Sparse)文件的支持 _Linux_16
    {
    Linux对稀疏(Sparse)文件的支持 _Linux_17    
    int fd = open("sparse.file", O_RDWR|O_CREAT);
    Linux对稀疏(Sparse)文件的支持 _Linux_17    lseek(fd, 
    1024, SEEK_CUR);
    Linux对稀疏(Sparse)文件的支持 _Linux_17    write(fd, 
    "\0"1);
    Linux对稀疏(Sparse)文件的支持 _Linux_17
    Linux对稀疏(Sparse)文件的支持 _Linux_17    
    return 0;
    Linux对稀疏(Sparse)文件的支持 _Linux_22}

    Linux对稀疏(Sparse)文件的支持 _sparse
    Linux对稀疏(Sparse)文件的支持 _sparse$ gcc 
    -o sparse sparse.c
    Linux对稀疏(Sparse)文件的支持 _sparse$ .
    /sparse
    Linux对稀疏(Sparse)文件的支持 _sparse$ ls 
    -l sparse.file
    Linux对稀疏(Sparse)文件的支持 _sparse
    -r-x--x---  1 zhigang zhigang 1025 Feb  5 23:12 sparse.file
    Linux对稀疏(Sparse)文件的支持 _sparse]$ du sparse.file
    Linux对稀疏(Sparse)文件的支持 _sparse
    4       sparse.file
    Linux对稀疏(Sparse)文件的支持 _sparse

     
  3.  使用python来创建一个稀疏文件的方法如下: 

    Linux对稀疏(Sparse)文件的支持 _sparse$ cat sparse.py
    Linux对稀疏(Sparse)文件的支持 _sparse
    #!/usr/bin/env python
    Linux对稀疏(Sparse)文件的支持 _sparse

    Linux对稀疏(Sparse)文件的支持 _sparse
    = open('fs.img''w')
    Linux对稀疏(Sparse)文件的支持 _sparsef.seek(
    1023)
    Linux对稀疏(Sparse)文件的支持 _sparsef.write(
    '\n')
    Linux对稀疏(Sparse)文件的支持 _sparse
    Linux对稀疏(Sparse)文件的支持 _sparse$ python sparse.py
    Linux对稀疏(Sparse)文件的支持 _sparse$ ls 
    -l fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse
    -rw-rw-r--  1 zhigang zhigang 1024 Feb  5 20:15 fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse$ du fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse
    4       fs.img
    Linux对稀疏(Sparse)文件的支持 _sparse


    文件稀疏化(sparsify)

    下面的方法都可以将一个文件稀疏化。

    1. cp:
     

    Linux对稀疏(Sparse)文件的支持 _sparse$ cp --sparse=always file file.sparse


    cp缺省使用--sparse=auto,会自动探测源文件中是否有空洞,以决定目标文件是否为稀疏文件;使用--sparse=never会禁止创建稀疏文件。

    2. cpio: 
     

    Linux对稀疏(Sparse)文件的支持 _sparse$ find file |cpio -pdmuv --sparse /tmp


    如果不加--sparse参数,稀疏文件中的空洞将被填满。 

    3. tar: 
     

    Linux对稀疏(Sparse)文件的支持 _sparse$ tar cSf - file | (cd /tmp/tt; tar xpSf -)Linux对稀疏(Sparse)文件的支持 _sparse


    如果不加 -S --sparse参数,稀疏文件中的空洞将被填满。 

     

    文件稀疏化(sparsify)效率比较

    下面我们创建一个500M的稀疏文件,比较一下几种文件稀疏化方法的效率。 

     

    Linux对稀疏(Sparse)文件的支持 _sparse$ dd if=/dev/zero of=file count=100 bs=1M seek=400
    Linux对稀疏(Sparse)文件的支持 _sparse100+0 records in
    Linux对稀疏(Sparse)文件的支持 _sparse100+0 records out
    Linux对稀疏(Sparse)文件的支持 _sparse$ time cp --sparse=always file file.sparse
    Linux对稀疏(Sparse)文件的支持 _sparsereal    0m0.626s
    Linux对稀疏(Sparse)文件的支持 _sparseuser    0m0.205s
    Linux对稀疏(Sparse)文件的支持 _sparsesys     0m0.390s
    Linux对稀疏(Sparse)文件的支持 _sparse
    Linux对稀疏(Sparse)文件的支持 _sparse$ time tar cSf - file | (cd /tmp; tar xpSf -)
    Linux对稀疏(Sparse)文件的支持 _sparsereal    0m2.732s
    Linux对稀疏(Sparse)文件的支持 _sparseuser    0m1.706s
    Linux对稀疏(Sparse)文件的支持 _sparsesys     0m0.915s
    Linux对稀疏(Sparse)文件的支持 _sparse
    Linux对稀疏(Sparse)文件的支持 _sparse$ time find file |cpio -pdmuv --sparse /tmp
    Linux对稀疏(Sparse)文件的支持 _sparse/tmp/file
    Linux对稀疏(Sparse)文件的支持 _sparse1024000 blocks
    Linux对稀疏(Sparse)文件的支持 _sparsereal    0m2.763s
    Linux对稀疏(Sparse)文件的支持 _sparseuser    0m1.793s
    Linux对稀疏(Sparse)文件的支持 _sparsesys     0m0.946s
    Linux对稀疏(Sparse)文件的支持 _sparse


    由此可见,上面几种文件稀疏化的方法中,cp的效率最高;tar和cpio由于使用管道,效率下降。

    使EXT2/EXT3文件系统稀疏化(sparsify)

    如何是一个文件系统的映像文件稀疏化?Ron Yorston为大家提供了几种方法,我觉得下面的方法最简单: 

    1. 使用Ron Yorston的zerofree将文件系统中未使用的块清零。
     

    Linux对稀疏(Sparse)文件的支持 _sparse$ gcc -o zerofree zerofree.c -lext2fs
    Linux对稀疏(Sparse)文件的支持 _sparse$ ./zerofree fs.img


    2.使用cp命令使映像文件稀疏化: 
     

    Linux对稀疏(Sparse)文件的支持 _sparse$ cp --sparse=always fs.img fs_sparse.img


     

    EXT2/EXT3文件系统的sparse_super参数

    这个参数与EXT2/EXT3是否支持Sparse文件无关;当打开该参数时,文件系统将使用更少的超级块(Super block)备份,以节省空间。

    如下的命令可以查看该参数:
     

    Linux对稀疏(Sparse)文件的支持 _sparse# echo stats | debugfs /dev/hda2 | grep -i features
    Linux对稀疏(Sparse)文件的支持 _sparseFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


    或者:
     

    Linux对稀疏(Sparse)文件的支持 _sparse# tune2fs -l /dev/hda2 |grep "Filesystem features"
    Linux对稀疏(Sparse)文件的支持 _sparseFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


    可以通过使用: 
     

    Linux对稀疏(Sparse)文件的支持 _sparse# tune2fs -O sparse_super


    或者:
     

    Linux对稀疏(Sparse)文件的支持 _sparse# tune2fs -s [0|1]


    来设置该参数。

    参考资料

    1. Keeping filesystem p_w_picpaths sparse:

              http://intgat.tigress.co.uk/rmy/uml/sparsify.html.