Linux下链接分两种,即硬链接(Hard link)和软链接(Symbolic link)。当然windows下面也有软链接、硬链接之分。
为了区分硬链接和软链接,首先需要清楚Linux系统中一切皆文件,文件由两个部分组成:用户数据,即数据块和元数据,即保存文件附加属性的数据(文件大小、创建时间、inode等)。Linux系统下的同一个文件系统中,每个文件都有一个唯一的inode(索引结点)号,inode才是文件的唯一标识,在访问文件时实际上都是通过inode号来访问文件的实际数据块。
硬链接和软件链接在访问时都共用一个目标数据块,主要区别就是每个硬链接相当于一个是一个指针,该指针指向同一个inode号,只要一个文件有任意一个硬链接存在,那么该文件就可以直接通过文件的硬链接访问,也就是说当删除一个硬链接时,并不影响其他硬链接来访问文件,硬链接本身并没有单独的inode号,同一个文件的硬链接都共用一个inode号只是文件名不同,甚至可以理解为我们在linux中使用ls看到的文件本身也就是某个数据块的一个硬链接。所以当使用mv命令移动这些硬链接时,并不影响对文件的访问,因为inode都一样。
而软链接即符号链接,软链接本身就是个独立的完整文件,相当于windows下的快捷方式,有自己的inode号,只是在访问该软链接时,会被转发为访问其链接到的实际文件,当删除软链接时,并不影响实际文件,甚至删除所有的软链接对实际文件也没有影响。当删除或移动实际文件时,都将无法通过软链接访问到该文件。
使用
创建链接使用命令ln,用法为:
1 | ln [options] 原文件 链接 #为文件创建链接 |
options有很多可选项,其中常用的有-s用来指定创建软链接,-f用来创建时删除同名文件,-b创建时备份同名文件(备份文件会在原文件名后加个~)
硬链接的特点
- 文件有相同的 inode 及 data block;
- 只能对已存在的文件进行创建;
- 不能交叉文件系统进行硬链接的创建;
- 不能对目录进行创建,只可对文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接的特点
- 软链接有自己的文件属性及权限等;
- 可对不存在的文件或目录创建软链接,当链接到的文件存在时,即可直接通过软链接访问
- 软链接可交叉文件系统;
- 软链接可对文件或目录创建;
- 创建软链接时,链接计数 i_nlink 不会增加;
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
链接相关命令
- ls 的-i选项可查看文件的inode号,-l选项可以显示一个链接是否为软链接,-L选项显示软链接指向的文件属性而不是软链接本身的文件属性
- stat 显示文件的属性,当然包括inode号及软链接情况
- find /home -lname data.txt 查找路径/home下文件data.txt的软链接
- find /home -samefile data.txt 查找路径/home下与data.txt具有相同inode的所有硬链接
- find /home -inum 655420 查看路径/home下所有inode号为655420的硬链接
- find /home -type l -ls 以ls命令的-dils的输出格式,列出路径/home下的所有软链接文件
使用场景:如果需要当原文件移动后链接依然可用,显然需要硬链接。需要对文件夹创建链接时或者需要跨文件系统(例如一个ext4盘和ntfs盘),需要使用软链接。注意创建软链接时,尽量不要使用相对路径,因为使用相对路径时,当移动软链接后,很有可能就不无法通过该软链接访问原文件了。软链接的使用更广更方便,还可以为不存在的文件创建软链接,当链接到的文件存在时,该链接就又可以生效。
应用:一些配置文件统一放到某个文件夹(该文件夹设置为自动备份,如果使用git备份),然后为他们创建软链接或硬链接。
当然也可以像windows下使用mklink /D为文件夹创建符号链接一样将较大的一些文件夹链接到其他地方,以节省某些盘的空间。