『学了就忘』Linux基础命令 — 22、Linux中的硬链接和软链接
提示:先来说明一下在Linux系统中文件和目录的基本存储,这样更方便我们理解和学习Linux系统中的硬链接和软链接。
1、文件和目录的基本存储
之前说过分区,每个分区都可以理解为分成两部分,一小部分里边是存放文件的i
节点信息,大部分放的是Block
文件块。
在文件的i节点当中保存的信息有:i
节点号,时间,权限,保存位置。而Block
块中保存的是文件中的数据。
每个文件夹中都会有i
节点和对应的Block
文件。
-
但是有一个问题,一个文件的文件名是存放哪里?
我们就以在文件夹
root
中有一个文件abc
为例。文件路径为/root/abc
。在
root
目录中,所有的文件都有i
节点名和对应的Block
块,而root
目录也有自己的i
节点信息。有i
节点信息,就有与之对应的Block
块,root
目录的Block
块中存放的数据是root
目录下所有的子文件和子目录的文件名,和它对应的i
节点号。
也就是说,root
目录下文件的文件名,没有写在该文件的i
节点里。而是写在上级目录的Block
块中。
如果我要查找abc
文件的文件名,要先找到root
文件夹的i
节点,然后在root
目录的Block
块中找到abc
的文件名和对应的i
节点号才能找到。通过abc
文件的i
节点号最终读取到abc
文件中的数据。 -
那
root
目录的文件名或者说是i
节点存储在哪里?那
root
目录是在根目录下的,根目录会有自己的i
节点信息,也会有自己的Block
,综上所述,那root
目录的文件名和i
节点号的信息是放在根目录的Block
块中的。
那根的i
节点号怎么获取?
根的i
节点号是固定的,根的i
节点号为2。(因为编号1在系统内核加载的时候被占用了)[root@192 ~]# ls -ild / 2 dr-xr-xr-x. 25 root root 4096 12月 27 22:27 / 第一位显示的就是i节点号。
-
总结
综上所诉,要查看
abc
文件的内容,就先用通过根的i
节点号,读取根的Block
块中数据,找到root
目录的i
节点信息,读取root
目录的Block
块中数据,找到abc
文件的i节点信息,读取abc
文件的Block
块中数据。
以上就是文件和目录的基本存储。
2、In命令介绍
(1)我们来看看ln命令的基本信息
- 命令名称:
ln
- 英文原意:
make links between file
- 所在路径:
/bin/ln
- 执行权限:所有用户。
- 功能描述:在文件之间建立链接。
(2)ln命令的基本格式
[root@localhost ~ ] # ln [选项] 源文件 目标文件
选项:
-s:建立软链接文件。如果不加“-s”选项,则建立硬链接文件
-f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件
3、创建硬链接
(1)如何创建硬链接
示例如下:
[root@localhost ~] # touch cangls
[root@localhost ~ ]# ln /root/cangls /tmp/
# 建立硬链接文件,目标文件没有写文件名,会和原合一致
# 也就是/root/cangls和/tmp/cangls 是硬链接文件
说明ln
命令应用:
# 新创建一个文件abc,查看abc文件的硬连接数
[root@192 ~]# touch abc
[root@192 ~]# ls -il abc
1043285 -rw-r--r--. 1 root root 0 12月 29 18:18 abc
# 可以看到abc文件的硬连接数为1。
# 在tmp目录中给abc文件创建一个硬连接文件,然后查看这两个文件硬连接数。
[root@192 ~]# ln abc /tmp/abc_h
[root@192 ~]# ls -il abc /tmp/abc_h
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 abc
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 /tmp/abc_h
# 可以看到abc文件的引用计数(硬连接数)增加了1。
# 同时还可以看到,上边的两个文件的i节点号是一样的。
(2)硬链接特征
- 源文件和硬链接文件拥有相同的
Inode
和Block
。 - 修改任意一个文件,另一个都改变。
- 删除任意一个文件,另一个都能使用。
- 硬链接标记不清,很难确认硬链接文件位置(很难确定这是一个硬连接文件,自己创建的还可能记住,要是别人创建的,我根本无法判定一个文件是硬连接文件),不建议使用。
- 硬链接不能链接目录。
- 硬链接不能跨分区(因为两个文件需要同一个分区的同一个
i
节点号。所以跨分区找不到)。
(3)硬连接原理
我上边在root
目录下创建了一个abc
文件,然后在/tmp/
目录下创建一个abc
文件硬连接文件abc_h
。
root
目录、abc
文件、tmp
目录,每个都有自己的i
节点号和对应的Block
块。通过root
目录的i节点号,找到对应的Block
块。Block
块中记录着abc
文件的名称和i
节点号,就可以找到abc
文件。而硬连接文件abc_h
的i
节点号和文件名是记录在tmp
目录的Block
块中的。并且上边查询到abc
文件和abc_h
硬连接文件的i
节点号是相同的,所以通过tmp
的Block
块中的abc_h
信息,也可以找到abc
文件的i
节点号。
所以root
目录中记录的abc
文件信息和tmp
目录记录的abc_h
文件信息,都指向了root
目录下的abc
文件。
看下图:
所以上图证明了:
修改任意一个文件,另一个都改变。
删除任意一个文件,另一个都能使用。
4、创建软链接
(1)如何创建软链接
软连接可以直接看作为Windows系统中的快捷方式。
建立软链接文件,如下:
[root@localhost ~]# touch abc
[root@localhost ~]# ln -s /root/abc /tmp/
root
目录中cde
文件,然后创建软连接/tmp/cde_s
文件,查看这两个文件。
如下图所示:
#
[root@localhost ~ ] # touch cde
[root@localhost ~ ] # ln -s /root/cde /tmp/cde_s
[root@localhost ~ ] # ls -il /root/cde /tmp/cde_s
1055972-rw-r--r--1 root root 0 2月1715:30 /root/cde
261634 1rwxrwxrwx 1root root 9 2月1715:30 /tmp/cde_s->/root/cde
说明:
- 第一:可以看到创建的软连接文件有明确的提示这个一个软链接文件,和它的源文件的位置在哪里。
/tmp/cde_s->/root/cde
。这也就是为什么说硬连接标记不清的原因。 - 第二:文件的引用链接数没有增加。
- 第三:两个文件的i节点号完全不同。
- 第四:源文件
abc
是0字节,空的。而软连接的文件大小为9个字节。
(2)软链接特征
- 软链接和源文件拥有不同的
Inode
和Block
。 - 两个文件修改任意一个,另一个都改变。
- 删除软链接,源文件不受影响;删除源文件,软链接不能使用,因为软链接没有实际数据,只保存源文件的
Inode
,不论源文件多大,软链接文件大小不变。 - 软链接的权限是最大权限
lrwxrwxrwx
.,但是由于没有实际数据,最终访问时需要参考源文件权限。 - 软链接可以链接目录,软链接可以跨分区。
- 软链接特征明显,建议使用软连接。
(3)软连接原理
在root
目录下有一个cde
文件,在tmp
目录创建一个cde
文件的软链接文件cde_s
。通过root
目录的i
节点号,可以找到root
目录的block
块,root
目录的block
块中记录了cde
文件的文件名和i
节点号。查到cde
文件的i
节点号就找到了cde
文件的block
块,就能读取里边的数据。
tmp
目录有自己的i
节点号,与之对应的block
块,tmp
目录的block
块中有cde_s
文件的文件名和i
节点号,(之前说硬连接这两个i
节点号是相同的,所以指向的同一个文件),而软连接文件和源文件的i
节点号是不相同的。说明cde_s
文件有自己的i
节点号,并且cde_s
文件有自己的block
块。
现在的关键是,cde_s
文件的block
块中存放的是什么?
如果里边存放的是数据,那cde
文件和cde_s
文件就不是链接的关系了,就完全是复制关系了,这样就不会出现修改源文件时软链接文件也变,修改软链接文件后源文件也改变的情况。
其实在cde_s
文件的block
块中存放的是源文件的i
节点号。
如下图:
这也就说明了为什么新创建的软连接文件创建完成后就有数据,并且数据大小不随源文件的改变而改变。
还有一点要注意,软链接文件的权限是最大的,但这个权限是针对软链接文件的,软链接文件的block
块中并不存放数据,如果要操作源文件,还是要看源文件权限,这里需要注意。
(4)说明
Windows系统中创建快捷方式是为了软件安装位置太深,不好找,所以在桌面创建一个快捷方式,那Linux系统创建软链接的作用是什么,反正都是通过目录访问?
在Linux系统中,软链接最主要的作用是照顾管理员的使用习惯。
如下图:
在老式的Linux系统中,/etc/rc.local
文件的位置我们用着已经习惯了,系统更新之后,为了升级的需要,/etc/rc.local
文件的位置改变了。我们在找这个文件就很麻烦了。解决这个问题的方法就是给这两个文件创建一个软链接来解决上边问题,既照顾了升级需要,也照顾了使用习惯。
还要注意一个情况,用相对路径创建def
文件的软链接,用绝对路径创建anaconda-ks.cfg
文件的软链接。
从上图中可以看到用相对路径创建的软链接出现了报错。
提示:创建软链接时一定要使用绝对路径,硬连接没有要求。