欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux硬链接和软链接的区别

程序员文章站 2022-05-22 18:20:57
1.命令a.硬链接: ln 源文件 链接名 [root@localhost tmp]# ll -i total 118319574 -rw-r--r-- 2 root root 1 Nov 28 18:07 e.txt [root@localhost tmp]# ln e.txt f [root@l ......

1.命令
a.硬链接:

ln 源文件 链接名

[root@localhost tmp]# ll -i

total 1
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 e.txt

[root@localhost tmp]# ln e.txt f

[root@localhost tmp]# ll -i

total 2
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 f
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 e.txt

b.软链接:

ln -s 源目录或者源文件 链接名

[root@localhost tmp]# ll -i

total 2
18319579 drw-r--r-- 2 root root 1 nov 28 18:07 a
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 e.txt

[root@localhost tmp]# ln -s e.txt g

[root@localhost tmp]# ll -i

total 3
18319579 drw-r--r-- 2 root root 1 nov 28 18:07 a
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 e.txt
18319578 lrw-r--r-- 2 root root 1 nov 28 18:07 g  -> e.txt

[root@localhost tmp]# ln -s a b

[root@localhost tmp]# ll -i

total 4
18319579 drw-r--r-- 2 root root 1 nov 28 18:07 a
18319670 lrw-r--r-- 1 root root 1 nov 28 18:07 b  -> a
18319574 -rw-r--r-- 2 root root 1 nov 28 18:07 e.txt
18319578 lrw-r--r-- 2 root root 1 nov 28 18:07 g  -> e.txt

 

2.原理:
硬链接(hard link):a是b的硬链接(a和b都是文件名),则a的目录项中的inode节点号与b的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,a和b对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收。注:文件和文件名是不同的东西,rm a删除的只是a这个文件名,而a对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收。

软链接(soft link):a是b的软链接(a和b都是文件名),a的目录项中的inode节点号与b的目录项中的inode节点号不相同,a和b指向的是两个不同的inode,继而指向两块不同的数据块。但是a的数据块中存放的只是b的路径名(可以根据这个找到b的目录项)。a和b之间是“主从”关系,如果b被删除了,a仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

3.硬链接
a.不能对目录创建硬链接,只能对文件创建硬链接
原因有几种,最重要的是:文件系统不能存在链接环(目录创建时的".."除外,这个系统可以识别出来),存在环的后果会导致例如文件遍历等操作的混乱(du,pwd等命令的运作原理就是基于文件硬链接,顺便一提,ls -l结果的第二列也是文件的硬链接数,即inode节点的链接数)
b.不可以跨文件系统,即不能对不同的文件系统创建硬链接,两个文件名要在相同的文件系统下。
c.不能对不存在的文件创建硬链接,由原理即可知原因。

4.软链接
a.既可以对文件创建软链接,又可以对目录创建软链接,遍历操作会忽略目录的软链接。
b.可以跨文件系统
c.可以对不存在的文件创建软链接,因为放的只是一个字符串,至于这个字符串是不是对于一个实际的文件,就是另外一回事了