硬链接和软链接是Linux系统中十分重要的概念。在我们了解硬链接和软链接之前,我们还要先了解一下inode这个概念。
inode(即索引节点号)是Linux系统识别文件的唯一标识。我们都知道Linux系统中文件数据分为两类:metadata(元数据)和data(普通数据)。元数据存放的是文件的附加属性,例如大小、时间戳、所有者等。普通数据才是真正的数据内容。而系统是通过inode来查找正确的文件数据块,并不是通过文件名。
硬链接和软链接
在Linux系统为了解决文件共享问题,使用两种方式:hard link(硬链接)和soft link(软链接),链接不仅仅可以共享文件,还有方便管理、隐藏路径、节省空间等好处。若是使用同一个inode对应多个文件,则使用的就是硬链接。
硬链接可以使用link和ln创建:
语法:ln filename [linkname ]
示例:
link data link
ln data link
硬链接的特性
只能和已存在的文件建立硬链接
我们在/app目录下进行实验,当硬链接的源文件不存在时,硬链接无法创建文件的inode相同和文件属性,只是文件名不同
我们在/app目录下创建一个data的源文件,并通过stat
命令查看文件属性,然后创建硬链接link,ll -i
查看两者的inode相同,从ctime的变化也能确定硬链接就是用一个文件不能跨文件系统建立硬链接
在/dev目录下建立硬链接link,因为所在不同的文件系统,所以不能建立硬链接硬链接创建后链接数会增加
我们通过对link和data建立新的硬链接link2和link3,发现链数都有增长,由此也能看出硬链接实质上就是同一个文件不能对目录创建硬链接
在/app目录下创建dir1目录文件,尝试建立硬链接link4,创建失败。因为硬链接能针对目录创建删除一个硬链接文件并不影响其他有相同 inode 号的文件数据
在删除源文件data的之前,查看源文件和链接文件的数据是一致的。在删除data之后,其他的硬链接文件的内容不受影响,只是链接数减少了
软链接的特性
软链接其实存放的就是源文件的路径,所以如果文件的内容数据是另一个文件的路径是,这个文件就是软链接。软链接有自己独立的inode和文件属性,这点和硬链接有本质的区别,也正是因为这样,所以软链接使用上少了许多限制,平时使用的更多。
语法:ln -s filename [linkname ]
示例:
link -s data link
ln -s data link
软链接可对不存在文件建立链接
在/app的空目录中,建立软链接,目录下没有文件,但链接依旧能建立,找不到目标文件会有报错提示软链接有自己的inode和属性
在目录下建立文件soft,之后对soft设置软链接slink,通过stat
命令查看soft和slink的文件属性,可以看出和之前硬链接的本质区别,不论是权限、inode、时间戳、大小、数据块都不同软链接课跨文件系统建立
在/dev目录下建立test文件目录用于实验,然后设置软链接testlink软链接可以对目录文件建立
接着直接以/app/testdir为目标文件,和/dev/test目录文件,建立软链接软链接创建不会增加链接数
建立了软链接,而链接数还是1没有改变删除软链接并不影响源文件,但删除源文件软链接就会变成死链接,若链接指向的路径文件被重新建立,则链接恢复
在/app目录下再创创建一个软链接slink2,在我们删除slink之后,源文件soft和slink2都没有受到影响,但当我们把soft文件删除后,slink2就变成了死链接,不再能显示数据
其他相关命令
使用find
命令可以查找链接文件
- 查找目录文件下相同inode的文件
find /dirs inum inode
查到data文件的inode=67,使用命令find /app -inum 67
查到/app目录下的所有inode是67的硬链接文件
- 查找目录下文件的软链接文件
find /dirs -lname filename
使用find /app -lname soft
命令,找到/app目录下所有soft的软链接文件
- 查找目录下所有目标文件的硬链接
find /dirs -samefile filename
在/app的目录和子目录下建立多个硬链接,使用find /app -samefile data
都可以找到
- 查找目录文件下的所有软链接文件
find /dirs -type l -ls
使用命令find /app -type l -ls
,可以查找/app下的所有软链接文件
- 查看磁盘分区的inode值(只能在ext的系统格式中使用)
dumpe2fs -h /dev/sda | grep "Inode size"
- 查看软链接的源文件
readlink
readlink
命令在后面我们编写脚本中可以使用
总结:
了解了inode概念还有硬链接与软链接原理,硬链接本质上就是同一个文件的不同文件名。软链接就是独立的文件,不过文件中存放的是源文件的路径。并总结出了两者的区别:
硬链接
1. 只能和已存在的文件建立硬链接
2. 文件的inode相同和文件属性,只是文件名不同
3. 不能跨文件系统建立硬链接
4. 不能跨文件系统建立硬链接
5. 不能对目录创建硬链接
6. 删除一个硬链接文件并不影响其他有相同 inode 号的文件数据
软链接
1. 软链接可对不存在文件建立链接
2. 软链接有自己的inode和属性
3. 软链接课跨文件系统建立
4. 软链接可以对目录文件建立
5. 软链接创建不会增加链接数
6. 删除软链接并不影响源文件,但删除源文件软链接就会变成死 链接,若链接指向的路径文件被重新建立,则链接恢复