软连接和硬链接
Linux分为两种链接,一种叫做软链接(符号链接),另一种叫硬链接。
默认情况下,ln命令产生硬链接
软链接(符号链接)
软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
硬链接
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
示例
colin@colinsoft:~/tang$ touch test #创建一个测试文件
colin@colinsoft:~/tang$ ln -s test test.soft #创建一个软链接文件
colin@colinsoft:~/tang$ ln test test.hard #创建一个硬链接文件
colin@colinsoft:~/tang$ echo "cout test">>test #写入test文件
colin@colinsoft:~/tang$ cat test #查看test
cout test
colin@colinsoft:~/tang$ cat test.soft #查看test.soft
cout test
colin@colinsoft:~/tang$ cat test.hard #查看test.hard
cout test
#将test.soft移动到其他目录下
colin@colinsoft:~/tang$ mv test.soft .. #将test.soft移动到上一级目录
colin@colinsoft:~/tang$ cat ../test.soft #查看上一级目录下的test.soft
cat: ../test.soft: 没有那个文件或目录
#由于软链接只是记录文件的位置,并且当创建软链接是使用的是文件的相对路径,
#所以当软链接移动时,找不到原来链接文件的路径,因此出错。
#解决此问题,需要在创建软链接时使用链接文件的绝对路径
colin@colinsoft:~/tang$ ln -s /home/colin/tang/test test.soft #使用绝对路径创建软链接
colin@colinsoft:~/tang$ mv test.soft ..
colin@colinsoft:~/tang$ cat ../test.soft
cout test
#查看链接的Inode
colin@colinsoft:~/tang$ stat test
文件:'test'
大小:10 块:8 IO 块:4096 普通文件
设备:801h/2049d Inode:694358 硬链接:2
权限:(0664/-rw-rw-r--) Uid:( 1000/ colin) Gid:( 1000/ colin)
最近访问:2019-12-27 10:08:23.382634445 +0800
最近更改:2019-12-27 10:08:19.602634223 +0800
最近改动:2019-12-27 10:08:19.602634223 +0800
创建时间:-
colin@colinsoft:~/tang$ stat test.soft
文件:'test.soft' -> '/home/colin/tang/test'
大小:21 块:0 IO 块:4096 符号链接
设备:801h/2049d Inode:694893 硬链接:1
权限:(0777/lrwxrwxrwx) Uid:( 1000/ colin) Gid:( 1000/ colin)
最近访问:2019-12-27 10:57:41.838808188 +0800
最近更改:2019-12-27 10:57:37.750807948 +0800
最近改动:2019-12-27 10:57:37.750807948 +0800
创建时间:-
colin@colinsoft:~/tang$ stat test.hard
文件:'test.hard'
大小:10 块:8 IO 块:4096 普通文件
设备:801h/2049d Inode:694358 硬链接:2
权限:(0664/-rw-rw-r--) Uid:( 1000/ colin) Gid:( 1000/ colin)
最近访问:2019-12-27 10:08:23.382634445 +0800
最近更改:2019-12-27 10:08:19.602634223 +0800
最近改动:2019-12-27 10:08:19.602634223 +0800
创建时间:-
#通过stat命令可以查看文件的Inode,Inode号相当于c语言中的地址,每一块空间都一个专属地址
#可以看到,test和test.hard的Inode号,而与test.soft的Inode号不同
#可以看到,test和test.hard的硬链接数都是2,此时test和test.hard已经没有区别,都是这快内存的硬链接
#当删除test或者test.hard时,硬链接数会减一
colin@colinsoft:~/tang$ rm test
colin@colinsoft:~/tang$ stat test.hard
文件:'test.hard'
大小:10 块:8 IO 块:4096 普通文件
设备:801h/2049d Inode:694358 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ colin) Gid:( 1000/ colin)
最近访问:2019-12-27 10:08:23.382634445 +0800
最近更改:2019-12-27 10:08:19.602634223 +0800
最近改动:2019-12-27 11:06:48.494840292 +0800
创建时间:-
#可以看到,Inode号没有改变,但是硬链接数变为1
总结
1.软链接可以看做windows下的快捷方式,方便理解
2.硬链接用的比较多,可以看做是c语言中指向同一块内存的指针