0


【Linux】文件系统 & 软硬链接

📃个人主页:island1314

🔥个人专栏:Linux—登神长阶

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞


一、文件系统

1. 磁盘结构

  1. 机械磁盘是计算机中唯一的一个机械设备
  2. 磁盘--- 外设
  3. 容量大,价格便宜

1.1 物理结构

1.2 存储结构

  1. 扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节
  2. 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
  3. 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道.,靠近主轴的同心园用于停靠磁头,不存储数餐
  4. 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
  5. 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
  6. 圆盘(platter)数:就是盘片的数量
  7. 磁盘容量 = 磁头数 x 磁道(柱面)数 x 毎道扇区数 x 毎扇区字节数
  8. 细节:传动臂上的磁头是共进退的(这点比较重要,后面会说明)

1.3 扇区(了解)

扇区(Sector)是磁盘存储的基本单位,是磁盘上最小的可寻址数据块

特点:

  1. 固定大小:传统的磁盘扇区大小为512字节,但现代硬盘和固态硬盘越来越多地使用4096字节(也称为“高级格式”)的扇区
  2. 物理地址:每个扇区都有一个唯一的物理地址,由磁头号、柱面号和扇区号组成(CHS寻址方式),或者由逻辑块地址(LBA)表示
  3. 读写操作:磁盘的读写操作通常以扇区为单位进行。即使只读取或写入少量数据,磁盘控制器也会读取或写入整个扇区的数据

作用:

  1. 数据存储:扇区是磁盘上实际存储数据的基本单位
  2. 文件系统管理:文件系统将多个扇区组合成更大的块(如4KB、8KB等),以便更高效地管理和分配存储空间
  3. 错误检测与校正:每个扇区通常包含一些额外的字节用于存储校验和或其他错误检测信息,以确保数据的完整性

如何定位一个扇区:

  1. 找到指定的磁头。 Header
  2. 确定磁头要访问的磁道(柱面) Cylinder
  3. 找到指定的扇区 Sector
  4. CHS (地址定位法)

这种在硬件上定位某一个扇区的寻址方案叫CHS定址法,即需要三个参数。

文件其实就是在磁盘中占有几个扇区的问题。

1.4 逻辑结构

我们把磁盘抽象成巨大的线性结构

  • 假设是两片四面。尽管扇区大小有差异,但是每个扇区的内存大小都是一样的。每一面上都有很多扇区,最后就把磁盘抽象成数组 。
  • 有了数组,就可以通过下标找到某个扇区,但是磁盘只认CHS,所以要通过算法将下标转换成CHS的地址
  • 找到下标后交给磁盘,磁盘内部会把线性地址转换成CHS的地址,进而定位到某一个扇区里。

注意:一般而言,OS未来和磁盘交互的时候,基本单位为4KB,而不是512字节(一个扇区512字节),因为一次读512字节太少了,因为要提高效率

所以4KB=8个连续的扇区,系统把这8个连续的扇区称为块大小(数据块)

8个扇区为一个块,块号*8 = 每一个块的第一个扇区的下标,连续往后读就能知道整个块的下标

  • 对于OS而言:未来读取数据就能以块为单位了,这里的每一个块号的起始地址称作LBA (逻辑区块地址)

LBA 和 CHS 的相互转化(补充 了解)

2. 理解分区、格式化

🔖 假设磁盘的空间很大,需要分区管理,因此只要能管理好其中一个区,剩下的其他区就可以照搬它的管理方法,全部管理好。

🔥 如果这里管理其中一个区,这个区还是太大,就要在这个区里面继续分组。只要把一个组管理好了,这个区的每一个组就都能管理好了

上图下半部分是磁盘文件系统图。

Linux文件系统特点:文件内容和文件属性 分开存储

  1. Block Group:文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成
  2. 超级块(Super Block):存放文件系统本身的结构信息,描述的是整个分区整体的文件系统的情况 1. 记录的信息主要有: 1. bolck 和 inode的总量2. 未使用的block和inode的数量3. 一个block和inode的大小4. 最近一次挂载的时间5. 最近一次写入数据的时间6. 最近一次检验磁盘的时间等其他文件系统的相关信息2. Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了3. 超级块不止一个,可能有多个,在不同的块组里,这样可以让文件系统更稳定
  3. GDT,Group Descriptor Table:块组描述符,描述块组属性信息
  4. 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
  5. inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  6. inode表:存放文件属性 如 文件大小,所有者,最近修改时间等
  7. 数据区:存放文件内容
  8. inode Table里面存的是文件的属性,Data blocks里面存的是文件的内容

Linux中文件的属性是一个大小固定的集合体,也就是inode结构体

结构体里面没有文件名。内核层面,每一个inode都有inode number,通过inode号标识一个文件。

通过inode号找到inode后,inode里面还有一个数组,可以映射到对应数据块

3. inode 是什么

🌈 在Linux文件系统中, inode(索引节点)是一个非常重要的概念。每个文件和目录在Linux文件系统中都有一个对应的 inode ,它包含了除文件名之外的所有元数据信息

以下是一些关于 inode 的关键点:

3.1 inode的定义

  • inode 是文件系统中的一个数据结构,用于存储文件的元数据(即文件的属性信息)
  • 每个文件或目录都有一个唯一的inode
  • inode 编号是以分区为单位的,一个分区内 inode 号不能重复,两个分区间可以,所以 inode 不能跨分区访问。

3.2 inode包含的信息

  1. 文件类型:普通文件、目录、符号链接等
  2. 权限:文件的读、写、执行权限
  3. 所有者:文件的所有者和组
  4. 时间戳:文件的创建时间、修改时间和访问时间
  5. 文件大小:文件的实际大小
  6. 指向数据块的指针:文件数据在磁盘上的位置
  7. 硬链接数:指向该inode的目录项数量

3.3 inode的作用

  • 唯一标识: inode 号是文件系统的唯一标识符,即使文件名改变, inode 号也不会改变。
  • 元数据管理: inode 存储了文件的所有重要元数据,使得文件系统可以高效地管理和检索文件。
  • 硬链接支持:多个目录项可以指向同一个 inode ,这就是硬链接的基础。

3.4 inode与文件名的关系

  • 文件名实际上是目录中的一个条目,指向相应的 inode
  • 可以有多个文件名(硬链接)指向同一个 inode
  • 删除一个文件名并不会删除 inode ,只有当所有的硬链接都被删除时,inode 才会被释放

5. 查看inode信息

你可以使用一些命令来查看inode信息:

  1. ls -i:显示文件和目录的 inode 号。
  2. stat :显示文件的详细信息,包括inode号和其他元数据。
  3. df -i:显示文件系统的 inode 使用情况。

示例:

sh# 显示当前目录下文件和目录的inode号
ls -i

# 显示某个文件的详细信息
stat example.txt

3.6 inode限制

  • 每个文件系统有一个固定的 inode 数量上限,这在创建文件系统时确定
  • 如果文件系统中的 inode 用尽,即使还有可用的磁盘空间,也无法再创建新的文件或目录

通过理解和使用 inode ,你可以更好地管理Linux文件系统,并解决一些与文件和目录相关的问题。

4. Inode 、Inode Table 、Data Blocks 三者关系

  1. Inode 是一个数据结构,用于存储文件的元数据(即文件的属性信息)。每个文件和目录都有一个唯一的 inode
  2. Inode Table 是文件系统中存储所有inode 的一个区域。它是一个固定大小的数组,每个 inode 占用固定的大小。作用如下:1. I****node Table 存储了文件系统中所有文件和目录的元数据2. 每个** inode Inode Table 中有一个唯一的编号(inode号)3. 当文件系统创建时,Inode Table** 的大小是预先分配好的,这意味着文件系统中可以存储的文件和目录数量有一个上限
  3. Data Blocks 是实际存储文件内容的磁盘空间。文件的数据被分割成多个块,并存储在这些数据块中。作用如下:1. 文件的实际内容存储在Data Blocks中2. Inode中的指针指向这些数据块的位置3. 数据块的大小通常是固定的,例如4KB或8KB,具体取决于文件系统的配置
  4. 三者的关系1. Inode 存储文件的元数据,并包含指向数据块的指针。2. *Inode Table 是存储所有inode的区域,每个inode在其中有一个唯一的编号。3. Data Blocks 存储文件的实际内容,通过inode***中的指针来访问。

举个例子:
假设你有一个文件 example.txt,其内容如下:

Hello, World!

Inode:这个文件的inode可能包含以下信息:

  1. 文件类型:普通文件
  2. 权限:644(用户可读写,组和其他用户只读)
  3. 所有者:user
  4. 组:user
  5. 创建时间、修改时间和访问时间
  6. 文件大小:13字节
  7. 指向数据块的指针:假设文件内容存储在第1000号数据块

Inode Table:假设example.txt的inode号是12345,那么在Inode Table中,第12345个位置会存储上述inode信息。

Data Blocks:文件的实际内容“Hello, World!”存储在第1000号数据块中。

5. 理解 inode 、块号都是全局的

在Linux文件系统中,块号(block number)和 inode号(inode number)都是全局唯一的标识符。这意味着它们在整个文件系统范围内是唯一的,而不是在某个特定目录或子目录内唯一。

全局唯一性的意义

(1)Inode的全局唯一性:在一个文件系统中,每个inode号是唯一的。无论文件或目录位于文件系统的哪个位置,其inode号在整个文件系统范围内都是唯一的

  1. 确保每个文件和目录都有一个唯一的标识符
  2. 允许多个目录项(硬链接)指向同一个inode,从而实现文件共享
  3. 使得文件系统可以高效地管理和检索文件。
  • (2)块号的全局唯一性:在一个文件系统中,每个数据块的块号也是唯一的。无论数据块存储的是哪个文件的数据,块号在整个文件系统范围内都是唯一的
  1. 确保每个数据块有一个唯一的标识符
  2. 使得文件系统可以有效地管理和分配磁盘空间
  3. 防止数据块被重复使用,从而避免数据损坏

问题:为什么任何一个文件都需要有路径

  • 文件路径是文件在文件系统中的唯一位置标识,确保操作系统能够准确找到和访问该文件

6. 通过 inode 查找文件

  1. 我们平时都是用文件名找文件,**inode **就是通过文件名找到的。
  2. 由于目录=文件属性+文件内容目录的内容就是文件名和inode编号的映射关系。所以同一目录下不能有同名文件
  3. 找文件的顺序:文件名 -> inode编号
  4. 目录的** r** 权限,本质是是否允许我们读取目录的内容,即 文件名和inode的映射关系
  5. 目录的 w 权限,新建文件时,本质:建立文件名和inode编号的映射关系

  • 要找到一个文件,就要先找到文件所在的目录,然后打开,通过文件名与inode号的映射关系找到目标文件的inode。
  • 目录也是文件,因此就要继续往上查找,直到来到根目录下。
  • 根目录是系统给我们的,是已知的,就可以找到目标文件了。
  • 这种逆向的路径解析由OS完成。这也是为什么Linux定位一个文件时,都要有路径的原因。

分区与查找文件的关系?

  1. 要找到一个文件,需要inode,但更前提的是需要知道在哪个分区。
  2. 由于我们用的云服务器一般只有一个盘,盘里面有分区。要访问一个分区,就需要把该分区**挂载 **挂载实际是把磁盘分区和文件系统的目录进行关联,未来进入该分区本质就是进入该目录)
  3. 一个文件起始在访问之前,都是先有目录的,文件都是带有路径的,目录也是。所以根据目录的路径,就可以找到对应哪个分区。
  4. 所以目录本身除了可以定位文件,还能确定是在哪个分区下的

7. 理解创建新文件

🎐 将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作

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

为了说明问题,我们将上图简化:

创建一个新文件主要有一下4个操作:

1)存储属性

  • 内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

2)存储数据

  • 该文件需要存储在三个磁盘块,内核找到了三个空闲块:300, 500, 800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

3) 记录分配情况

  • 文件内容按顺序300, 500, 800存放。内核在inode上的磁盘分布区记录了上述块列表。

4)添加文件名到目录

  • 新的文件名abc。
  • linux 如何在当前的目录中记录这个文件? - 内核将入口(263466,abc)添加到目录文件- 文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来

8. 实验

8.1 查看分区

df -h # 查看可以使用的分区

8.2 制作分区

dd if=/dev/zero of=./disk.iso bs=1M count=5 # 制作大的磁盘块,就当作分区

8.3 格式化写入文件系统

mkfs.ext4 disk.iso  # 临时分区

8.4 建立空目录&挂载

sudo mkdir /mnt/myvda2 # 建立空目录

sudo mount -t ext4 ./disk.iso /mnt/myvda2/ # 将分区挂载到指定目录

8.5 进入分区

8.6 卸载分区

sudo umount /mnt/myvda2

二、软硬链接

软链接(符号链接)和硬链接是Linux文件系统中两种不同类型的链接,它们用于在文件系统中创建指向同一文件的多个引用

1. 硬链接(Hard Link)

定义:硬链接不是独立的文件,是文件系统中的一个目录项,没有独立的inode,与原始文件共享相同的inode号和数据块。本质上就是一组文件名和已经存在的文件映射关系

特点:

  1. 硬链接与原始文件实际上是同一个文件,只是有不同的目录项指向同一个inode
  2. 删除一个硬链接不会删除文件的实际内容,只有当所有硬链接都被删除时,文件的数据块才会被释放
  3. 硬链接不能跨越不同的文件系统
  4. 硬链接只能用于普通文件,不能用于目录

** 案例:**

ln file.txt file.hard.link

2. 软链接(Soft Link)

2.1 基本概念

定义:软链接是一个特殊的文件,它包含指向另一个文件或目录的路径。软链接类似于Windows中的快捷方式
特点:

  1. 软链接是一个独立的文件,有自己的inode号
  2. 软链接的内容是目标文件的路径名
  3. 删除软链接不会影响目标文件,但删除目标文件会使软链接失效(变成“悬空链接”)
  4. 软链接可以跨越不同的文件系统
  5. 软链接可以指向文件或目录

2.2 使用

情况一:给当前目录下文件进行软链接

ln -s file.txt file-soft.link

情况二: 指定路径进行软链接

情况三: 指定目录进行软链接

3. 对比

特性硬链接 (Hard Link)软链接 (Symbolic Link)Inode与原始文件共享同一个inode有自己的inode删除行为只有当所有硬链接都被删除时,文件才被删除删除软链接不影响目标文件,删除目标文件使软链接失效跨文件系统不能跨越文件系统可以跨越文件系统目标类型只能指向文件可以指向文件或目录命令ln original_file hard_linkln -s target_file symbolic_link

4. inode 的引用计数

4.1 基本概念

在Linux文件系统中,inode的引用计数(也称为链接计数)是一个非常重要的概念。它表示指向该inode的目录项(或硬链接)的数量,用于管理文件生命周期,当计数为0时文件被删除。

  • 引用计数的主要作用是帮助文件系统管理文件的生命周期和确保数据的一致性

如下代码:

4.2 作用

  1. 文件删除:当一个文件被删除时,实际上只是删除了指向该inode的一个目录项(即硬链接),引用计数减1。只有当引用计数变为0时,文件的实际数据块才会被释放,inode也会被标记为可用
  2. 文件共享:多个目录项可以指向同一个inode,形成硬链接。引用计数记录这些硬链接的数量
  3. 数据一致性:通过引用计数,文件系统可以确保在所有硬链接都被删除之前,文件的数据不会被意外删除(文件备份)

Linux 文件备份如下:

4.3 查看

你可以使用 ls -i 和 stat 命令来查看文件的inode号和引用计数

5. 软硬链接的意义

软硬链接提供文件的多路径访问

  • 硬链接共享inode,提高数据冗余和可靠性
  • 软链接则创建指向文件的快捷方式,支持跨文件系统和指向目录,增加灵活性

6. 为什么不能对目录进行硬链接

6.1 基本概念

在大多数文件系统(如ext4)中,不允许对目录创建硬链接,主要是为了避免循环引用和文件系统的复杂性。如果允许对目录进行硬链接,可能会导致以下问题:

  1. 循环引用:硬链接会形成多个指向同一inode的路径,这可能导致循环引用,使得文件系统难以遍历和管理
  2. 复杂性增加:文件系统的管理和维护会变得更加复杂,因为需要处理更多的边界情况和一致性问题

6.2 案例

假设我们有一个文件系统结构如下:

/home
└── user
    ├── dir1
    │   └── file1
    └── dir2

如果我们允许对目录进行硬链接,可以创建一个硬链接 dir2 指向 dir1:

ln /home/user/dir1 /home/user/dir2

此时,文件系统的结构看起来是这样的:

/home
└── user
    ├── dir1
    │   └── file1
    └── dir2 -> dir1 (硬链接)

如果我们在 dir1 中再创建一个硬链接 subdir 指向 dir2:

ln /home/user/dir2 /home/user/dir1/subdir

这将形成一个循环引用:

/home
└── user
    ├── dir1
    │   ├── file1
    │   └── subdir -> dir2 (硬链接)
    └── dir2 -> dir1 (硬链接)

此时就会导致遍历困难,文件系统在遍历时会陷入无限循环,无法正确处理这种结构

因此,得到结论:

  • 为了防止循环引用和简化文件系统的管理,大多数文件系统不允许对目录进行硬链接
  • 软链接则没有这些限制,因为它只是存储目标路径,不会形成实际的inode共享
标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/island1314/article/details/143092351
版权归原作者 IsLand1314~ 所有, 如有侵权,请联系我们删除。

“【Linux】文件系统 & 软硬链接”的评论:

还没有评论