硬链接和软链接是什么?

硬链接

  • 硬链接指通过索引节点来进行链接。
  • 在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
  • 在 Linux 中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬链接。

软链接

  • 软链接,也叫符号链接(Symbolic Link)。
  • 软链接文件有类似于 Windows 的快捷方式。
  • 它实际上是一个特殊的文件。在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

Inode 是什么?

首先大家得知道文件。想必只要用过电脑的都在操作系统上都创建、修改或者删除过文件。

在 Linux 系统里,文件包含两部分数据:

  • 第一部分是真实的文件数据,也就是你数据的内容。比如,你在系统里建了个文件,名称叫《好友通讯录》,那么这部分数据存储的就是好友的电话、地址、照片、等等;
  • 第二部分是存储文件的元数据信息,比如文件的创建者、文件的创建时间、文件大小等等。这种存储文件元数据的存储区域就叫做 INODE,中文译名“索引节点”。通过索引节点,可以迅速定位到真实的文件数据。

简单来说 Inode,就是个存储文件元数据的地方。下面对 Inode 的几个属性做下简单了解,以便更深刻的理解 Inode。

Inode 的内容

Inode 包含文件的元信息,每个文件对应一个 Inode,它具体有以下内容:

  • 文件的字节数
  • 文件拥有者的 User ID
  • 文件的 Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:
  1. ctime 指 Inode上一次变动的时间;
  2. mtime 指文件内容上一次变动的时间;
  3. atime 指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个 Inode
  • 文件数据 block 的位置

可以用 stat 命令查看:

image

除了文件名之外的信息都在 Inode 之中。为什么没有文件名,下面讲。

Inode 的大小

Inode 既然存储了文件的元数据,那必然是占用存储空间的。需要注意的是,Inode 的大小,在磁盘格式化的时候,就已经决定了。硬盘格式化的时候,操作系统会将硬盘分成两个区,一个是数据区域,存放文件数据;另一个就是 Inode 区(inode table),存放 Inode 所包含的信息。

每个 Inode 的大小,一般是 128 字节或者 256 字节,一般会为 1 KB 或者 2 KB 就设置一个 Inode,在格式化的时候就给定。假设一块 1 G 的硬盘,每个 Inode 的大小为 128 字节,每 1 KB 就设置一个 Inode,那么 inode table 的大小就是 1 GB / 1 KB * 128 byte = 128 M,占这个硬盘的 12.5%。

由于每个文件都必须有一个 Inode,因此有可能发生 Inode 用光了,但是磁盘未满的情况。

Inode 的编号

每个 Inode 都有一个编号,用于操作系统来识别 Inode。值得一提的是,操作系统不会在意文件名,而是通过 Inode编号来识别文件。对操作系统来说,文件名只是 Inode 编号的别称或者绰号。

用户通过文件名打开文件,实际上,操作系统内部这个过程分为三步:

  1. 通过文件名找到 Inode 编号;
  2. 根据 Inode 编号获取 Inode 信息;
  3. 根据 Inode 信息找到数据文件所在磁盘区域;

采用ls -i命令可以查看文件的 Inode 编号。

image

总结

以上,我们对 Inode 就有了基本的认识,总结一句话就是存储文件元数据的地方。硬链接和软链接,现在,咱们再来回头看硬链接和软连接,给他们重新下个定义。

硬链接:

一般情况下,文件名和 Inode 编号是 “一一对应”的关系。但是,在 Linux 系统中,允许多个文件名,对应一个 Inode 编号。这种多个文件名对应同一个 Inode 的情况,称之为硬链接。

模型图类似这样:

image

第一步硬链接是什么咱们知道了。那么它有什么作用呢?我们看,两个文件名有同一个 Inode 编号,那说明,这两个文件名指向的就是同一个数据文件嘛,相当于一个人有两个名字。这样做的好处是啥?

避免误删。多个硬链接指向的同一个文件,只有在所有链接都被删除后,文件才会被删除。

软链接:

文件 A 和文件 B 的 Inode 号码不一样,但是文件 A 的内容是文件 B 的路径。读取文件 A 时自动将访问导向 B。无论打开哪个文件,读取的都是 B。文件 A 就称为文件 B 的软链接。

模型图类似这样:

image

看了上述的概念,让我想到了 C 语言的指针。 软链接的作用:如果你想在你删除某个文件后,其他对这个文件的链接都同时失效的话,使用软链接是非常合适的。

原文链接