路径的延伸:inode、硬链接和符号链接的深度剖析

参考

项目描述
搜索引擎GoogleBing

描述

项目描述
Linux 操作系统Kali-Linux(x86-64)

Inode

一切皆文件

在Linux中,一切皆文件 是一个核心的概念,它表明了 Linux 中所有的东西都被视为文件。这意味着在 Linux 系统中,文件不仅仅是指常见的文本、图像、音频等常规文件,还包括硬件设备、管道、套接字、目录等一切结构。

优点
  1. 统一的管理方式
    由于所有的设备、目录、文件、进程等都被视为文件,因此可以使用相同的方式来管理它们,包括访问、修改、备份等操作,从而简化了管理工作。

  2. 易于扩展
    Linux 中添加新设备或功能时,只需要在文件系统中创建一个新的文件,然后在应用程序中读取或写入这个文件即可,无需额外的驱动程序或其他复杂的配置。

  3. 灵活的权限管理
    在 Linux 中,每个文件都有一个权限位,可以根据需要设置不同的访问权限,包括读、写、执行等,从而 实现对文件(或者说 Linux 中的一切)进行严格的权限控制。

  4. 易于备份和恢复
    由于所有的设备、目录、文件、进程等 都被视为文件,因此可以使用标准的备份工具来备份和恢复整个系统,而不需要使用特定的工具。

  5. 更高的可移植性
    由于 Linux 中所有的设备、目录、文件、进程等都被视为文件,因此 可以更轻松地将应用程序从一个 Linux 系统移植到另一个 Linux 系统,而不需要对应用程序进行额外的修改。

缺点
  1. 磁盘空间限制
    由于一切皆文件的设计,一些特殊的设备或对象也被当做文件对待。这些文件并不占用磁盘空间,但是每个文件都需要使用一个 inode,因此会消耗一定的系统资源,如果系统中存在大量这样的文件,则会占用大量的 inode,从而导致磁盘的空间资源浪费。

  2. 安全性问题
    由于一切皆文件的设计,所有的文件都可以被访问或修改。如果没有对文件执行严格的权限控制及安全措施,就可能会导致系统的安全性问题。

  3. 系统复杂性
    Linux 的一切皆文件的设计使得文件系统变得非常复杂,尤其是在管理一些特殊设备时,需要具有更高的技术要求。这对于新手来说可能会增加学习成本。

  4. 运维难度
    由于一切皆文件的设计,Linux 系统需要对文件系统进行频繁的维护和管理,包括备份、修复等,这 增加了运维难度和工作量

inode

inode

在 Linux 文件系统中,inode(Index node,索引节点)是一种数据结构,用于存储文件或目录的元数据信息,如文件类型、访问权限、所有者、创建时间、修改时间、文件大小等。

inode number

每个文件或目录在文件系统中都有一个 唯一 的 inode 节点号(inode number),它可以被视为文件或目录在文件系统中的身份证号码,通过 inode number 可以找到文件或目录的元数据信息。
当创建一个新的文件或目录时,系统会为它分配一个新的 inode 节点号,并将其与文件或目录的元数据信息相关联。

inode 与 inode number 在文件加载过程中的作用

当用户打开一个文件时,操作系统会根据文件名找到该文件的 inode number,并 根据 inode number 找到相应的 inode 数据结构。然后,操作系统可以从 inode 中获取文件的元数据信息,例如文件大小、文件类型、访问权限、所有者、创建时间、修改时间等。

接下来,操作系统会根据 inode 中的信息(包括文件所在的磁盘块和文件在块中的偏移量)来确定文件存储在磁盘上的位置。然后,操作系统将磁盘块加载到内存中,让用户可以读取或修改文件内容。

查看 inode number

在终端中输入如下命令可以产看一个文件的 inode number。

ls -i <目标文件的路径>

例如,在终端中可以输入如下命令来查看位于当前工作目录下的 target.txt 文件的 inode number 信息。

ls -i target.txt

链接

链接文件

在 Linux 中,链接文件(Link File) 是一种特殊的文件类型,它 提供了一种在文件系统中创建指向另一个文件的快捷方式的方法。 在 Linux 中,有两种类型的链接文件:硬链接和符号链接(也称为软链接)。

链接文件的使用场景

链接文件在 Linux 系统中有很多实用的使用场景,其中一些包括:

  1. 备份文件
    链接文件可以用来创建文件的备份,以避免意外删除源文件导致的数据丢失。通过创建一个硬链接,可以创建源文件的副本,以便在源文件丢失或损坏时进行恢复。

  2. 节省磁盘空间
    硬链接可以用来节省磁盘空间。多个硬链接可以共享同一个物理文件,从而避免重复存储同一个文件的多个拷贝。

  3. 共享文件
    链接文件可以用于共享文件或目录。多个用户可以使用硬链接或符号链接来共享一个文件或一个目录,从而避免对其重复进行拷贝和存储。

  4. 软件升级
    软件更新通常需要替换现有文件或添加新文件。为了避免升级期间的数据丢失,可以使用符号链接来指向旧文件,从而保留旧版本的文件。在升级完成后,可以删除链接并替换为新文件。

  5. 系统管理
    链接文件也可以用于系统管理,例如,创建系统服务或启动脚本的链接文件。这些链接文件可以放置在系统路径中,以便在任何位置都可以访问和执行。

硬链接

在 Linux 中,硬链接(Hard Link)是指在文件系统中创建一个新的文件,使其指向 Linux 中 已存在的 inode 节点从而实现多个文件名指向同一个文件内容的效果(访问源文件与其链接文件将得到相同的内容)。

创建硬链接时,可以使用 ln 命令,其语法如下:

ln source_file link_name

其中,source_file 是要创建硬链接的源文件,link_name 是要创建的链接文件名。

注:

请不要为目录创建硬链接文件。否则,Linux 将为此输出异常信息。如果需要为目录创建链接文件,请为其创建符号链接。

硬链接与源文件共享相同的 inode

创建文件的硬链接后,源文件与一个或多个链接文件将具有相同的 inode number(正是由于源文件与链接文件具有相同的 inode number,所以源文件才会与链接文件共享相同的 inode)。 我们可以采用如下方式对此进行验证。

创建源文件 source_file 的两个链接文件,分别命名为 link_file1 与 link_file2

ln source_file link_file1 && ln source_file link_file2

查看源文件与其(硬)链接文件的 inode number

ls -i

执行效果

136175 link_file1  136175 link_file2  136175 source_file

符号链接

在 Linux 中,符号链接(Symbolic Link),也称软链接 (Soft Link),是一种特殊的文件类型,它创建了一个指向另一个文件的符号链接文件。与硬链接不同,符号链接并不指向源文件的 inode 节点,而是指向源文件路径的一段字符串。

符号链接与源文件使用不同的 inode,因此具有不同的 inode number。对此,请参考如下示例:`

创建源文件 source_file 的符号链接文件 link_file

ln -s source_file link_file

其中:

-s 选项用于指定创建 符号链接文件

查看源文件与其(软)链接文件的 inode number

ls -i

执行效果

136175 link_file  136174 source_file

注:

在创建源文件的符号链接文件后,若在使用 ls 命令时,为其添加 -l 选项,你将能够观察到该符号链接的指向。对此,请参考如下示例:

执行命令:

ls -l

执行效果:

总计 0
lrwxrwxrwx 1 root root 11  4月26日 19:14 link_file -> source_file
-rw-r--r-- 1 root root  0  4月26日 19:14 source_file

其中:

link_file -> source_file 表明,link_file 文件为一个符号链接,它指向源文件 source_file

对符号链接执行的大多数操作都将映射至源文件中

对符号链接执行的大多数操作都会映射到源文件中。这是因为 符号链接只是指向源文件的路径,而不是独立的文件实体。 因此,对符号链接执行的许多操作实际上是在源文件上执行的。

举个栗子

  1. 如果您使用符号链接打开文件进行读取或写入操作,实际上是在源文件上进行操作,而不是在符号链接本身上进行操作。

  2. 更改符号链接的权限或所有者将映射到源文件中。

但是,有一些操作只会在符号链接本身上执行,而不会映射到源文件中。例如

  1. 对符号链接执行 ls -l 命令将仅显示链接文件的元数据,而不是源文件的元数据。

  2. 对符号链接执行 rm 命令将只会删除链接文件本身,而不会对源文件照成影响。

拨云见日

删除或移动源文件将对链接文件照成什么影响?

硬链接

硬链接文件与源文件共享同样的 inode 结构,因此硬链接文件与源文件并无区别,可以说硬链接文件就是源文件。将源文件删除或移动后,(硬)链接文件并不会受到什么影响。

注:

正是由于硬链接存在这一特性,在删除拥有硬链接的文件时需要注意。只有删除了源文件及其所有的硬链接,源文件所占有的资源(inode、inode number及文件内容等资源)才会被释放。

符号链接

符号链接中存放着源文件的路径,因此在创建源文件的符号链接后将源文件删除或移动会导致符号链接找不到源文件。此时,若访问符号链接,你将得到内容为空的文件。对此,请参考如下示例:

创建源文件及其符号链接

通过 echo 语句创建源文件 source_file 并向该文件输入内容 Hello World。在完成上述步骤后,创建源文件的符号链接 link_file

echo 'Hello World' > source_file && ln -s source_file link_file

删除源文件并使用 cat 命令获取符号链接中的内容

rm source_file && cat link_file

执行效果:

由于源文件已被删除,符号链接无法找到其保存的路径所相关的文件(即原文件)而导致 cat 命令产生异常错误信息。

cat: link_file: 没有那个文件或目录

执行 ls -l 命令

ls -l

执行效果:

符号链接文件依旧存在,但与其相关的源文件已不知去向(已被删除)。

Kali Linux 中,当与符号链接相关的源文件失效时,使用 ls -l 后显示的源文件与符号链接将显示为红色。正常情况下,颜色为:

尝试向符号链接中输入内容

echo 'Hello World' > link_file

在执行上述命令后,符号链接将依据所保存的源文件路径创建源文件并将内容输入至源文件中。
当然,你也可以在符号链接所保存的文件路径下创建源文件。在源文件被创建成功后,符号链接与源文件将立即建立联系。

硬链接为什么不能跨越文件系统?

inode 与文件系统

文件系统是一个由 inode 和数据块组成的层次结构,inode用于跟踪文件和目录的元数据信息,而数据块则包含实际的文件数据。在文件系统中,每个目录都包含一个或多个inode,每个inode都可以代表一个文件或子目录。 这种结构允许文件系统中的文件和目录被组织成树状结构,并允许快速访问和管理文件。

==当文件或目录被创建时,文件系统会分配一个唯一的inode号码,并分配一个或多个数据块来存储文件的内容。==每个数据块的大小通常是固定的,通常是 4KB8KB文件系统通过链接 inode 和数据块来组织和管理文件,并提供对它们的快速访问。

inode number space

由于每个文件系统都有自己独立的 inode number 空间,因此相同的文件移至不同的文件系统中后,inode number 往往会发生变化。

当文件被创建时,文件系统会为该文件分配一个唯一的inode号码,并将其与文件的元数据信息相关联,如所有者、权限、时间戳、硬链接计数等。这个 inode 号码在文件系统中是唯一的,并且只能用于在同一文件系统中查找和引用文件。

当文件被移动到不同的文件系统时,文件系统会为该文件分配一个新的 inode 号码,并重新计算数据块的位置和索引

原因

硬链接通过引用与源文件相同的 inode 来实现文件的快捷方式的创建。由于不同的文件系统拥有独立的 inode number 空间,因此无法在不同的文件系统中创建指向相同 inode number 的硬链接。

为什么不能为目录创建硬链接?

破环文件系统结构

目录支持硬链接会导致文件系统结构被破坏,这是因为硬链接是在文件系统中创建的一个新的文件名,指向同一个物理文件。如果目录支持硬链接,那么一个目录可以有多个不同的名称链接到同一个物理目录,这就会导致文件系统结构出现混乱,使得 目录的访问和管理变得复杂和不可预测。

举个例子

假设有一个名为 dir1 的目录,其中包含文件 file1 和子目录 subdir1,目录结构如下所示:

dir1/
    file1
    subdir1/
        file2

现在,如果允许对 dir1 目录进行硬链接,那么可以创建一个新的目录名 dir2,指向同一个物理目录。这就会导致文件系统结构出现混乱,例如 dir1 目录中创建的文件或子目录也会出现在 dir2 目录中,而对 dir2 目录中的文件或子目录的修改也会影响到 dir1 目录中的相应文件或子目录。这会导致文件系统结构的不一致和混乱,使得目录的管理和维护变得非常困难。

因此,为了避免这种问题的发生,许多操作系统都禁止在目录上创建硬链接。在需要管理目录的访问和链接时,用户可以使用其他方式,如设置目录的权限或使用符号链接等。

循环链接

一个文件可以有多个链接指向同一个物理位置。这样可以节省存储空间,同时也可以方便用户进行文件的访问和管理。但是,如果允许目录创建硬链接,就会导致文件系统出现循环链接的问题。例如,如果目录 A 链接到目录 B,而目录 B 又链接到目录 A,就会形成一个循环链接。这样的链接会导致文件系统出现死循环,使得文件系统的正常运行受到影响。

Linux 下的符号链接与 Windows 下的快捷方式的原理是否相同?

Linux 下的符号链接和 Windows 下的快捷方式均能够链接文件与目录,两者实现的原理存在差异,大致存在如下体现:

特性Linux 符号链接Windows 快捷方式
文件大小非常小(几个字节)相对较大(数百字节至几千字节)
存储位置可以位于任何文件系统中必须位于NTFS文件系统中
跨文件系统源文件与符号链接能处于不同的文件系统中快捷方式必须与源文件位于同一文件系统中
跨平台可以在不同的平台间 (类 Unix 系统间) 使用仅能在 Windows 操作系统中使用
保存的路径信息相对路径或绝对路径绝对路径
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryMoon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值