重新理解 ln 命令

在理解ln之前先说两个命令:linkunlink

link 和 ulink 这两个命令的参数都及其简单

--help display this help and exit

--version    output version information and exit

link的作用就是我们下面要说的创建硬链接,unlink就是取消硬链接。

但我们创建一个文件,并写入内容,此时会发生什么?

[root@localhost ziqiang]# echo "This is a file." > file1.txt
[root@localhost ziqiang]# cat file1.txt
This is a file.

当一个文件被创建的时候,操作系统写一些字节到磁盘上并用file1.txt这个名字链接到磁盘上这块数据。如果我们把file1.txt的名字改了,磁盘上的数据并不会改变,只是指向磁盘上数据的信息变了。其逻辑如下:

 link命令的作用,可以允许我们手动创建一个链接指向磁盘上已存在的数据(操作系统尚未标记为可用)。link的常见用法:

扫描二维码关注公众号,回复: 1580836 查看本文章

link file_name linkname

file_name 这个文件,他对磁盘上的数据正式我们想要链接的

linkname 这个文件,是我们即将创建的链接名

[root@localhost ziqiang]# link file1.txt file2.txt

现在file1.txt和file2.txt指向磁盘上相同的数据

[root@localhost ziqiang]# cat file1.txt
This is a file.
[root@localhost ziqiang]# cat file2.txt
This is a file.

然而我们并没有创建磁盘上数据的拷贝,file1.txt和file2.txt这两个文件都指向相同的磁盘数据。其逻辑图如下:

 如果通过file1.txt和file2.txt两个文件中的一个改变磁盘上存储的你内容,另一个文件也会跟着改变。追加点内容看看是不是这样

[root@localhost ziqiang]# echo "It points to data on the disk." >> file1.txt
[root@localhost ziqiang]# cat file1.txt
This is a file.
It points to data on the disk.
[root@localhost ziqiang]# cat file2.txt
This is a file.
It points to data on the disk.

file1.txt和file2.txt分享磁盘上同一块数据,改变一个另一个也跟着变。但是如果删除一个文件呢?会不会都删除呢?如果我们删除这些文件,只是删除指向磁盘数据的链接而已。由于前面手动创建了一个链接,在用户层面(user-level)我们依然还有一个指向磁盘数据的链接,所以如果我们删除一个文件

[root@localhost ziqiang]# rm file1.txt
rm: remove regular file ‘file1.txt’? y

叫 file1.txt 这个名字的文件就永远不存在了

[root@localhost ziqiang]# cat file1.txt
cat: file1.txt: No such file or directory

但是我们手动创建指向磁盘数据的那个链接还在,我们依然可以访问数据

[root@localhost ziqiang]# cat file2.txt
This is a file.
It points to data on the disk.

正如你所看到那样,即使在文件被删除后,磁盘上的数据依然还在(因为我们删除的仅仅是指向磁盘上数据的一个链接)。只要还有链接存在,我们就能访问磁盘上的数据。我们说的rm一个文件(删除一个文件)仅仅是是利用unlink使磁盘上的数据不可链接,磁盘上的数据依旧还在。对操作系统而言,只是会被标记为可用,以便将来使用。

自此,讨论的仅仅是硬链接。硬链接(eg. file1.txt )和他链接的数据必须存放在相同的文件系统上。例如,你不能用一个分区上的硬链接 指向 存储在另一个分区上的数据。还有,不能创建硬链接指向一个目录(符号链接可以)。

ln和link有啥区别?

默认情况下,ln创建硬链接,这个link一样。下面命令等价

ln file1.txt file2.txt
link file1.txt file2.txt

但是ln可以利用-s参数创建软连接

[root@localhost ziqiang]# ln -s file1.txt file2.txt
[root@localhost ziqiang]# ll *txt -i
70 -rw-r--r--. 1 root root 16 Jun 12 22:15 file1.txt
71 lrwxrwxrwx. 1 root root  9 Jun 12 22:16 file2.txt -> file1.txt

创建了一个软连接名字为file2.txt,指向file1.txt。其逻辑如下:

 关于符号链接

符号链接,有时也被称为软连接。与硬链接不通,硬链接指向磁盘上的文件,而软连接指向另一个链接。软连接有几样好处:

软连接可以连接到目录

允许数据存在一个一个磁盘或分区,而软连接在另一个磁盘或分区

与硬链接不通,一处软连接指向的 文件/目录 ,将会打破这种链接关系

创建file1.txt,file2.txt指向file1.txt

[root@localhost ziqiang]# echo "This is a file." > file1.txt
[root@localhost ziqiang]# ln -s file1.txt file2.txt
[root@localhost ziqiang]# cat file1.txt
This is a file.
[root@localhost ziqiang]# cat file2.txt
This is a file.

但是如果删除file1.txt,磁盘上的数据就永远不可访问了

[root@localhost ziqiang]# rm file1.txt -rf
[root@localhost ziqiang]# cat file2.txt
cat: file2.txt: No such file or directory

这个报错信息可能会令人困惑,因为file2.txt依然还在啊,ls也看得到

[root@localhost ziqiang]# ls
file2.txt  version-check.sh

然而,对于file2.txt而言,这是个不完整的链接,他指向的东西不存在了。操作系统顺着这个软连接找下去,正常应该找到file1.txt,但是没找到,因此返回错误信息。

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9176932.html