详解软、硬链接
参考阅读
前言
对于Linux中的软、硬链接的解释与说明,首先要从inode、block说起,这二者的背景在于Linux的ext4这个文件系统
ext4文件系统将分区分为两大部分
inode(i节点) 128Byte 时间戳、权限、大小、位置
block(块) 1、2、4KB 默认为 4KB block 用于实际的数据存储,存储时不一定按顺序的,每个文件都有一个inode号,一个block是存储空间的最小单位
索引号:通过索引号来对文件进行查找;可以理解为图书馆的图书分类与目录
注意:
在 inode 信息中,不记录文件名称,而是把文件名记录在上级目录的 block 中。
目录的 block :
记录的是这个目录下所有一级子文件和子目录的文件名及 与node 的对应;
了解到以上的信息,下面开始详解软、硬链接文件的具体含义
一、硬连接
命令:
[root@localhost ~]# touch test
#建立源文件
[root@localhost ~]# ln /root/test /tmp/test-hard
#给源文件建立硬链接文件 /tmp/test-hard
[root@localhost ~]# ll -i /root/test /tmp/test-hard
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test
hard
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard
#查看两个文件的详细信息,可以发现这两个文件的 inode 号是一样的,"ll"等同于"ls -l"
以上命令是创建了硬链接,在文件系统中的结构如下图
详细步骤:
注意,在上图中省略了/目录到/下的root目录的迭代
迭代过程,每轮迭代的前提是要有权限访问
1、首先找到/的inode(根目录的inode是系统已知的,inode号是2),然后判断用户是否有权限访问根目录的block,
2、有,就可以在/的block中访问到/root的文件名及对应的inode号
3、通过/root/目录的inode号,可以查找到/root/目录的inode信息,接着判断用户是否有权限访问 /root/目录的block
4、有,则可以从/root/目录的block中读取到test文件的文件名及对应的inode号
5、通过 test 文件的 inode 号,就可以找到test文件的inode信息,接着判断用户是否有权限访问 test文件的block。
6、有,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问
/ 到 /root 到 /root/tmp 到 /root/tmp/test-hard的过程与上述过程完全一致
二、软链接
命令:
[root@localhost ~]# touch check
#建立源文件
[root@localhost ~]# ln -s /root/check /tmp/check-soft
#建立软链接文件
[root@localhost ~]# ll -id /root/check /tmp/check-soft
262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check
917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check
#软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置
#在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件
以上命令是创建了软链接,在文件系统中的结构如下图
详细步骤:
迭代过程,每轮迭代的前提是要有权限访问
1、首先找到/的inode,然后判断用户是否有权限访问根目录的block
2、有,就可以在/的block中访问到/tmp的文件名及对应的inode号
3、接着访问/tmp/目录的inode信息,判断用户是否有权限访问/tmp/目录的block
4、有,就会在block中读取到软链接文件check-soft的inode号,因为软链接文件会真正建立自己的 inode索引和block,所以软链接文件和源文件的 inode 号是不一样的
5、访问软链接block中指向真实文件的inode 至此完成从软连接文件到真实文件的访问
/ 到 /root 到 /root/check的过程与上述过程完全一致 不做过多赘述,还是一个迭代的过程,前提是目录要有访问的权限
三、总结比较
不同:
硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode 号是一致的;
软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode 号
软链接可以链接目录文件、可以跨分区链接;硬链接是不可以的
相同:
修改任一链接文件,源文件也会被修改