Linux 硬链接和软链接(符号链接)

什么是目录

Linux 文件系统是树状结构的。根目录下存在一系列子目录。目录里边有文件或者子目录。 但问题在于:

  1. 目录是什么?
  2. 文件又是什么?

文件是:数据 + 属性(比如名字、创建时间、所有者之类)
目录是:一个列表,列表中的每一项是:inode –> filename

Linux 文件系统把硬盘分为三个部分:超级块、inode 列表、数据区

inode 指示:该文件的数据存放在数据区的哪些块内。因为这个“映射”关系不能变更,因此,inode 相当于代表着文件本身。(值得注意的是,文件名与文件本身不是直接映射起来的,中间隔着 inode)

硬链接(Hard Link)

硬链接指通过索引节点来进行连接,在 Linux 为文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号;
硬链接指的就是在 Linux 中,多个文件名指向同一索引节点;
常见用途:通过建立硬链接到重要文件,防止误删,删除其实对应的是删除其中的一个硬链接,当文件对应的硬链接都被删除了,该文件才真正被删除;
注意: 默认情况下,ln 命令产生硬链接;

[root@centos7 home]# vi 1.txt
hello, this is 1.txt!
[root@centos7 home]# cp -l 1.txt 2.txt # 为1.txt建立硬链接2.txt,等同于ln 1.txt 2.txt
[root@centos7 home]# more 2.txt # 查看2.txt文件中的内容和1.txt文件内容一样
hello, this is 1.txt!
# 这两个文件的索引节点号,可以看见索引号(inode)一样:
[root@centos7 home]# ls -li
总用量 69868
33845219 -rw-r--r--.  2 root root       44 1月  21 10:12 1.txt
33845219 -rw-r--r--.  2 root root       44 1月  21 10:12 2.txt
[root@centos7 home]# vi 2.txt # 编辑2.txt,在末未添加:
hello, this is 2.txt!
[root@centos7 home]# more 1.txt  # 查看1.txt中是否内容改动
hello, this is 1.txt!
hello, this is 2.txt!
[root@centos7 home]# rm -f 1.txt # 删除1.txt
[root@centos7 home]# more 2.txt # 查看2.txt的内容
hello, this is 1.txt!
hello, this is 2.txt!

创建硬链接命令:cp -l 1.txt 2.txt等同于ln 1.txt 2.txt # 为 1.txt 建立硬链接 2.txt

软链接

也成为符号链接(Symbolic Link),类似于 Windows 的快捷方式,其中包含的是另一个文件的位置信息;

[root@centos7 home]# cp -s 2.txt sLink # 为2.txt文件建立符号链接sLink,等同于ln –s 2.txt sLink
[root@centos7 home]# ls –li # 可以看到两个文件有不同的索引节点号
总用量 69864
33845219 -rw-r--r--.  1 root root       44 1月  21 10:12 2.txt
36830246 lrwxrwxrwx.  1 root root        5 1月  21 10:21 sLink -> 2.txt
[root@centos7 home]# more sLink
hello, this is 1.txt!
hello, this is 2.txt!

[root@centos7 home]# rm -f sLink # 删除符号链接,不影响源文件
[root@centos7 home]# more 2.txt
hello, this is 1.txt!
hello, this is 2.txt!

[root@centos7 home]# rm -f 2.txt # 删除2.txt
[root@centos7 home]# ls -li
总用量 69860
36830246 lrwxrwxrwx.  1 root root        5 1月  21 10:21 sLink -> 2.txt
[root@centos7 home]# more sLink
sLink: 没有那个文件或目录

创建符号链接命令:cp -s 2.txt sLink 等同于ln –s 2.txt sLink # 为 2.txt 文件建立符号链接 sLink

符号连接相当于快捷方式。这意味着什么呢?

  1. 符号连接是一个文件,一个与被它连接的文件不一样的文件。它有自己的 inode。
  2. 符号连接的内容应该是一个路径,该路径指示着它连接的文件。这意味着如果该路径的文件被删除了、改名字了,它即将访问不到。如果该路径下的文件被掉包了,它将访问错误的文件。

区别

挂载点

只能在同种存储媒体上的文件之间创建硬链接(Hard Link),不能在不同挂载点下的文件间创建硬链接,对于后一种情况,可以使用软链接;(区分不同挂载点与同一挂载点不同目录)
如跨不同的挂载点建立硬链接的报错信息:

[root@centos7 home]# ln 2.txt /dev/hLink
ln: 无法创建硬链接"/dev/hLink" => "2.txt": 无效的跨设备连接

目录

软连接就相当于 win 中的快捷方式即如果软链接一个目录只是一个目录的快捷方式到指定位置,操作系统找这个快捷方式会直接找到真实目录下的文件。但是硬链接的话,相当于镜像的方式,创建一个目录的硬链接之后,操作系统需要把这个目录下所有的文件都要做一次硬链接(复制一份过去),这样操作系统在访问这个链接的时候要不断去遍历,大大增加复杂度,而且很容易进入死循环。

硬链接不能对目录创建受限于文件系统的设计。Linux 文件系统中的目录均隐藏了两个特殊的目录,当前目录和父目录。其实是两个硬链接,若系统运行对目录创建硬链接,则会产生目录环。

小结

1: 硬链接是同一文件的不同访问路径,其对应的索引节点号是一样的,删除文件其实就是删除其中的一个硬链接,如果该文件对应的硬链接都被删除了该文件才被删除,常用于保护文件;
2: 符号链接类似于 Windows 中对应的快捷方式,删除符号链接不影响源文件,删除源文件,则对应的符号链接也没有意义;

你可能感兴趣的:(Linux 硬链接和软链接(符号链接))