链接大家都用过,比如 Windows 中的快捷方式就是一种链接,可是 Linux 里又分硬链接和软链接,它们表示什么意思,又有什么区别呢,本文来给大家做一个解释。
Inode 索引节点
要想理解硬链接和软链接的区别,首先要明白什么是 Inode。Inode 是 Index node,索引节点的意思。每个文件都有一个 inode,里边保存着文件的元数据(meta data),包括:inode 号、文件大小、文件所有者、文件权限、文件类型、创建时间、硬链接数等等,除了文件名以外的所有文件信息都存储在这里。它是文件或者目录在一个文件系统中的唯一标识。
查看一个文件的 inode,可以用 stat 命令,或者 ls -i 选项来查看。下面分别用这两个命令来查看一个文件 myfile.txt 的 inode 号为 102171635
和元数据相对应的是用户数据(user data),或者也叫文件数据块(data block),文件的真实内容是存储在这里边的。我们通过一个文件名可以查到它对应的 inode,再通过 inode 去查看文件的内容。它们之间的关系可以用下面这张图来表示。
硬链接 Hard Links
当多个文件名指向同一个 inode 时,这种链接就被称为硬链接。比如像下面的这种情况,我们为原始文件 myfile.txt 创建了两个链接,hardlink1 和 hardlink2,它们都指向同一个 inode,所以它们都是硬链接。从图中可以看出,硬链接指向的文件内容其实就是原始文件的内容,所以硬链接的作用之一就是可以节省服务器的磁盘空间。
硬链接的另外一个作用就是可以防止文件被“误删”。因为 inode 会记录文件硬链接的次数,只有当硬链接等于 0 的时候,才会把存储着文件内容的数据块删除,所以比如我不小心把 myfile.txt 文件删除了,但是 inode 发现还有另外两个硬链接在,所以不会删除掉数据块,通过两个硬链接我们还是可以读取到文件内容。
硬链接可以通过 ln [选项] [源文件] [链接文件] 命令来创建,不过要注意硬链接只能对已经存在的文件进行创建,并且不能够跨文件系统。下面举一个例子来看一下硬链接和源文件的 inode号是否相同,以及删除掉源文件,是否还可以通过硬链接打开原文件。
首先创建一个文件 myfile.txt,然后分别给它创建两个硬链接 hardlink1 和 hardlink2。通过 ls -li 命令查看它们的 inode 号,发现相同,所以验证了我们所说的,硬链接和原文件指向同一个 inode 。另外从长列表中,我们还可以看到 inode 记录的硬链接次数(包括源文件自己),一共是3次。
接下来删除掉文件 myfile.txt,通过 ls -li 命令再看一下,发现 inode 记录的链接次数变成了 2,通过硬链接我们还是可以读取原来的文件内容,说明文件内容数据块并没有被删除,只有当硬链接次数变为 0 的时候,文件内容才会真正被删掉。
我们对硬链接的特点进行一下总结:
1) 硬链接文件都有相同的 inode 和 数据块
2) 删除掉一个硬链接文件,并不会影响 inode 号相同的其他文件,只有当 inode 记录的链接次数为 0 时,数据块才会被真正删除
3) 硬链接只能对已有文件进行创建
4) 硬链接不能跨文件系统创建
5) 普通用户不能对目录进行硬链接创建
软链接 Soft Links
软链接也被称为符号链接(symbolic link)。Linux 中的软链接和 Windows 的快捷方式非常相似。与硬链接的不同之处在于:
1) 它的 inode 与原文件不同
2) 它的数据块存储的是原文件的路径
我们用下面这张图来进行一下说明,我们为 myfile.txt 创建了一个软链接 softlink。可以看出,它的 inode 和 myfile.txt 的 inode 是两个完全不同的索引节点,myfile.txt 的数据块记录的是文件的内容,而软链接的数据块记录的是它指向文件的路径。
软链接的作用之一也是方便文件的管理,比如原文件的路径比较复杂,我们可以在简单的路径下创建一个软链接,这样比较方便用户访问。但是和硬链接不同的是,一旦原文件被删除,那么软链接就成了一个“死链接”,指向了一个不存在的文件。
软链接可以用命令 ln -s [源文件名或目录] [软链接文件名] 来进行创建。和硬链接不同之处在于,对不存在的文件也可以创建软链接,可以跨文件系统,对文件或者目录都可以创建软链接。
举一个例子,比如我们为 myfile.txt 创建一个软链接 softlink。通过 ls -li 命令查看,发现 inode 号完全不同,并且 myfile.txt 的链接次数还是 1,并没有增加,说明这里的链接次数是指硬链接,通过软链接我们可以读取源文件的内容。
删除原文件,软链接变成了“死链接”,通过它再去读取原来的文件内容,系统已经提示文件不存在了。
通过上面的实验验证,软链接的特点如下:
1) 软链接和其所指向的文件具有不同的 inode,并且其数据块存储的内容为其所指向文件的路径
2) 创建软链接,其指向文件的硬链接次数不会增加
3) 删除软链接并不影响原文件,但删掉原文件,软链接会成为一个“死”链接
4) 软链接可以指向文件,也可以指向目录
5) 软链接可以指向不存在的文件或目录
6) 软链接可以跨文件系统创建
最后
不管用软链接还是硬链接,都不会将原来的文件复制一份,都只是占用了磁盘较小的空间,但它们的原理还是完全不一样的。本文从 inode 的角度切入,对软链接和硬链接进行了解释。感兴趣的同学可以对 inode 结构体再做进一步研究,这样能够帮助我们更好的理解 Linux 的工作原理。