前言
在 Linux 文件系统中,一个文件被分成两个部分:元数据(metadata)与用户数据(user data)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。元数据中并不包含文件名,文件名仅仅是为了方便用户使用。Linux 文件系统为每一个保存在磁盘分区中的文件(无论什么类型)都分配一个索引节点号(Inode Number),索引节点号是文件在一个文件系统中的唯一标识,不同文件所对应的索引节点号是不相同的;用户数据,即文件数据块(data block),文件数据块中以二进制的形式记录着文件的真实内容。
ls -i # 查看索引节点号
软链接
也叫做符号链接,相当于Windows下的快捷方式,链接文件中存储的是源文件的位置,当源文件位置移动了、名称修改了,删除了,链接文件都会失效。链接文件和源文件是不同的 索引节点号。
ln -s user.txt softlink_user.txt # 对 user.txt 创建软链接
硬链接
ln user.txt hardlink_user.txt # 对 user.txt 创建硬链接
在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该文件的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及文件的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
总结
硬链接 | 软链接 | |
---|---|---|
索引节点号 | 硬链接文件和源文件指向相同的索引节点号 | 软链接文件和源文件指向不同的索引节点号 |
文件属性 | 硬链接没有任何标识,因为硬链接文件和源文件是相对独立的(删除不影响其它链接) | 软链接在 Linux 中进行了明确的标识 |
对目录进行链接 | 不支持 | 支持 |
跨越文件系统 | 不支持 | 支持 |
对不存在的文件进行链接 | 不支持,硬链接要求文件必须存在(即 inode 必须存在) | 支持,软链接可以对一个不存在的文件名 filename 进行链接,当使用 vim 对软链接文件进行编辑的时候,Linux 会自动新建一个文件名为 filename 的文件 |
参考
Linux 硬链接与软链接
详解 Linux 中的硬链接与软链接