深度剖析 Linux cp 命令的秘密

cp 引发的思考

深度剖析 Linux cp 命令的秘密

文章插图
 
cp 是啥 ? 是的,就是 linux 是 Linux 下最常用的命令之一,copy 的简写,小伙伴 100% 都用过 。
cp 命令处于 Coreutils 库里,是 GNU 项目维护的一个核心项目,提供 Linux 上核心的命令 。
今天用 cp 命令,把小伙伴惊到了,引发了我对其中细节的思考 。
背景是这样的,奇伢今天用 cp 拷贝了一个 100 GiB 的文件,竟然一秒不到就拷贝完成了 。一个 SATA 机械盘的写能力能到 150 MiB/s (大部分的机械盘都是到不了这个值的)就算非常不错了,所以,正常情况下,copy 一个 100G 的文件至少要 682 秒 ( 100 GiB/ 150 MiB/s ),也就是 11 分钟 。
sh-4.4# time cp ./test.txt ./test.txt.cpreal 0m0.107suser 0m0.008ssys 0m0.085s上面是我们理论分析,最少要 11 分钟,实际情况却是我们 cp 一秒没到就完成了工作,惊呆了,为啥呢?并且还有一个更诡异的我文件系统大小才 40 GiB,为啥里面会有一个 100 G的文件呢?
 
分析文件 
我们先用 ls 看一把文件,显示文件确实是 100 GiB.
sh-4.4# ls -lh-rw-r--r-- 1 root root 100G Mar  6 12:22 test.txt但是再用 du 命令看却只有 2M ,这是怎么回事?(且所在的文件系统总空间都没 100G 这么大)
sh-4.4# du -sh ./test.txt2.0M ./test.txt再看 stat 命令显示的信息:
sh-4.4# stat ./test.txt  File: ./test.txt  Size: 107374182400 Blocks: 4096       IO Block: 4096   regular fileDevice: 78h/120d Inode: 3148347     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2021-03-13 12:22:00.888871000 +0000Modify: 2021-03-13 12:22:46.562243000 +0000Change: 2021-03-13 12:22:46.562243000 +0000 Birth: -stat 命令输出解释:
  1. Size 为 107374182400(知识点:单位是字节),也就是 100G ;
  2. Blocks 这个指标显示为 4096(知识点:一个 Block 的单位固定是 512 字节,也就是一个扇区的大小),这里表示为 2M;
划重点:
  • Size 表示的是文件大小,这个也是大多数人看到的大小;
  • Blocks 表示的是物理实际占用空间;
所以,注意到一个新概念,文件大小和实际物理占用,这两个竟然不是相同的概念 。为什么会这样?
这里先梳理下文件系统的基础知识,文件系统究竟是怎么存储文件的?(以 Linux 上 ext系列的文件系统举例)
深度剖析 Linux cp 命令的秘密

文章插图
 
文件系统
深度剖析 Linux cp 命令的秘密

文章插图
 
文件系统听起来很高大上,通俗话就用来存数据的一个容器而已,本质和你的行李箱、仓库没有啥区别 。只不过文件系统存储的是数字产品而已 。我有一个视频文件,我把这个视频放到这个文件系统里,下次来拿,要能拿到我完整的视频文件数据,这就是文件系统,对外提供的就是存取服务 。
 
现实的存取场景 
就跟你在火车站使用的寄存服务一样,包裹我能存进去,稍后我能取出来,就可以了 。问题来了,存进去?怎么取?仔细回忆下存储行李的场景 。
存行李的时候,是不是要登记一些个人信息?对吧,至少自己名字要写上 。可能还会给你一个牌子,让你挂手上,这个东西就是为了标示每一个唯一的行李 。
深度剖析 Linux cp 命令的秘密

文章插图
 
取行李的时候,要报自己名字,有牌子的给他牌子,然后工作人员才能去特定的位置找到你的行李(不然机场那么多人,行李都长差不多,他肯定不知道你的行李是哪个) 。
深度剖析 Linux cp 命令的秘密

文章插图
 


推荐阅读