快捷搜索:  汽车  科技

linux中硬连接和符号的区别(Linux实体链接与符号链接)

linux中硬连接和符号的区别(Linux实体链接与符号链接)图3 借用鸟哥的图hard link 的命令:ln /etc/shadowsocks.json .这就是hard link的由来,简单来说hard link 只是某个文件目录下的新增一个文件名链接到某个inode,举个例子:假设我系统有个 /root/shadowsocks.json 他是 /etc/shadowsocks.json的实体链接,也就是说这两个文件名链接到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。实际的情况可以如下所示图1

一、简介

Linux下有两种链接文件,一种是类似于windows 快捷方式,一种是通过filesystem的inode链接来产生新文件名,而不是产生新文件,这种成为实体链接(hard link)。

二、hard link

1、了解linux文件系统的小伙伴们都知道,linux中每个文件都会有一个inode来记录文件内容的block号码。

2、想要读取一个文件,必须要通过目录记录的文件名来指向该文件正确的inode号码。

以上两点是理解hard link的关键,也就是说,文件名只与文件目录有关,但是文件内容只与文件的inode有关,那么我们可不可以这样想呢,多个文件名连接到同一个inode号码会发生什么呢?

这就是hard link的由来,简单来说hard link 只是某个文件目录下的新增一个文件名链接到某个inode,

举个例子:假设我系统有个 /root/shadowsocks.json 他是 /etc/shadowsocks.json的实体链接,也就是说这两个文件名链接到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。实际的情况可以如下所示

linux中硬连接和符号的区别(Linux实体链接与符号链接)(1)

图1

hard link 的命令:ln /etc/shadowsocks.json .

linux中硬连接和符号的区别(Linux实体链接与符号链接)(2)

图3 借用鸟哥的图

上图的意思是,你可以通过 1 或 2 的目录之 inode 指定的 block 找到两个不同的文件名,而不管使用哪个文件名均可以指到 real 那个 inode 去读取到最终数据!那这样有什么好处呢?最大的好处就是“安全”!如同上图中, 如果你将任何一个“文件名”删除,其实 inode 与 block 都还是存在的! 此时你可以通过另一个“文件名”来读取到正确的文件数据喔!此外,不论你使用哪个“文件名”来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!

一般来说,使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变! 我们还是由图3 来看,由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量哩!

由图 3 其实我们也能够知道,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对! 因为图 3就是在同一个 filesystem 上嘛!所以 hard link 是有限制的:

1、不能跨Filesystem

2、不能link目录

不能跨 Filesystem 还好理解,那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接,举例来说,如果你要将 /etc 使用实体链接创建一个 /etc_hd 的目录时,那么在 /etc_hd 下面的所有文件名同时都与 /etc 下面的文件名要创建 hard link 的,而不是仅链接到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 下面创建新文件时,连带的, /etc 下面的数据又得要创建一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!

三、Symbolic Link (符号链接,亦即是捷径)

相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已啦!

举个例子:

linux中硬连接和符号的区别(Linux实体链接与符号链接)(3)

图4

看软链接内部结构图:

linux中硬连接和符号的区别(Linux实体链接与符号链接)(4)

图5

由 1 号 inode 读取到链接文件的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!

这里还是得特别留意,这个 Symbolic Link 与 Windows 的捷径可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!

由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,不过由于 Hard Link 的限制太多了,包括无法做“目录”的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看你也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作链接文件就必须要使用 ln 这个指令呢!

猜您喜欢: