软连接和硬连接——Linux中的文件共享

硬连接(Hard Link)和软连接也称为符号连接(Symbolic Link)的目的是为了解决文件的共享使用问题。要阐明其原理,必须先理解Linux的文件存储方式。node

索引结点

Linux是一个UNIX类操做系统,全部类型的UNIX文件都是由操做系统经过索引节点来管理的。数组


索引节点是一个控制结构,包含操做系统所需的关于某个文件的关键信息。多个文件名能与一个索引节点相关联,但一个活跃的索引节点只能与一个文件相关联,且每一个文件只能由一个索引节点来控制。文件的属性、访问权限和其余控制信息都保存在索引节点中。此处以Linux中ext2的索引结点示例。操作系统

Ext2文件系统的每个文件和目录都对应一个索引结点,每个数据块组中的索引结点都保存在索引结点表中。设计

ext2的索引结点的一些主要字段:指针

Mode:包含次索引结点描述的是什么(好比描述文件、目录、符号连接、块设备、字符设备以及FIFO结构等)以及用户拥有的权限orm

Owner information:文件或目录全部者的用户和组标识符,这使得文件系统能够正确地受权某种存取操做对象

Size:文件大小blog

Timestamps:创建时间和最后修改时间索引

Datablocks:指向存储此索引结点描述的文件数据块的指针。直接指针指向存储数据的物理数据块,间接指针、两级指针和三级指针指向不一样级别的指针块或数据。io


  具体的索引节点结构会由于UNIX实现的不一样而发生变化,再举一个FreeBSD的索引节点结构:

当访问一个文件时,经过文件名在目录表中查找到其索引节点号,经过索引节点号查索引节点表获得其索引节点,经过索引节点获得文件数据所在的位置。

索引结点也会消耗硬盘空间,因此硬盘格式化的时候,操做系统自动将硬盘分红两个区域。一个是数据区,存放文件数据(data block);另外一个是索引结点区(inode table),存放索引结点所包含的信息。

每一个索引结点的大小,通常是128字节或256字节。索引结点的总数,在格式化时就给定,通常是每1KB或每2KB就设置一个索引结点。

Linux中的相关命令:

查看每一个硬盘分区的索引结点总数和已经使用的数量,可以使用df命令:df -

查看每一个索引结点节点的大小,能够用以下命令:sudo dumpe2fs -h /dev/hda | grep “Inode size”

使用ls –l命令会显示出在大部分信息. ls –i option显示文件的索引号.

而stat命令则能够列出索引节点中的几乎全部信息.

文件系统第一次被建立时, 会为每个文件系统建立若干数量的索引节点。该数目是文件系统所能容纳的最大文件数。只要不从新初始化文件系统, 就不能改变这个数目, 不然会损坏该文件系统上全部的数据。当文件系统中有不少不少小文件时文件系统会可能将索引节点所有用光。

一个文件系统维护了一个索引节点的数组,每一个文件或目录都与索引节点数组中的惟一一个元素对应。系统给每一个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。操做系统用索引结点号码来识别不一样的文件。

表面上,用户经过文件名,打开文件。实际上,系统内部这个过程分红三步:首先,系统找到这个文件名对应的索引结点号码;其次,经过索引结点号码,获取索引结点信息;最后,根据索引结点信息,找到文件数据所在的block,读出数据。

使用ls -i命令,能够看到文件名对应的inode号码:ls -i example.txt

因为索引结点与文件名分离,这种机制致使了一些Unix/Linux系统特有的操做

1. 若出现文件名包含特殊字符,没法正常删除的状况。这时,能够经过直接删除索引结点来删除文件。

2. 移动文件或重命名文件,只是改变文件名,不影响索引结点号码。

3. 打开一个文件之后,系统就以索引结点号码来识别这个文件,再也不考虑文件名。所以,一般来讲,系统没法从索引结点号码得知文件名。

  第3点使得软件更新变得简单,能够在不关闭软件的状况下进行更新,不须要重启。更新的时候,新版文件以一样的文件名,生成一个新的索引结点,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的索引结点则被回收。

硬连接和软链接


基于索引结点共享:硬连接(hard link)

文件索引节点中设有一个连接计数字段inode link count,用来表示链接到本索引结点上的用户目录项的数目

用户A建立一个新文件时,inode link count;

用户B要共享该文件,B的目录中增长一个目录项,并填上新的文件名和指向该共享文件的索引结点的指针,inode link count;

缺点:文件主没法删除被他人共享的文件。

•在系统中占用的空间与源文件相同,但在系统中引用的是相同的对象(不是拷贝)

•在操做系统层解析

•图标和建立快捷方式的图标不一样

•移除源文件不会影响硬连接

•移除硬连接不会影响源文件

•若是源文件被删除,它的内容依然经过硬连接存在

•硬连接文件的任何更改都会影响到源文件

$ln a b    # b是a所指文件的硬连接

硬连接其实是为原文件创建一个别名,连接文件和原文件其实是同一个文件。能够经过ls -i来查看。两个文件的inode号是同一个,说明它们是同一个文件。它只是在文件原来的inode link count域再增长1而已,也所以硬连接是不能够跨文件系统的。硬连接删除的时候,系统调用会检查inode link count的数值,若是它大于等于1,那么inode不会被回收,所以文件的内容不会被删除。目录不能进行硬链接。目录硬链接引用计数,若是造成环,删除的时候会产生dangling dir。

 

基于文件路径共享:符号连接(symbolic link)&软链接(junction link or soft link)

为了能使B共享A的一个文件,系统为B创建一个类型为link的新文件,将该文件放在B的目录下,在新文件中只包含了目标文件的路径名,当B读该link类型的文件时,将被OS截获,并根据新文件中的路径名去读目标文件。这种实现文件共享的方式成为符号连接。

在这种方式下,文件主删除被他人共享的文件后,其余用户再去访问该共享文件,会因找不到文件而失败,再将该符号链删除不会形成任何影响

缺点:其余用户访问共享我共享文件时,必须根据路径中的份量名逐级检索目录,加大了访问文件的开销;尽管Link类型文件很简单,但任需为它配置一个索引结点,并分配一个盘块来存放目标文件的路径名,这样也增长了系统的开销。

•建立连接后的图标和快捷方式很像

•在系统中不占用空间

•在文件系统中不是一个单独的文件

•在操做系统层解析

•若是源文件被删除了,连接就没用了

•移除源文件不会影响符号连接

•移除连接文件也不会影响源文件

$ ln –s a b    #为a建立一个符号连接b

rm b:a不受影响

rm a:a不存在,b能被控制但没法访问

软连接实质是新创建一个inode,产生一个新的文件,但这个文件的做用就是专门指向某个文件的,删除这个软连接文件,原来的实体原文件仍是存在的,保持不变。但要是删除原来的文件,则相应的软连接不可用(cat那个软连接文件,则提示“没有该文件或目录”)。符号连接能够跨文件系统,能够跨磁盘分区,符号连接的文件类型位是l。

比较

硬连接

1.只容许文件连接,不容许目录连接;

2.只能在同一个文件系统范围内进行,不容许跨文件系统。

3.删除文件时,若是还有其余连接链至该文件,则该文件不能被删除。

软连接

1.访问速度相对较慢,但适用范围和灵活性更大。

2.容许目录连接,容许在不一样的文件系统间进行连接,这两个文件系统能够在同一个计算机上,也能够在不一样的计算机上。

3.被连接文件的删除和符号连接的删除是彻底独立的

 

资料出处

1. 操做系统第八版

2. 操做系统原理、设计及应用。高等教育出版社 3. 电子科技大学计算机学院蒲晓蓉老师操做系统课件 4. 电子科技大学计算机学院薛瑞尼老师操做系统课件

相关文章
相关标签/搜索