软连接与硬连接
文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
硬连接
定义
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。比如:A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
特点
- 文件有相同的 inode 及 data block
- 只能对已存在的文件进行创建
- 不能交叉文件系统进行硬链接的创建,因为多文件系统下可能存在多个相同的inode
- 不能对目录进行创建,只可对文件创建
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件
- 硬连接数为0且未被占用时,文件被删除,可用来防止重要文件被删除
创建硬链接命令
ln <源文件> <硬链接文件>
软连接
定义
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同,A和B指向的是两个不同的inode,继而指向两块不同的数据块。但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)。A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
特点
- 软链接有自己的文件属性及权限等
- 可对不存在的文件或目录创建软链接
- 软链接可交叉文件系统
- 软链接可对文件或目录创建
- 创建软链接时,链接计数 i_nlink 不会增加
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(若被指向路径文件被重新创建,死链接可恢复为正常的软链接)
创建软链接命令
ln -s <源文件> <软链接文件>
总结
用户数据就像是一个房间,而inode就是进入这个房间的门。硬连接是给这个房间开了多扇门,每扇门都可以进入这个房间,一旦所有门都被拆除,房间没有存在的价值就被销毁了;而软连接相当于一张名片,记载了房间的门牌号,软连接最终还是通过硬连接开的门进入了房间,即使房间被销毁了,名片还在,只是再也找不到相应的房间。