在Linux中重定向,复制cp,硬链接的区别,Linux底层存储数据原理。
概念:
我们可以用一句话简单概括一下三者
重定向:>/>> 改变程序输出数据的目的地 (从屏幕改为文件),创建新文件
cp :重新创建一个新的文件副本,新文件与旧文件互不干扰,(新的inode和block,下面
会介绍到这个概念)
硬链接:为一个数据块创建多个平等的入口(文件)
详细的比较:
特性 | 重定向 > / >> | 复制 cp | 硬链接 |
---|---|---|---|
本质 | Shell操作,改变数据流方向 | 创建新的文件内容和新的inode | 创建新的目录项指向同一个inode |
Inode号 | 创建新文件,分配新的inode | 创建新文件,分配新的inode | 与源文件相同的inode号 |
磁盘空间 | 占用新的数据块,增加磁盘使用量 | 占用新的数据块,增加磁盘使用量 | 不占用额外数据块空间,仅目录项大小 |
数据关系 | 文件内容是命令输出的新内容 | 独立的数据副本 | 指向同一份数据 |
修改影响 | 修改源文件或重定向文件,互不影响 | 修改源文件或副本,互不影响 | 修改任何一个“硬链接”,所有硬链接文件内容同步变化 |
删除影响 | 删除重定向文件,只影响该文件本身 | 删除源文件,副本不受影响 | 删除任何一个硬链接,只要inode链接数不为0,数据依然可通过其他硬链接访问 |
跨文件系统 | 支持 | 支持 | 不支持 |
对目录 | 不能直接对目录重定向 | 可以复制目录(需 -r 选项) | 通常不允许(超级用户在某些系统可创建,但不推荐) |
命令示例 | echo "hi" > file.txt | cp file.txt file_copy.txt | ln file.txt file_hardlink |
Linux底层存储原理:
要理解他们的区别,要理解两个核心的区别:inode 和 Data Block
你可以想象一个图书馆:
Data Block : 就是书架上实际上存放图书的地方。(硬盘存放的数据块)
inode :就像图书馆的卡片,这张卡片不记录书的真实数据,记录着图书的元数据
inode 元数据:
文件大小
文件权限
文件所有者和所属组
文件创建/修改/访问时间
指向数据块的指针(这本书放在哪个书架上)
记录硬链接的数量
底层运行过程:
场景:假设现在有一个源文件source.txt
A: 重定向 > :
echo "New Data" > source.txt
1.shell解析命令发现>
2.shell会以截断模式打开(或创建)文件,如果发现source已经存在,会立即将文件大小截断为0
字节
3.echo将New Data写入标准输出(studout)
4.由于重定向,shell将studout绑定到了source.txt的文件描述符
5.数据New Data 被写入source.txt分配的新数据块中(Data Block)
结果:source.txt的inode指向了新的数据块,旧数据已经被清空
B:追加重定向 >>:
echo "More Data" >> source.txt
1.shell 解析命令发现>>
2.shell以追加模式打开source.txt,文件指针直接直到文件末尾
3.echo将数据写道标准输出中(studout)
4.shell将studout绑定到source.txt的文件描述符
5.将“more Data” 追加到sourcce.txt的最后面,可能使用原有的数据块剩余部分或者创建新数据块
结果:source.txt对应的inode所对应的数据块数据增加,文件大小增加
C:复制 cp:
cp source.txt copy.txt
1.cp命令被调用
2.首先通过系统调用,获取source.txt的元数据
3.然后系统创建一个新文件,这会:
在目录中增加一条:copy.txt -> 新的inode号
为copy.txt分配元数据(权限,大小,通常继承源文件)
4.cp打开source.txt读取其数据块中所有的内容
5.同时将内容写到copy.txt,系统会将所有的数据写到为copy.txt新分配的数据块中
结果:两个文件名又有不同的inode,两个不同的inode又指向不同的数据块
D:硬链接 ln:
ln source.txt hardlink.txt
1.ln命令被调用
2.在当前目录(或者指定目录)创建新的目录项
3.这个新的目录项为hardlink.txt->source.txt的inode
4.系统会找到source的inode将其中的链接计数+1
5.整个过程不涉及任何数据复制和创建新数据
结果:现在有两个文件名,他俩指向同一个inode,而这个inode又指向同一个数据块
删除文件的真相:
在Linux中,rm底层命令就是“取消链接”
执行rm source.txt时;
在目录中取消source.txt对他inode的映射
将对应的inode对应的链接计数减1
当该inode的连接技术减为0时,系统才会真正释放这个inode所对应的数据块。
所以对于硬链接当你删除source.txt时,只是将链接数减1,由于hardLink.txt依然映射这个inode,所以这个inode对应的数据块不会被释放