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

简介: 稀疏(Sparse)文件的创建 在EXT2/EXT3文件系统上可以使用dd创建稀疏文件:$ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=00+0 records in0+0 records out$ ls -lh fs.

稀疏(Sparse)文件的创建

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

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

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

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

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

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

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

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


    文件稀疏化(sparsify)

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

    1. cp:

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


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

    2. cpio:

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


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

    3. tar:

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


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

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

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

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


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

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

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

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

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


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

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


     

    EXT2/EXT3文件系统的sparse_super参数

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

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

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


    或者:

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


    可以通过使用:

    img_a6339ee3e57d1d52bc7d02b338e15a60.gif # tune2fs -O sparse_super


    或者:

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


    来设置该参数。

    参考资料

    1. Keeping filesystem images sparse:

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

相关文章
|
2月前
|
Linux 数据安全/隐私保护 Windows
命令方式:window向linux传文件
【10月更文挑战第6天】本文介绍了如何在Linux系统中通过命令`ip a`获取IP地址,并在Windows系统下使用CMD命令行工具和SCP命令实现文件传输。示例展示了如何将D盘中的`mm.jar`文件上传至IP地址为192.168.163.122的Linux系统的/up/目录下,最后在Linux系统中确认文件传输结果。
249 65
|
2月前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
260 5
|
2月前
|
Linux Shell 数据库
Linux文件查找新姿势:总有一种你没见过
【10月更文挑战第18天】文件查找是Linux用户提升工作效率的重要技能。本文介绍了几种实用的文件查找方法,包括基础的`find`命令、快速的`locate`和`mlocate`、高效的`fd`工具、以及结合`grep`和`rg`进行内容搜索。此外,还提供了编写Shell脚本和使用图形界面工具的建议,帮助你更灵活地管理文件。
72 3
|
2月前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
|
17天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
39 5
|
17天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
36 6
|
17天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
50 6
|
18天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
33 4
|
24天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
43 2
|
2月前
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
40 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for