深度剖析 Linux cp 命令的秘密(12)

  • 实际数据在 [0, 4K] 和 [1M, 1M+4K] 这两个位置才有写入;
  • 其中 [0, 4K] 范围为正常数据,[1M, 1M+4K] 这段范围的数据为全 0 数据;
  • 好,初始条件准备好了,下面我们开始对 cp --sparse 的三个行为做实验 。
    cp 的实验验证默认策略:
    cp ./test.txt ./test.txt.autoalways 策略:
    cp --sparse=always ./test.txt ./test.txt.alwaysnever 策略(这条命令敲下去可能有点慢哦,并且要预留好足够空间):
    cp --sparse=never ./test.txt ./test.txt.never以上三个命令敲完,生成了三个文件,给大家 1 秒钟的思考时间,思考下 test.txt.auto,test.txt.always,test.txt.never,这三个文件的属性有何异同 。
    ..... ..... .....
    结果揭秘:
    test.txt.auto
    sh-4.4# stat ./test.txt.auto  File: ./test.txt.auto  Size: 1073741824 Blocks: 16         IO Block: 4096   regular fileDevice: 6ah/106d Inode: 3148348     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2021-03-13 15:58:57.395725000 +0000Modify: 2021-03-13 15:58:57.395725000 +0000Change: 2021-03-13 15:58:57.395725000 +0000 Birth: -
    • Size: 1073741824:文件大小 1G
    • Blocks: 8:物理空间占用 8K
    test.txt.always
    sh-4.4# stat ./test.txt.always  File: ./test.txt.always  Size: 1073741824 Blocks: 8          IO Block: 4096   regular fileDevice: 6ah/106d Inode: 3148349     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2021-03-13 15:59:01.064725000 +0000Modify: 2021-03-13 15:59:01.064725000 +0000Change: 2021-03-13 15:59:01.064725000 +0000 Birth: -
    • Size: 1073741824:文件大小 1G
    • Blocks: 8:物理空间占用 4K
    test.txt.never
    sh-4.4# stat ./test.txt.never  File: ./test.txt.never  Size: 1073741824 Blocks: 2097160    IO Block: 4096   regular fileDevice: 6ah/106d Inode: 3148350     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2021-03-13 15:59:04.774725000 +0000Modify: 2021-03-13 15:59:05.977725000 +0000Change: 2021-03-13 15:59:05.977725000 +0000 Birth: -
    • Size: 1073741824:文件大小 1G
    • Blocks: 2097160:物理空间占用 1G
    所以,你学会了吗?
    深度剖析 Linux cp 命令的秘密

    文章插图
     
    知识点总结
    深度剖析 Linux cp 命令的秘密

    文章插图
     
    1. 文件系统对外提供文件语义,本质只是管理磁盘空间的软件而已;
    2. 经典的文件系统主要划分 3 大块 superblock 区,inode 区,block 区(块描述区,bitmap区这里暂不介绍) 。一个文件在文件系统的内部形态由一个 inode 记录元数据加上 block 存储用户存储用户数据样子;
    3. 文件系统的 size 是文件大小,是逻辑空间大小,文件大小 size 和真实的物理空间并不是一个概念;
    4. 稀疏语义是文件系统提供的一种特性,根本用途是用来更有效的利用磁盘空间;
    5. 后分配空间是空间利用最有效的方式,公有云的云盘靠什么赚钱?就是后分配,你买了 2T 的云盘,在没有写入数据的时候,一个字节都没给你分配,你却是付出 2T 的价格;
    6. stat 命令能够查看物理空间占用,Blocks 表示的是扇区(512字节)个数;
    7. 稀疏文件的空洞和用户真正的全 0 数据是无法区分的,因为对外表现是一样的(这点非常重要);


      推荐阅读