厚基础Linux——硬链接和软链接
Linux文件系统
要理解Linux文件系统上特有的特性,我们需要简单介绍一下Linux文件系统的结构。
超级区块(superblock)
它存储了一个文件系统的整体信息,包括inode/block的总量,使用量,剩余量以及文件系统格式与相关信息。
我们可以使用df -i 目录名称,来查看这个目录所在的文件系统的superblock中的部分信息
可以看到分区/dev/sda2挂载在根目录(/)下inode共有52428800,使用了131932,剩余52296868个。
inode和block
inode记录文件系统元数据,block存储文件的实际内容。不同于windows文件系统的链表式查找数据,Linux先读取inode信息,获取所有指向block的指针。inode和block的关系见下图,左边是inode,右边的部分的数据块就是block。
硬链接原理
硬链接本质上是多个文件名指向同一个inode。即不对inode,block作任何更改,仅在目录上增加了另一个文件名,指向了同一个inode。所以本质上,两个指针互为孪生。也就是说,任何一个硬链接文件都可以脱离其它硬链接文件,单独提供使用。
使用ln命令创建硬链接,通过ll -i命令,可以看到两个文件类型都是普通文件,只是指向该文件的硬链接数量变为2个,这两个硬链接都指向同一个inode,67。
软链接原理
软链接,又叫符号链接。本质上是在当前目录创建了一个链接文件,这个文件有独立的inode,独立的block,只是该文件类型为l,文件内容为源文件的文件路径。所以本质上,访问软链接,是通过软链接读取了源文件的路径后,再去访问源文件。也就是说,源文件删除,则软链接不可用;软链接删除,则源文件不受影响。
使用ln -s 命令创建软链接,可以看到文件类型,inode号都与源文件不同。
删除源文件f1后,硬链接能正常访问,软链接已经失效。
硬链接、软链接特性对比
下面对硬链接和软链接的特征制作一张清单
序号 | 特性 | 硬链接 | 软链接 |
---|---|---|---|
1 | 本质 | 和源文件是同一个 | 和源文件是不同的文件 |
2 | 是否可以跨分区链接 | 否 | 是 |
3 | 是否可以指向目录 | 否 | 是 |
4 | 链接和源文件关系 | 可以互相替代 | 源文件删除即失效,重新创建源文件,内容不同,链接也有效 |
5 | inode号 | 和源文件相同 | 和源文件不同 |
6 | 链接数 | 会增加链接数 | 不会影响链接数 |
7 | 相对路径 | 使用相对路径创建时,以执行命令的目录作为相对起点 | 使用相对路径创建时,以链接文件路径的作为相对起点。 |
1,4,5,6在前文都已经示例中已经演示。下面将对2,3,7进行单独演示。
跨分区链接
/,/data属于不同的分区。
在/root下创建文件,f1,尝试在/data目录下创建链接文件链接f1。
可以看到硬链接创建会直接失败,软链接可以正常使用。
链接目录
在/data下创建目录d1,尝试在/data目录下创建链接文件链接d1.
可以看到硬链接创建会直接失败。软链接可以正常链接。
相对路径
在/data目录下创建f1文件,/data/beta/目录下创建f1文件,使用软硬链接命令在/data目录下创建link文件,link文件的存放位置在/data/beta目录下,验证此时的链接文件访问的文件是哪个f1文件。
在/data目录下执行创建命令,可以看到硬链接指向了执行命令的当前目录,软链接指向了软链接本身的的相对目录。