当前位置: 首页 > article >正文

inode和软硬链接

文章目录:

  • 一、理解文件系统
    • 1.1 什么是inode
    • 1.2 磁盘了解
      • 1.2.1磁盘的硬件结构
      • 1.2.2 磁盘的分区
      • 1.2.3 EXT2文件系统
  • 二、软硬链接
    • 2.1 软链接
    • 2.2 硬链接

一、理解文件系统

1.1 什么是inode

inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一的 inode 编号来标识它们。

inode 包含了有关文件或目录的信息,如文件的拥有者、所属组、权限、时间戳等。它还包含指向文件内容的指针,以及其它一些元数据(文件属性),如文件大小和文件类型。

使用命令 ls -l 或者 ll 就可以查看到该目录下的文件及其属性:

在这里插入图片描述

其中文件对应的属性如下所示(以 myfile.txt 文件为例):

在这里插入图片描述

在 Linux 中,文件的元数据和文件内容是分开存储的,其中使用 inode 来保存文件的元数据。为了管理系统中大量的文件,给每一个文件都分配了一个唯一的 inode 编号,便于系统可以快速的访问和管理文件系统中的文件,而不需要扫描整个文件系统。inode 使得文件系统非常高效的处理大量文件和目录。

使用命令 ls -il 可查看当前目录下的文件的 inode 编号:

在这里插入图片描述

在计算机中,文件的属性和数据通常存储在文件系统中。文件系统是一种用于在磁盘或其它设备组织和管理文件和目录的机制❗

1.2 磁盘了解

磁盘是一种用于存储电子数据的设备,通常由多个盘片、磁头和马达组成。它是计算机系统中最常见的外部存储设备之一。磁盘可以存储各种类型的数据,包括操作系统、应用程序、文档、音乐、图像等。数据以二进制形式存储在盘片表面的磁性涂层上。当读取或写入数据时,磁头会在盘片表面运动,根据磁性涂层上的磁场变化来读取或写入数据。

1.2.1磁盘的硬件结构

在这里插入图片描述

文件保存在磁盘中,为了更好的理解,首先来了解一下磁盘的物理结构:

在这里插入图片描述

磁盘的CHS地址:

磁盘的 CHS 地址是一种用于标识磁盘上物理扇区位置的方式,他由柱面(Cylinder)、磁头(Head)、扇区(Sector)三个参数组成,通常被称为 “CHS寻址模式”。在 CHS 寻址模式下,每个物理扇区都由一个唯一的 CHS 地址来定位。柱面号标识磁盘上的圆柱轨道编号,磁头号表示读写磁盘表面的编号,而扇区号则表示每个轨道上的扇区编号。

尽管CHS寻址模式已经被逐渐淘汰,但在早期计算机系统中仍然广泛使用。现代计算机系统使用更高级别的LBA(Logical Block Addressing,逻辑块寻址模式)或者GPT(GUID Partition Table,全局唯一标识分区表)等方式进行数据存取。

1.2.2 磁盘的分区

磁盘的分区是指将一个物理磁盘划分为多个逻辑部分,每个部分称为一个分区。一个磁盘可以划分为一个或多个分区,每个分区看起来像一个独立的磁盘,可以单独格式化、挂载和使用。磁盘一般以扇区为单位,一个扇区的大小通常情况下为 512byte 。如:一个大小为 512G 的磁盘,可以划分为10亿多个扇区。

在这里插入图片描述
在 Linux 下,可以使用 ls /dev/vda* -l 命令来查看磁盘的分区信息:

在这里插入图片描述

1.2.3 EXT2文件系统

ext2文件系统于1993年问世,由 Remy Card 开发,它是几个 Linux 发行版(如 RedHat 和 Debian)中的第一个默认文件系统。ext2之所以流行并使用了很长的一段时间,是因为它解决了 ext 第一个系列中出现的 inode 和 碎片 等基本问题。

EXT2文件系统使用基于磁盘的存储方案,其中数据被存储在扇区中,每个扇区的大小为4KB。磁盘被分为一个或多个分区,每个分区包含一个超级块、一个或多个组描述符块和多个数据块组。每个数据块组都由超级块(Super Block)、块组描述符(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)和数据块(Data blocks)组成。
在这里插入图片描述

  • Boot Block(启动块):大小是确定的,占据一个扇区(512byte)。存储着主引导记录与分区表信息。
  • Block Group:ext2文件系统会根据分区的大小划分为数个 Block Group。而每个 Block Group 都有着相同的结构组成。
  • Super Block(超级块):存放文件系统本身的结构信息。记录的信息主要有:block 和 inode 的总量,未使用的 block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其它文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了。
  • Group Descriptor Table(块组描述符):简称 GDT,描述块组的属性信息。
  • Block Bitmap(块位图):记录 Data Block 中哪个数据块已经被使用,哪个数据块没有被使用。
  • inode Bitmap(inode 位图):记录 inode Table 中哪一个被使用,哪个没有被使用。每个 bit 位表示一个 inode 是否被使用。
  • inode Table(i 节点表):存放文件的属性。
  • Data Blocks(数据区):存放文件内容。

将属性和数据分开实际上是如何工作的呢?接下来我们创建一个新的文件来说明一下:

[root@hostname linux]# touch abc
[root@namehost linux]# ls -i abc
263466 abc

在这里插入图片描述
创建一个文件时,操作系统通常会执行以下操作:

  1. 分配空间:操作系统会为哎文件分配磁盘空间,这些空间在文件创建后将被保留以供该文件使用。
  2. 存储属性:内核先找到一个空的 i 节点(该例子是263466)。内核将文件属性记录到其中。
  3. 存储数据:该文件需要存储在三个磁盘块中,内核分别找到三个空闲磁盘块:300、500、800。将内核缓冲区的数据分别写到三个磁盘块中。
  4. 记录分配情况:文件内容按顺序300、500、800存放。内核在 inode 上的磁盘分布区记录了上述块列表。
  5. 添加文件名到目录:该目录的文件名为 abc。Linux 内核将入口(263466,abc)添加到目录文件。文件名和 inode 之间的对应关系将文件名和文件的内容以及属性连接起来。

文件与 inode 和 data block 之间的关系

在文件系统中,一个文件对应一个 inode ,一个文件可以由一个或多个数据块组成,这些数据块可能存储在磁盘上的不同位置。每个数据块都有一个地址,该地址通常存储在文件的 inode 中。因此,在文件系统中,当我们创建一个文件时,操作系统会为该文件分配一个 inode,并为该文件分配一些数据块。文件内容存储在数据块中,而文件元数据则存储在 inode 中。程序通过 inode 来访问文件,并根据 inode 中存储的指针信息找到相应的数据块来读取或写入文件数据。

如何理解创建一个新文件

  1. 在创建新文件的目录下找到该目录所在的分区和块组。
  2. 遍历 inode bitmap 找到一个未使用的位,将该位置为1。在 inode table 中找到该位对应的空间,并将该文件的属性信息写入其中。
  3. 在 block bitmap 中找到一个或多个未使用的位(具体多少个由写入文件数据的大小来确定),将这些位置为1。然后在 data blocks 中找到对应的数据块,将数据写入数据块中。
  4. 在 inode table 新创建文件的 inode 的数组中填入对应的数据块信息,建立映射关系。
  5. 最后,将 inode 名称和文件名的映射关系保存到目录的数据块中。

如何理解删除一个文件

  1. 将该文件对应的 inode 在 inode bitmap 对应的位置置为 0 。
  2. 将该文件在 block bitmap 中申请的位置置为 0。

注意:删除文件并不是真正意义上的对文件数据进行删除,而是将删除文件对应的数据置为无效即可。因此,在一些情况下,可以对某些删除的文件进行找回。

二、软硬链接

Linux 中的软链接和硬链接是什么?

软链接(符号链接)是到原始文件的实际链接,而硬链接是原始文件的镜像副本。如果删除原始文件,软链接就失去价值了,因为它删除原始文件后它指向一个不存在的文件。但在硬链接的情况下,情况是完全相反的。即使删除了原始文件,硬链接依旧会有原始文件的数据。因为硬链接是原始文件的镜像副本。

在这里插入图片描述

2.1 软链接

在 Windows 中有一个文件快捷方式功能,用于给文件创建快捷方式,如下所示:

在这里插入图片描述
软链接类似于上图中的快捷方式。每个软链接文件都有自己的 inode 值,该值引用原始文件。

对一个文件中信息的任何更改都会反映到另外一个文件中。可以跨不同的文件系统连接软链接,如果源文件被删除或传输,软链接文件将无法正常工作。这种链接被称为悬挂链接。删除软链接没有效果,但如果删除原始文件,可能会导致链接停止工作。🎯

可以通过以下命令创建文件的软链接:

[hyr@centos-hyr linux15]$ ln -s d1/d2/d3/test test.c.soft
                         // d1/d2/d3/test : 表示原始文件
                         // test.c.soft : 生成软链接的名称

通过以下代码我们发现,创建的软链接类似于 Windows 中的快捷方式,可在常用路径下创建路径较深可执行程序的快捷方式,便于快捷的执行程序。

在这里插入图片描述

在 shell 下执行 ll -i 命令查看文件的 inode 号,可以看到,软链接文件与原始文件的 inode 号是不同的,说明软链接相对于原始文件是一个独立文件,软链接文件里面实际存储的是原始文件的路径(该文件所在路径到原始文件所在路径的路径),而不是其内容。所以相对于原始文件要小很多。

在这里插入图片描述

关于软链接:

  • 可以遍历文件系统
  • 允许跨越目录去连接
  • 权限将不会被修改
  • 具有与原始文件不同的我呢见权限和 inode
  • 只是原始文件的路径,而不是其内容
  • 如果我们改变了原始文件的名称,那么该文件所有的软链接都变成了悬空,即它们变得毫无意义

2.2 硬链接

Linux 中的硬链接相当于保存在磁盘驱动器上的文件 - 它实际上是指里链接到磁盘上的某个位置。硬链接的本质是原始文件的镜像。硬连接和软链接之间的区别就在于,删除了原始文件对硬链接是没有影响的,但是删除原始文件对软链接是有影响。因此,硬链接最大的好处是,即使你删除了原始文件,你依旧可以通过硬链接来访问文件。🎯

可以通过以下命令来创建文件的硬链接:

[hyr@centos-hyr linux15]$ ln test.txt test.txt.hard
                          // test.txt : 原始文件
                          // test.txt.hard : 创建的硬链接文件

在这里插入图片描述

通过命令 ll -i 命令查看文件的 inode 号,如下:软链接文件与硬链接文件的 inode 号是一样的,且硬链接文件的大小与源文件的大小也是相同的。在建立硬链接之后,原始文件和硬链接文件的链接数都变为了 2 (为什么?)。

如下所示,若创建一个普通文件,则文件初始的硬链接数为1;若创建一个目录,则文件的硬链接数为2(why?)。

在这里插入图片描述

当我们创建目录时,该目录下会生成两个隐藏文件 .... 表示当前目录,.. 表示上级目录。因此,.dir 都表示同一个文件(它们的 inode 都是一样的),因此目录生成时硬链接数就是2。

在这里插入图片描述

关于硬链接:

  • 不能链接目录
  • 每个硬链接文件都被分配了与原始文件相同的 inode 值,因为它们引用相同的物理文件位置。硬链接更加灵活,即使原始文件或被链接的文件在整个文件系统中移动也能保持链接,尽管硬链接不能跨不同的文件系统。
  • 任何硬链接文件的大小都与原始文件相同,如果我们改变了任何硬链接的内容,那么所有硬链接文件的大小都会更新
  • 即使我们改变了原始文件的文件名,硬链接也可以正常工作
  • 不能为目录创建硬链接以避免递归循环
  • 硬链接的缺点是不能为不同文件系统上的文件创建硬链接,也不能为特殊文件或目录创建硬链接

软链接和硬链接之间的差异:

参数软链接硬链接
inode 值与原始文件的 inode 值不同与原始文件的 inode 值相同
目录可以链接目录不能跨目录链接
删除原始文件若原始文件被删除,该链接将失效,因为它只是原始文件的快捷方式即使删除原始文件,硬链接也将继续运行,因为它访问的数据与原始文件相同
速度较慢较快
内存消耗

总结:硬链接占用的空间更少,工作速度更快,但对它的修改会反映到原始文件中。而软链接需要更多的空间,对软链接的任何更改都不会对原始文件产生影响。


http://www.kler.cn/a/2052.html

相关文章:

  • 前端导出PDF的组件及方法
  • OpenHarmony 3.2 网卡获取ip地址缓慢分析
  • HBase、Hive、Redis 和 MongoDB的对比
  • JavaScript 中常见内置对象的知识点及示例总结
  • 写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践
  • K8s 节点 NotReady 后 Pod的变化
  • Python遥感图像处理应用篇(三十一):Python+GDAL实现遥感图像平移、旋转
  • 用Pytorch构建一个喵咪识别模型
  • Linux--线程安全、多线程fork问题
  • 【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)
  • Spark了解
  • seata服务搭建
  • 图形视图框架QGraphicsScene(场景,概念)
  • Vue中常使用的三种刷新页面的方式
  • 12个 Python 装饰器让代码cleaner
  • Android Lacent Aop 字节编码修复7.1系统Toast问题(WindowManager$BadTokenException)
  • 手动创建数据集(csv文件),用于Pytorch深度学习
  • 【运维】运维常用命令
  • 【Linux】学会这些基本指令来上手Linux吧
  • iOS 紧急通知
  • nodejs篇 express(1)
  • Python 可视化最频繁使用的10大工具
  • RK3588平台开发系列讲解(NPU篇)NPU调试方法
  • LeetCode--缺失的第一个正数(41)和 接雨水(42)
  • Elastic 之 elasticsearch 基本操作
  • 【数据结构】千字深入浅出讲解队列(附原码 | 超详解)