需要对文件系统中的文件和目录有较好的理解才能轻松的理解两种链接
一、硬链接hard link
将多个文件名对应到同一个文件的inode号,这就是硬链接的由来。
硬链接的核心是在硬链接所在目录的数据区块中添加一条关联数据:硬链接这个文件的名字和inode号(这个inode号是实际数据inode号,改inode号对应实际数据对应的数据区块)
例:使用 ln /etc/crontab /root/crontab 构建一个硬链接。
在构建链接之前,inode 2是/etc这个目录的inode,该目录的data block 中存储有 inode与文件名的对应关系表,其中包括 real 与 crontab这一条关联数据。其中inode real 指向的就是文件的实际内容区块。
构建链接,就是在目录/root的data block中添加 crontab与inode real的关联数据。实际的inode与data block的数量并不会增加。
当删除/root/crontab的时候,只是将/root目录的数据区块中的crontab与inode real的关联数据删除。其实际数据的inode与data block依然存在。
注:
i)用ll命令显示文件的详细详细时,第3栏为链接到该文件的数量,当增加一个硬链接的时候,该值会增加;当该值为1的时候,删除文件才会真正地删除实际数据。
ii)大多数情况下,生成硬链接不会增加inode也不会消耗数据区块;只有当你的硬链接所在目录的区块刚刚好被填满时,你生成硬链接才会为你的目录新加一个区块来记录文件名与inode的关联数据。
二、符号链接symbolic link
符号链接其实与Windows下的快捷方式很相似。有时候又被称为软连接。
就是建立一个独立的文件,这个文件会让数据的读取指向它链接的那个文件的文件名。
符号链接其实就是就是存储了目标文件的文件名,如上图可以看到产生的符号链接/root/crontab的大小为12B,其中就是存储了12个字符,一个字符一个字节。
1)首先是root目录的inode号,在其目录的data block中添加1966083 与 crontab2,
2)产生的符号链接crontab的inode号是1966083(相当于图中的方块1),对应的数据区块中存储的是/etc/crontab这12个字符,
3)根据这12个字符去查询/etc目录,其对应的inode号为 2,
4)该目录的data block中查询crontab以及其对应的真实数据的inode real,从而获取实际文件内容。
注:
i)书中的上图中省略了root目录的inode和数据区块,符号链接中存储的不是/etc/crontab与inode 2的对应关系。
ii)制作软链接的时候注意绝对路径和相对路径的使用
三、命令
ln [-sf] 源文件 目标文件
-s:表示构建符号链接;若没有-s默认为硬链接。
-f:若目标文件存在,就将目标文件删除之后再建立。
目录的链接数量
建立一个新的目录test时,其中会存在test,test/.与test/..
其中test与test/.是一样的,而test/..是代表上一级目录,
所以新建一个目录的时候,新的目录的链接数为2,上层目录的链接数加1.
四、软链接和硬链接的区别
1、是否会占用磁盘空间
软链接:会,但是占用的空间特别小。因为软链接内部存储着源文件路径(也就是字符);
硬链接:不会。
2、与源文件不同磁盘或磁盘分区能否创建链接
软链接:可以,软链接不受磁盘分区限制;
硬链接:不能,硬链接与源文件必须在同一个磁盘或分区。
3、源文件位置发生改变或被删除,链接是否会失效
软链接:会失效,源文件位置发生变动或被删除,软链接都会失效;
硬链接:不会。
4、能否创建目录的链接
软链接:能;
硬链接:不能。
参考:鸟哥的私房菜第四版