在Linux中重定向,复制cp,硬链接的区别,Linux底层存储数据原理。 - 详解

概念:

        我们可以用一句话简单概括一下三者

重定向:>/>> 改变程序输出数据的目的地 (从屏幕改为文件),创建新文件

cp       :重新创建一个新的文件副本,新文件与旧文件互不干扰,(新的inode和block,下面

                      会介绍到这个概念)

硬链接:为一个数据块创建多个平等的入口(文件)

详细的比较:

特性重定向 > / >>复制 cp硬链接
本质Shell操作,改变数据流方向创建新的文件内容和新的inode创建新的目录项指向同一个inode
Inode号创建新文件,分配新的inode创建新文件,分配新的inode与源文件相同的inode号
磁盘空间占用新的数据块,增加磁盘使用量占用新的数据块,增加磁盘使用量不占用额外数据块空间,仅目录项大小
数据关系文件内容是命令输出的新内容独立的数据副本指向同一份数据
修改影响修改源文件或重定向文件,互不影响修改源文件或副本,互不影响修改任何一个“硬链接”,所有硬链接文件内容同步变化
删除影响删除重定向文件,只影响该文件本身删除源文件,副本不受影响删除任何一个硬链接,只要inode链接数不为0,数据依然可通过其他硬链接访问
跨文件系统支持支持不支持
对目录不能直接对目录重定向可以复制目录(需 -r 选项)通常不允许(超级用户在某些系统可创建,但不推荐)
命令示例echo "hi" > file.txtcp file.txt file_copy.txtln file.txt file_hardlink

Linux底层存储原理:

要理解他们的区别,要理解两个核心的区别:inodeData 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对应的数据块不会被释放

posted @ 2025-10-20 10:14  yjbjingcha  阅读(4)  评论(0)    收藏  举报