• Linux文件空洞与稀疏文件 转


     


     
    1、Linux文件空洞与稀疏文件
    2、文件系统数据存储
    3、文件系统调试
     
    文件空洞
     
    1. 在UNIX文件操作中,文件位移量可以大于文件的当前长度
      在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞。位于文件中但没有写过的字节
      都被设为 0。
    2. 如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”
      在文件里创造“空洞(hole)”。
      没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定

    20140913144536_1

    稀疏文件(Sparse File)

    1. 稀疏文件与其他普通文件基本相同,区别在于文件中的部分数据是全0,且这部分数据不占用磁盘
      空间。
      下面是稀疏文件的创建与查看
    [root@localhost ~]# dd if=/dev/zeroof=sparse-file bs=1 count=1 seek=1024k
    [root@localhost ~]# ls -l sparse-file
    -rw-r--r-- 1 root root 1048577 Oct 15 17:50 sparse-file
    [root@localhost ~]# du -sh sparse-file
    8.0K sparse-file
    [root@localhost ~]# cat anaconda-ks.cfg >> sparse-file
    [root@localhost ~]# du -sh sparse-file
    12K sparse-file
    [root@localhost ~]# du -sh anaconda-ks.cfg
    12K anaconda-ks.cfg
    [root@localhost ~]#

    Linux文件系统inode数据块存储

    索引节点采用了多重索引结构,主要体现在直接指针和3个间接指针。直接指针包含12个直接指
    针块,它们直接指向包含文件数据的数据块,紧接在后面的3个间接指针是为了适应文件的大小
    变化而设计。

    20140913144536_2

    Linux稀疏文件inode数据块存储

    文件系统存储稀疏文件时,inode索引节点中,只给出实际占用磁盘空间的Block 号,
    数据全零且不占用磁盘空间的文件Block并没有物理磁盘Block号。

    20140913144536_3

    Linux稀疏文件inode数据块存储

    • 文件空洞部分不占用磁盘空间
    • 文件所占用的磁盘空间仍然是连续的

    20140913144536_4

    实例:

    [root@localhost mnt]# du -sh sparse-file
    20K sparse-file
    [root@localhost mnt]# ls -lh sparse-file
    -rw-r--r-- 1 root root 1.1G Oct 15 10:36 sparse-file
    [root@localhost mnt]#
    debugfs: stat sparse-file
    Inode: 49153 Type: regular Mode: 0644 Flags:
    0x0 Generation: 3068382963
    User: 0 Group: 0 Size: 1073742848
    File ACL: 0 Directory ACL: 0
    Links: 1 Blockcount: 40
    Fragment: Address: 0 Number: 0 Size: 0
    ctime: 0x507b76af -- Mon Oct 15 10:36:31 2012
    atime: 0x507b765f -- Mon Oct 15 10:35:11 2012
    mtime: 0x507b76af -- Mon Oct 15 10:36:31 2012
    BLOCKS:
    (IND):106496, (256):106497, (DIND):106504,
    (IND):106505, (262144):106506
    TOTAL: 5

    Linux文件系统数据块存储多重索引

    • Linux文件系统数据存放采用inode多
      重索引结构,有直接指针和3个间接指
      针。
      类似于编程中的变量定义:
      unsigned long blk;
      unsigned long *blk;
      unsigned long **blk;
      unsigned long ***blk;
    • 直接指针直接指向保存数据的Block
      号。
    • 一级指针指向一个Block,该Block中
      的数据是Block指针,指向真正保存数
      据的Block。
      二级三级指针以此类推。

    20140913144536_5

    1. 前12个直接指针,直接指向存储的数据区域
      如Blocks大小为4096,则前12个直接指针就可以保存48KB文件。
    2. 一级指针可存储文件大小计算
      假设每个指针占用4个字节,则一级指针指向的Block可保存4096/4个
      指针,可指向1024个Blocks。一级指针可存储文件数据大小为1024*4096 =
      4MB。
    3. 二级指针可存储文件大小计算
      同样按照Blocks大小为4096,则二级指针可保存的Block指针数量为(4096/4) *
      (4096/4) = 1024*1024。则二级指针可保存的文件数量大小为(1024*1024)*4096
      = 4GB。
    4. 三级指针可存储文件大小计算
      以一级、二级指针计算方法类推,三级指针可存储的文件数据大小为
      (1024*1024*1024)*4096 = 4TB。

    20140913144536_6

    Linux_File_Hole_And_Sparse_Files

     

  • 相关阅读:
    Windows删除被占用的文件或文件夹
    Fatal error in launcher: Unable to create process using
    World/excel无法同时打开两个解决办法
    Zabbix故障处理系列
    第1章 数据库系统概述
    第2章 关系数据库
    第3章 数据库设计
    Linux命令概况
    Python -扩展C++-Pytorch扩展
    技术栈_人工智能-大数据-云计算
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5452759.html
Copyright © 2020-2023  润新知