Linux中的硬链接与软链接

inode

在unix系统中,文件的储存分为两个部分,一个是数据块(datablock),用来保存文件中储存的数据。另一部分称为索引节点(inode),用来储存文件的大小、创建日期、读写权限等信息,这一部分信息被称为文件的“元数据”(metadata)。

inode中包含了文件的如下信息:
  • 文件数据block的位置

  • 文件的字节数

  • 文件拥有者的User ID

  • 文件的Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  • 链接数,即有多少文件名指向这个inode

在linux系统中,每个inode有自己的唯一inode号,可以通过ls -i命令显示文件的inode号

操作系统通过inode号码来标识唯一文件而不是文件名,文件名只是便于用户记忆的inode号的‘绰号’,一个文件可以有多个文件名,但是一个文件的inode号码是唯一的。
inode号和块数据是分开储存的,所以有的时候一个分区还有空间,但是操作系统却提示分区已满无法写入,这种情况下可能是当前分区的inode号已经用完了,造成这种情况发生的原因可能是当前分区有大量的占空间较小的文件。

硬链接和软链接

硬链接(hard link)

如上所述,文件名对inode号来说只是一个绰号,一个inode号可以有多个绰号或者说是别名。每一个别名就是该inode号对应的文件的一个硬链接,也就是说硬链接相当于一个文件的别名。
可以使用link或者ln命令来创建硬链接。

ln FileA FileB

以上命令会创建一个文件A的硬链接文件B,文件B相当于是文件A的别名,指向同一个文件。

硬链接有如下特点:
  • 文件有相同的 inode 及 data block;

  • 不能对目录进行创建,只可对文件创建;

  • 不能交叉文件系统进行硬链接的创建;

  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

为什么不能对目录创建硬链接?我们知道在linux中目录也是一种文件,其中包含关联列表。实际在创建目录时会自动创建多个硬链接其中"."是自身的硬链接,".."是其父目录的硬链接。所以一个目录的硬链接最少为2(指向自身的一个和父目录指向它的一个)。也就是说每有一个子目录其父目录的硬链接就会+1(子目录的”..")。所以若对目录创建一个硬链接操作系统会认为创建了一个子目录,所以该硬链接指向的目标目录的".."会指向该目录。这样会导致遍历的时候逻辑混乱,甚至会出现死循环。

软链接(soft link)

软链接又称符号链接(symbolic link),软链接和硬链接不同,软链接是一个普通的文件,拥有自己独立的inode号以及数据块,只不过软链接的数据块中存储的是源文件的路径。使用如下命令创建软链接:

ln -s FileA FileB 

上面的命令会创建FileA的一个软链接FileB,创建软链接不会导致FileA的inode号的连接数增加,因为软链接指向源文件的文件名而不是源文件的inode号,软链接的存在形式类似于windows中的快捷方式。

软链接有如下几点特性:
  • 软链接有自己的文件属性及权限等;

  • 可对不存在的文件或目录创建软链接;

  • 软链接可交叉文件系统;

  • 软链接可对文件或目录创建;

  • 创建软链接时,链接计数不会增加;

  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接。

    最后硬链接和软链接的区别可总结为:
  • linux的硬链接与软链接的区别为硬链接只是指向inode号的一个别称,自身不具有inode号和数据块,而软链接有自身的inode号和数据块

  • 硬链接只能对存在的文件创建,软链接可以对不存在的文件创建,可以之后再创建源文件。

  • 硬链接不能交叉系统创建,而软链接可以。

  • 硬链接不可对目录创建,软链接可以。

  • 创建硬链接会增加文件的连接数,软链接不会。

  • 删除软链接不会删除文件,删除硬链接时若剩余硬链接数大于0不会删除文件,若某文件的所有硬链接都被删除,该文件会被删除。

参考文献

王华东,理解 Linux 的硬链接与软链接[EB\OL].
https://www.ibm.com/developer...

阮一峰,理解inode[EB\OL].
http://www.ruanyifeng.com/blo...

你可能感兴趣的:(inode,硬链接,软链接,linux)