硬链接(Hard Links)和软链接(Symbolic Links,也称为符号链接)是两种在文件系统中创建文件链接的不同方法:
(在Linux的文件系统中,文件都会得到系统分配的一个编号,称为索引节点号inode)
链接的类型:
软链接:
软连接(也称符号链接)是指在不同的文件系统之间,将一个文件名关联到另一个文件上,使得该文件名也可以访问该文件。软链接与原文件不共享inode,它们有不同的inode号和device号。因此,对于软链接和原文件来说,它们的访问权限、所有者、大小等属性可能不同。
软连接的符号文件实际上是一个文本文件,存储另一文件的位置信息。
文件和目录都可以创建软链接。
硬链接:
硬连接是指通过索引节点来进行连接,只有文件能建立硬链接,目录不可以。
在Linux中,多个文件名指向同一索引节点是存在的,一般这种连接就是硬连接。硬连接的作用类似于复制多份文件,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。
跨文件系统:
硬链接:因为硬链接与inode相关,不同文件系统不会关联inode,所以只能在同一文件系统内创建硬链接,
软链接:软链接可以跨越文件系统
文件类型:
硬链接:支持链接到文件,不支持链接到目录。
软链接:支持链接到文件或目录,也支持链接到其它软链接。
大小和性能:
硬链接:硬链接共享相同的inode和磁盘块,硬链接几乎没有大小。
软链接:软链接的大小通常比硬链接大,因为它们需要存储目标路径等基础信息。软链接访问时,需要解析原文件信息,可能会有少量的性能开销。
修改和权限:
硬链接:硬链接的修改会反映在所有硬链接上,因为它们都共享相同的inode。硬链接之间没有权限区别。
软链接:软链接的修改不会影响目标文件或目录,因为它们只是指向目标的路径。软链接和目标之间可能具有不同的权限设置。
用途:
硬链接:常用于备份工具和版本控制系统,可以减少磁盘占用。
软链接:常用于创建快捷方式或引用其他位置的文件或目录,也支持跨文件系统的链接。
实际操作
[root@~ mnt]# touch file
[root@~ mnt]# echo 123456789qwertyuiopasdfhjkl;zxcvn > file
123456789qwertyuiopasdfhjkl
-bash: zxcvn: command not found
[root@~ mnt]# echo 123456789qwertyuiopasdfhjklzxcvn > file
[root@~ mnt]# cat file
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# ll -li file
4398051783917 -rw-r----- 1 root root 33 Jun 14 21:23 file
创建2个软链接:
[root@~ mnt]# ln -s file file-soft
[root@~ mnt]# ll -li file
4398051783917 -rw-r----- 1 root root 33 Jun 14 21:23 file
[root@~ mnt]# ll -li file-soft
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
[root@~ mnt]# ln -s file file-soft-01
创建4个硬链接:
[root@~ mnt]# ln file file-hard-01
[root@~ mnt]# ln file file-hard-02
[root@~ mnt]# ln file file-hard-03
[root@~ mnt]# ln file file-hard-04
查看文件信息,可以观察到硬链接和原文件拥有相同的inode编号及权限信息,软链接的inode编号和权限与原文件不同,拥有独立的inode编号和权限;
[root@~ mnt]# ll -li file*
4398051783917 -rw-r----- 5 root root 33 Jun 14 21:24 file
4398051783917 -rw-r----- 5 root root 33 Jun 14 21:24 file-hard-01
4398051783917 -rw-r----- 5 root root 33 Jun 14 21:24 file-hard-02
4398051783917 -rw-r----- 5 root root 33 Jun 14 21:24 file-hard-03
4398051783917 -rw-r----- 5 root root 33 Jun 14 21:24 file-hard-04
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
4398051783919 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft-01 -> file
[root@~ mnt]# cat file
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-hard-01
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-hard-02
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-hard-03
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-hard-04
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-soft
123456789qwertyuiopasdfhjklzxcvn
[root@~ mnt]# cat file-soft-01
123456789qwertyuiopasdfhjklzxcvn
原文件内容变更后,软链接文件和硬链接文件的内容也同步发生了变更:
[root@~ mnt]# echo 123456 > file
[root@~ mnt]# cat file
123456
[root@~ mnt]# cat file-hard-01
123456
[root@~ mnt]# cat file-hard-02
123456
[root@~ mnt]# cat file-hard-03
123456
[root@~ mnt]# cat file-hard-04
123456
[root@~ mnt]# cat file-soft
123456
[root@~ mnt]# cat file-soft-01
123456
软链接文件内容变更后,原文件和硬链接文件的内容也同步发生了变更:
[root@~ mnt]# echo 123 > file-soft-01
[root@~ mnt]# cat file-soft-01
123
[root@~ mnt]# cat file-soft
123
[root@~ mnt]# cat file
123
[root@~ mnt]# cat file-hard-01
123
[root@~ mnt]# cat file-hard-02
123
[root@~ mnt]# cat file-hard-03
123
[root@~ mnt]# cat file-hard-04
123
[root@~ mnt]# ll -li file*
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:28 file
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:28 file-hard-01
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:28 file-hard-02
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:28 file-hard-03
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:28 file-hard-04
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
4398051783919 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft-01 -> file
原文件内容变更后,软链接文件和硬链接文件的内容也同步发生了变更:
[root@~ mnt]# echo 456 > file
[root@~ mnt]# cat file
456
[root@~ mnt]# cat file-hard-01
456
[root@~ mnt]# cat file-hard-02
456
[root@~ mnt]# cat file-hard-03
456
[root@~ mnt]# cat file-hard-04
456
[root@~ mnt]# cat file-soft
456
[root@~ mnt]# cat file-soft-01
456
删除其中一个软链接:
[root@~ mnt]# rm -fr file-soft-01
[root@~ mnt]# ll -li file*
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:29 file
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:29 file-hard-01
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:29 file-hard-02
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:29 file-hard-03
4398051783917 -rw-r----- 5 root root 4 Jun 14 21:29 file-hard-04
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
删除一个硬链接:
[root@~ mnt]# rm -fr file-hard-04
[root@~ mnt]# ll -li file*
4398051783917 -rw-r----- 4 root root 4 Jun 14 21:29 file
4398051783917 -rw-r----- 4 root root 4 Jun 14 21:29 file-hard-01
4398051783917 -rw-r----- 4 root root 4 Jun 14 21:29 file-hard-02
4398051783917 -rw-r----- 4 root root 4 Jun 14 21:29 file-hard-03
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
删除原文件后,软链接找不到源文件报错,硬链接依然可以使用。
[root@~ mnt]# rm -fr file
[root@~ mnt]# ll -li file*
4398051783917 -rw-r----- 3 root root 4 Jun 14 21:29 file-hard-01
4398051783917 -rw-r----- 3 root root 4 Jun 14 21:29 file-hard-02
4398051783917 -rw-r----- 3 root root 4 Jun 14 21:29 file-hard-03
4398051783918 lrwxrwxrwx 1 root root 4 Jun 14 21:24 file-soft -> file
[root@~ mnt]#cat file-soft
cat: file-soft: No such file or directory
[root@~ mnt]# cat file-hard-01
456
[root@~ mnt]# cat file-hard-03
456
[root@~ mnt]# cat file-hard-02
456
变更硬链接内容后,其它硬链接的内容也同时发生变化。
[root@~ mnt]# echo 789 > file-hard-01
[root@~ mnt]# cat file-hard-01
789
[root@~ mnt]# cat file-hard-02
789
[root@~ mnt]# cat file-hard-03
789