« 上一篇下一篇 »

什么是软链接接和硬链接?Linux 服务器中软链接和硬链接的区别

   链接Link是一种快捷访问机制,它通过一个文件指向原始文件或目录的方式实现快捷访问,同时还记录了原始文件或目录的一些信息。链接允许多个不同文件对同一个文件进行引用。Unix/Linux下的链接文件有两种,一种为硬链接,另外一种是符号链接(软链接)。符号链接又称为软链接,和windows的快捷方式相似,符号链接文件中并不包括实际的文件数据,而只是包括了它指向文件的路径。它可以链接到任意文件和目录,包括处于不同文件系统的文件以及目录。当用户对链接文件操作时,系统会自动的转到对源文件的操作,但是删除链接文件时,并不会删除源文件。
硬链接是指通过索引节点对文件的链接。保存在系统的每一个文件,系统会对该文件创建一个索引节点。在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。对于硬链接的读写和修改等操作和软链接是一样的。在硬链接中如果删除原文件会引起“引用计数”减1的变化,只要“引用计数”不为零,则硬链接文件仍然存在,而且保留了原有的内容 ,这样就可以防止误操作删除源文件。但是硬链接文件只能在同一个文件系统中,而且不同是目录。

什么是软链接

符号链接Symbolic Link(symlink),又称软链接Soft Link,是一种特殊的文件,它指向 Linux 系统上的另一个文件或目录。这和 Windows 系统中的快捷方式有点类似,链接文件中记录的只是原始文件的路径,并不记录原始文件的内容。符号链接通常用于对库文件进行链接,也常用于链接日志文件和网络文件系统Network File System(NFS)上共享的目录。

什么是硬链接

硬链接是原始文件的一个镜像副本。创建硬链接后,如果把原始文件删除,链接文件也不会受到影响,因为此时原始文件和链接文件互为镜像副本。为什么要创建链接文件而不直接复制文件呢?当你需要将同一个文件保存在多个不同位置,而且还要保持持续更新的时候,硬链接的重要性就体现出来了。如果你只是单纯把文件复制到另一个位置,那么另一个位置的文件只会保存着复制那一刻的文件内容,后续也不会跟随着原始文件持续更新。而使用硬链接时,各个镜像副本的文件内容都会同时更新。

软链接和硬链接的区别

下表列出了软链接和硬链接之间的区别。

< 如显示不全,请左右滑动 >
#软链接硬链接
1软链接类似于 Windows 系统中的快捷方式硬链接是原始文件的一个镜像副本
2软链接又称符号链接硬链接没有别名
3链接中任何一个文件发生改变,都会同步到连接中的其它文件和软链接一样
4软链接可以跨文件系统进行创建硬链接不可以跨文件系统进行创建
5软链接可以指向文件或目录硬链接只能指向文件
6链接文件和原始文件之间的 inode 和文件权限不完全一致链接文件和原始文件的 inode 和文件权限完全一致
7链接文件只记录原始文件的路径,不记录原始文件的内容链接文件记录了原始文件的内容
8如果原始文件被移除,软链接就会因为指向不存在的文件而失效。这被称为“挂起链接hanging link即使原始文件被移除,链接文件也不受影响。
9通过 ln -s <原始文件> <链接文件> 命令创建软链接通过 ln <原始文件> <链接文件> 命令创建硬链接
10软链接文件的文件权限中有一个特殊标记 l硬链接文件没有特殊标记
11通过 find / -type l 命令可以查找软链接文件通过 find / -samefile <原始文件> 命令可以查找硬链接文件
12通过 symlinks <目录> 命令可以查找失效的软链接

硬链接不存在失效链接


   硬链接:硬链接是新的目录条目,其引用系统中的现有文件。文件系统中的每一文件默认具有一个硬链接。为节省空间,可以不复制文件,而创建引用同一文件的新硬链接。新硬链接如果在与现有硬链接相同的目录中创建,则需要有不同的文件名,否则需要在不同的目录中。指向同一文件的所有硬链接具有相同的权限、连接数、用户/组所有权、时间戳以及文件内容。指向同一文件内容的硬链接需要在相同的文件系统中。
简单说,硬链接就是一个 inode 号对应多个文件。就是同一个文件使用了多个别名(上图中 hard link 就是 file 的一个别名,他们有共同的 inode)。
创建硬链接:ln命令为现有文件创建新的硬链接。
ln 现有文件硬链接(文件名) 一个或多个新硬链接

[yangxjsun@ubuntu workspace]$ls -l newfile.txt
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月  24 17:40 newfile.txt
[yangxjsun@ubuntu workspace]$ln newfile.txt newfile-hlink.txt
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-hlink.txt
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月  24 17:40 newfile-hlink.txt
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月  24 17:40 newfile.txt

可以看出,新硬链接创建后,无法区别哪一现有硬链接是原始链接。

[yangxjsun@ubuntu workspace]$rm newfile.txt
[yangxjsun@ubuntu workspace]$ls -l newfile-hlink.txt
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月  24 17:40 newfile-hlink.txt
[yangxjsun@ubuntu workspace]$cat newfile-hlink.txt
hello

即使原始链接被删除,使用新的硬链接依然可以访问原内容。

由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
第三条不能交叉文件系统进行硬链接的创建,为什么?
inode 是随着文件的存在而存在,因此只有当文件存在时才可创建硬链接,即当 inode 存在且链接计数器(link count)不为 0 时。inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,因此硬链接创建时不可跨文件系统。
第四条中不能对目录创建硬链接,为什么?
简单说,如果针对文件做硬连接,等于针对这个文件对应的inode又做一个链接。所以硬链接等于是同一个inode对应多个文件名。对于目录来说,就是保存这些链接的一个inode。如果针对目录做硬链接,一个子目录的硬链接指向父目录的话,这样就循环了。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的inode号可知其实这两目录就是两个硬链接。若系统允许对目录创建硬链接,则会产生目录环。想要深入研究可以移步这里。

软链接:(又称符号链接,即 soft link 或 symbolic link) 软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。(见图2)软连接可以指向目录,而且软连接所指向的目录可以位于不同的文件系统中。
创建软连接: ln -s 命令创建软链接

[yangxjsun@ubuntu workspace]$ln -s /home/yangxjsun/workspace/newfile.txt newfile-slink.txt
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-slink.txt
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月  24 19:27 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
-rw-rw-r-- 1 yangxjsun yangxjsun  6 3月  24 16:58 newfile.txt
[yangxjsun@ubuntu workspace]$

当原始文件被删除之后,软链接依然会指向该文件,但目标已消失。这就是”dangling link”

[yangxjsun@ubuntu workspace]$rm newfile.txt
[yangxjsun@ubuntu workspace]$ls -l newfile-slink.txt
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月  24 19:30 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
[yangxjsun@ubuntu workspace]$cat newfile-slink.txt
cat: newfile-slink.txt: 没有那个文件或目录
[yangxjsun@ubuntu workspace]$

软链接可以指向目录。而后软连接作为目录使用。可以通过cd正常更改到软连接目录。

[yangxjsun@ubuntu workspace]$ln -s /etc/ configs
[yangxjsun@ubuntu workspace]$ls -d configs
configs
[yangxjsun@ubuntu workspace]$cd configs
[yangxjsun@ubuntu configs]$ls
acpi                           host.conf                ppp
adduser.conf                   hostname                 presage.xml
alternatives                   hosts                    printcap
anacrontab                     hosts.allow              profile
...

软链接特性:

软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接或悬挂的软链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
   当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的亦是相对路径指向。