软链接和硬链接

软链接和硬链接

文件是linux系统中最基础的抽象,linux遵循一切皆文件的理念,因此,很多交互是通过对读写文件来实现的
文件必须先打开才能访问,文件打开的方式有只读,只写,和读写模式,文件打开是通过唯一的描述符来引用的,该描述符是从打开文件关联的元数据到文件本身的映射,在linux内核中文件用一个整数表示,成为文件描述符。文件描述符在用户空间共享,用户程序通过文件描述符可以直接访问文件。
文件虽然是通过文件名来访问的,但文件本身其实没有直接和文件名关联,相反,与文件相关连的索引节点inode,inode是文件系统为该文件分配的唯一整数值。索引节点会保存和文件相关的数据,比如文件修改的时间戳,所有者,类型和长度以及文件数据相关的元数据,但不含文件名,索引节点就是linux文件在磁盘上的实际物理对象,也是linx文件在磁盘上的实际物理对象,也就是linux内核中通过数据结构表示的概念实体。

目录和链接

通过索引节点编号来访问文件很繁琐,因此文件通常是通过文件名从用户空间来打开,目录是用来提供访问文件需要的名称,目录是可读名称到索引编号之间的映射。名称和索引节点之间的配对成为链接。映射在物理磁盘上的形式如简单的表或散列,是通过特定的内核代码来管理和实现的,从概念上看,可以把目录看作普通文件,其区别在于他包含文件名称到索引节点的映射,内核直接通过该映射把文件名解析为索引节点。
如果用户空间的应用请求打开指定文件,内核会打开包含该文件名的目录,搜索该文件。内核根据文件名获取索引节点编号通过索引节点可以找到该节点,索引节点包含文件关联的数据,其中包含文件数据在磁盘上的存储位置。

刚开始的时候,内核上只有一个目录,成为根目录,然而系统上有很多目录,内核查找的时候,他会遍历路径中的每个目录项,查找下一个入口项的索引节点,最后获取文件名的索引节点,

硬链接

多个名字确实可以解析到同一个索引节点上。当不同名称的多个链接映射到同一个索引节点时,我们称该节点为硬链接。
在复杂的文件系统结构中,硬链接支持多个路径指向同一份数据

软链接

硬链接不能跨越多个文件系统,因为索引节点编号在自己的文件系统外没有任何意义,为里能够跨越文件系统建立链接,linux系统实现了符号链接,也称软链接。
符号链接类似于普通的文件,每个符号链接有自己的索引节点和数据块,包含要链接的文件的绝对路径。这个意味着符号链接可以指向任何地方。
比起硬链接,符号链接会带来更多的开销。因为有效解析符号链接需要解析两个文件,一是符号链接本身,二是该链接所指向的文件。硬链接不会带来这些额外的开销,因为访问在文件系统中被多次链接的文件和单个链接的文件没有区别。

原文地址:https://www.cnblogs.com/hanfei-1005/p/5678649.html