zoukankan      html  css  js  c++  java
  • Linux对稀疏(Sparse)文件的支持

    稀疏(Sparse)文件的创建

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

      None.gif$ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0
      None.gif0+0 records in
      None.gif0+0 records out
      None.gif$ ls -lh fs.img
      None.gif-rw-rw-r--  1 zhigang zhigang 1.0G Feb  5 19:50 fs.img
      None.gif$ du -sh fs.img
      None.gif0       fs.img
      None.gif

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

      None.gif$ cat sparse.c
      None.gif#include 
      <sys/types.h>
      None.gif#include 
      <sys/stat.h>
      None.gif#include 
      <fcntl.h>
      None.gif#include 
      <unistd.h>
      None.gif
      None.gif
      int main(int argc, char *argv[])
      ExpandedBlockStart.gif
      {
      InBlock.gif    
      int fd = open("sparse.file", O_RDWR|O_CREAT);
      InBlock.gif    lseek(fd, 
      1024, SEEK_CUR);
      InBlock.gif    write(fd, 
      "\0"1);
      InBlock.gif
      InBlock.gif    
      return 0;
      ExpandedBlockEnd.gif}

      None.gif
      None.gif$ gcc 
      -o sparse sparse.c
      None.gif$ .
      /sparse
      None.gif$ ls 
      -l sparse.file
      None.gif
      -r-x--x---  1 zhigang zhigang 1025 Feb  5 23:12 sparse.file
      None.gif]$ du sparse.file
      None.gif
      4       sparse.file
      None.gif

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

      None.gif$ cat sparse.py
      None.gif
      #!/usr/bin/env python
      None.gif

      None.gif
      = open('fs.img''w')
      None.giff.seek(
      1023)
      None.giff.write(
      '\n')
      None.gif
      None.gif$ python sparse.py
      None.gif$ ls 
      -l fs.img
      None.gif
      -rw-rw-r--  1 zhigang zhigang 1024 Feb  5 20:15 fs.img
      None.gif$ du fs.img
      None.gif
      4       fs.img
      None.gif


      文件稀疏化(sparsify)

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

      1. cp:

      None.gif$ cp --sparse=always file file.sparse


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

      2. cpio:

      None.gif$ find file |cpio -pdmuv --sparse /tmp


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

      3. tar:

      None.gif$ tar cSf - file | (cd /tmp/tt; tar xpSf -)None.gif


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

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

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

      None.gif$ dd if=/dev/zero of=file count=100 bs=1M seek=400
      None.gif100+0 records in
      None.gif100+0 records out
      None.gif$ time cp --sparse=always file file.sparse
      None.gifreal    0m0.626s
      None.gifuser    0m0.205s
      None.gifsys     0m0.390s
      None.gif
      None.gif$ time tar cSf - file | (cd /tmp; tar xpSf -)
      None.gifreal    0m2.732s
      None.gifuser    0m1.706s
      None.gifsys     0m0.915s
      None.gif
      None.gif$ time find file |cpio -pdmuv --sparse /tmp
      None.gif/tmp/file
      None.gif1024000 blocks
      None.gifreal    0m2.763s
      None.gifuser    0m1.793s
      None.gifsys     0m0.946s
      None.gif


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

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

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

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

      None.gif$ gcc -o zerofree zerofree.c -lext2fs
      None.gif$ ./zerofree fs.img


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

      None.gif$ cp --sparse=always fs.img fs_sparse.img


       

      EXT2/EXT3文件系统的sparse_super参数

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

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

      None.gif# echo stats | debugfs /dev/hda2 | grep -i features
      None.gifFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


      或者:

      None.gif# tune2fs -l /dev/hda2 |grep "Filesystem features"
      None.gifFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


      可以通过使用:

      None.gif# tune2fs -O sparse_super


      或者:

      None.gif# tune2fs -s [0|1]


      来设置该参数。

      参考资料

      1. Keeping filesystem images sparse:

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

  • 相关阅读:
    数量关系
    笨办法学python问题记录
    CSS布局与定位
    python学习 预备篇
    基于hexo搭建个人博客
    CSS常用样式
    计算机组成原理(期末篇)
    Codeblock错误提示栏隐藏
    Markdown标记语言
    笨办法学python(不同版本的python代码差别)
  • 原文地址:https://www.cnblogs.com/aquester/p/9891895.html
Copyright © 2011-2022 走看看