Linux系统:Ext系列文件系统(硬件篇)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一,理解硬件
- 1-1 磁盘、服务器、机柜、机房
- 1-2 为什么需要磁盘?
- 1-3 磁盘的物理结构
- 1-4 磁盘的存储结构
- 1-5 磁盘的逻辑结构
- 1-5-1 抽象概念
- 1-5-2 真实过程
- 1-6 CHS && LBA地址
- 1-6-1 CHS转成LBA:
- LBA 转成CHS:
- 二,分区,inode,块
- 2-1 块
- 2-2 分区
- 2-3 inode
前言
在 Linux 系统中,文件系统是操作系统与磁盘之间最关键的桥梁。Ext 系列文件系统作为 Linux 中最经典和广泛使用的一种,不仅关系到数据的存储与访问效率,也深刻影响着系统的性能与稳定性。了解 Ext 文件系统的结构与机制,是深入掌握 Linux 操作系统不可或缺的一步。学 Ext 文件系统,就像掌握了 Linux 磁盘世界的地图,能让你真正理解数据如何生、存、亡!!!
本文用于文件系统的硬件学习
一,理解硬件
1-1 磁盘、服务器、机柜、机房
磁盘是服务器的一部分,服务器放在机柜中,多个机柜组成一个机房。
磁盘
:服务器的“存储器”- 是最基础的硬件之一,
负责存储数据
。 - 可以是机械硬盘(HDD)、固态硬盘(SSD)、企业级磁盘阵列等。
- 一台服务器通常包含1块或多块磁盘,用来安装操作系统、保存文件、运行数据库等。
- 是最基础的硬件之一,
服务器
:就像一个“执行任务的智能设备”,磁盘只是它的“硬盘”- 是一台专门处理请求、提供服务的
计算机
(物理的或虚拟的) - 它可能提供网站服务、数据库服务、文件存储、AI 推理等。
- 一台服务器通常包含:CPU、内存、磁盘、网卡、电源等部件。
- 有 1U、2U 等机架式形态,也有塔式、刀片式。
- 是一台专门处理请求、提供服务的
机柜
:机柜就像一个“服务器的集装箱”,是物理收纳单元- 是放置多台服务器、交换机、电源模块等设备的标准化
金属柜子
- 通常高 42U(1U 是 1.75 英寸),能容纳多台设备。
- 便于布线、散热和集中管理。
- 是放置多台服务器、交换机、电源模块等设备的标准化
机房
:“所有服务器工作的地方”,是基础设施的终点站- 是集中放置多个机柜的大型
房间或建筑
。 - 拥有供电系统、冷却系统、防火/防雷系统、安全系统等。
- 保障服务器全天候运行,是云计算/互联网服务的基础设施核心。
- 是集中放置多个机柜的大型
1-2 为什么需要磁盘?
磁盘让计算机拥有“记忆”,没有磁盘,计算机就无法保存任何有用的东西。
磁盘的作用
- 永久保存数据
- 与内存(RAM)不同,磁盘即使断电也能保存数据。
- 比如:操作系统、文档、图片、视频、数据库,都保存在磁盘上。
- 运行操作系统的载体
- 没有
磁盘
,系统无法安装和启动操作系统(除非用U盘或网络引导)。
- 没有
- 软件与服务的依托
- 应用程序、系统日志、缓存等都依赖磁盘空间。
- 比如网页服务器要存网页文件,数据库服务器要存数据库文件。
- 大容量、低成本
- 相比内存,磁盘可以提供更大容量、更低价格的数据存储。
如果没有磁盘会怎样?
- 计算机只能靠内存临时运行,一旦断电,数据全部消失。
- 操作系统无法启动,应用无法运行,文件无法保存。
- 等于
“失忆”
的电脑,无法承担任何实用任务。
1-3 磁盘的物理结构
盘片是“书”,磁头是“眼睛和笔”,磁头臂是“翻书的手”,主轴是“转动的书架”,永磁铁帮助精准控制手的动作。
盘片
:存储数据的“光盘”,表面有磁性材料,通过磁化方向记录0和1。主轴
:带动盘片高速旋转(比如7200转/分钟),让磁头能快速访问不同位置的数据。磁头
:负责读取和写入数据,悬浮在盘片上方(几乎不接触),感应或改变磁性。永磁铁
:配合磁头臂运动,提供精准的磁力控制,让磁头能快速移动到正确位置。磁头臂
:支撑磁头,像机械手臂一样来回摆动,让磁头能覆盖整个盘片。
1-4 磁盘的存储结构
扇区(Sector)
- 是磁盘上最小的可寻址存储单元,通常为
512 字节
(现在也有 4KB 的)。 - 每一条磁道会被划分成若干个扇区。
- 是磁盘上最小的可寻址存储单元,通常为
磁道(Track)
- 磁盘在每个盘面上从内到外的一圈圈圆形路径。
- 当磁头在一个固定位置旋转时,磁头划过的路径就是一条磁道。
- 类似于老式黑胶唱片上的同心圆。
柱面(Cylinder)
- 所有盘片中同一半径上的所有磁道组成的集合,称为一个柱面。
- 举个例子:如果一个磁盘有4个盘面(上下两个盘片),那么第100号磁道的4个盘面合起来就是“柱面100”。
磁头(Head)
- 每个盘面有一个磁头负责读写。
- 多个盘面就有多个磁头。
CHS (Cylinder-Head-Sector)
- 是对磁盘上每一个扇区的物理定位方法。
- 每个数据块的位置可以用三元组 (柱面号,磁头号,扇区号) 表示。
- 一块传统的机械硬盘(HDD)其实就像一个数据汉堡,里面有好几张圆圆的盘片一层层叠在一起,每张盘片的正反两面都能存数据。每一面都配有一个磁头,就像唱针一样,它用来读写数据。
- ==这些磁头都安装在一个
“磁臂”
上,磁臂可以前后移动,这样磁头就能在盘片上来回扫,找到不同的圈圈来读写数据。而盘片本身是高速旋转的,这样每次旋转一圈,磁头下方就会经过很多数据区。 - 盘面上的数据是按一圈圈排好的,这些圈叫做磁道(Track)。每个磁道再被分成一小块一小块的“披萨片”,这些就是扇区(Sector),是硬盘能读写的最小单位,常见大小是
512 字节
或者4K
。 - 再进一步看,所有盘片上编号相同的磁道,比如说每张盘片上的第100圈,这些磁道在垂直方向上对齐,就组成了一个“柱子”,这叫柱面(Cylinder)。这样只要磁臂把磁头移动到某个柱面,再根据要用哪个磁头(也就是哪个盘面),就能定位到很精确的位置。
- 早期的硬盘访问方式叫
CHS
地址模式,意思就是用三个数字来找数据:C
是柱面号(Cylinder)H
是磁头号(Head,对应盘面)S
是扇区号(Sector)
然而,CHS 寻址方式存在容量限制。这是因为:
磁头地址(Head)
:使用 8 位表示,最大支持 256 个磁头柱面地址(Cylinder)
:使用 10 位表示,最大支持 1024 个柱面扇区地址(Sector)
:使用 6 位表示,最大支持 63 个扇区(注意扇区编号从 1 开始)- 每个扇区大小为 512 字节
因此,CHS 模式下最大可寻址容量为:
256(磁头) × 1024(柱面) × 63(扇区) × 512 字节
= 8,455,716,864 字节 ≈ 8064 MB(按 1MB = 1,048,576 字节)
≈ 8.4 GB(按 1MB = 1,000,000 字节)
这意味着,CHS 模式最多支持约 8.4GB 的硬盘容量,无法满足日益增长的存储需求,因此后来被 LBA
(逻辑块地址)模式所取代。
1-5 磁盘的逻辑结构
1-5-1 抽象概念
磁盘的逻辑结构可以抽象为我们小时候用的磁带
一样,是一种线形的结构
磁盘存储结构:
磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构
虽然磁盘是硬质的机械设备,但从逻辑角度来看,我们可以把磁盘想象成卷成盘状的一条磁带。因此,磁盘的逻辑存储结构也可以类比于磁带的线性数据排列方式,呈现出类似的连续性和顺序性
。
这样,每一个扇区
就拥有了一个线性地址,就像一维数组中的下标一样。这个线性地址称为 LBA(Logical Block Address,逻辑块地址),它用于唯一标识磁盘上的每一个数据块,简化了磁盘的寻址方式。
1-5-2 真实过程
⼀个细节:传动臂上的磁头是共进退的
柱面”
其实是一个逻辑上的说法,意思就是每一张盘片上那些半径一样的磁道,叠起来看就像是围成了一个圆柱面。
虽然磁盘在物理上有好几张盘片,但我们可以把它想象成一圈圈的柱面一层层地卷起来组成整个磁盘。
-
磁道:
-
某⼀盘⾯的某⼀个磁道展开:
-
柱⾯:
-
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
-
每个
柱面
上的磁道
数量是一样的,每个磁道里的扇区
数量也一样。 -
换句话说,整个磁盘的柱面结构就像一个规则的二维数组——一行行是柱面上的磁道,一列列是磁道上的扇区。
整盘:
-
整个磁盘,其实可以理解成很多张二维的“扇区表”堆叠在一起,就像一个三维数组。
-
所以当我们要定位(寻址)某个扇区时,其实就是按
“CHS”
三个维度来找的:
先确定在哪个柱面(Cylinder)
,然后是柱面上的哪一个磁头(Head,对应磁盘的某一面)
,最后是具体的扇区(Sector)
。 -
不过如果你学过 C/C++ 的数组,其实这些看起来像三维的结构,我们都可以把它看成是一维数组来处理——本质上就是线性排列的。
1-6 CHS && LBA地址
1-6-1 CHS转成LBA:
-
一个柱面上的扇区总数 =
磁头数
×每个磁道的扇区数
。 -
LBA(逻辑块地址)
的计算方法是:先用柱面号乘以每个柱面的扇区总数,再加上磁头号乘以每个磁道的扇区数,最后加上扇区号减1(因为扇区号是从1开始的)。 -
公式就是:LBA = 柱面号 × (磁头数 × 每磁道扇区数) + 磁头号 × 每磁道扇区数 + (扇区号 - 1)
-
这里要注意,扇区号是从1开始的,而LBA是从0开始算的。
-
柱面和磁头的编号都是从
0
开始的。 -
磁盘会自动保存这些参数,系统启动时会去读取这些信息。
LBA 转成CHS:
柱面号 C
= LBA 除以(磁头数 × 每磁道扇区数),这里的乘积就是一个柱面上的扇区总数。磁头号 H
= (LBA 除以 每磁道扇区数 的余数)再除以 每磁道扇区数,结果取整。扇区号 S
= LBA 除以 每磁道扇区数 的余数,再加 1(因为扇区号从1开始)。- 这里的“除以”是向下取整的除法。
- 所以从现在开始,对于磁盘的使用者来说,根本不用管
CHS
地址,直接用LBA
就行了,磁盘内部会自动帮你转换。 - 换句话说,现在的磁盘就像一个扇区为元素的一维数组,而每个扇区的“
下标
”就是它的LBA
地址。操作系统访问磁盘时,只需要用一个数字就能找到对应的扇区,非常方便。
二,分区,inode,块
2-1 块
“块”(block)是磁盘上用于存储数据的最小单位,就像写字用的格子一样。
-
硬盘是一种典型的
块设备(block device)
。在操作系统访问硬盘时,并不会逐个扇区(sector)
地进行读写操作——这种方式效率较低。相反,系统通常以块(block)
为单位进行批量读取,即一次性连续读取多个扇区的数据。 -
每个硬盘分区在格式化时都会被划分为若干个逻辑块,每个块的大小在格式化时指定,之后不可更改。最常见的块大小为
4KB
,对应于 8 个扇区(每个扇区通常为 512 字节)。
块是文件系统进行数据读写的最小单位,也是文件系统分配磁盘空间的基本单元
。
-
实际上,磁盘可以类比为一个三维数组(柱面、磁头、扇区),但为了简化访问逻辑,现代操作系统将其视作一个线性的一维数组,每个元素对应一个
扇区(Sector)
,下标即为LBA(Logical Block Address)
地址。 -
每个扇区都对应一个唯一的
LBA地址
,而多个扇区(通常为8个)组成一个块(Block)
,即文件系统的数据读写单位。 -
给定某个扇区的
LBA
,可通过 块号 = LBA ÷ 8 向下取整计算其所属块编号。 -
反过来,若已知
块号及块内偏移 n
(第几个扇区),则可以通过 LBA = 块号 × 8 + n 计算对应扇区的LBA
地址。
2-2 分区
-
磁盘可以被划分为
多个分区(partition)
,以Windows系统为例,一块物理硬盘可能被划分为多个逻辑驱动器,如C盘、D盘、E盘,这些逻辑驱动器实际上就是对应的不同分区。分区本质上是对硬盘进行的逻辑划分和格式化
,以便操作系统能够更好地管理和使用磁盘空间。 -
而在Linux系统中,所有设备均以
文件的形式
存在于/dev
目录下。磁盘的分区在Linux
中通常以设备文件的形式体现,例如/dev/sda1
、/dev/sda2
等,分别对应物理硬盘/dev/sda
的不同分区。Linux通过分区表(如MBR或GPT)来管理分区信息,操作系统根据分区表识别和挂载各个分区,实现磁盘的逻辑划分和管理。 -
柱面
是划分分区时常用的物理参考单位。我们通过指定每个分区
的起始柱面和结束柱面来完成分区。这样就好像把硬盘上的柱面按顺序排开,铺成一个大平面,方便直观地表示各个分区的位置和大小。但是扇区才是分区的基本单位 -
柱面
的大小是固定的,每个柱面上的扇区数也是一致的。因此,只要知道每个分区的起始柱面号和结束柱面号,以及每个柱面包含多少扇区,就能很清楚地计算出该分区的大小,也能明确该分区对应的LBA地址范围
。
2-3 inode
之前我们提到过,文件 = 数据 + 属性。当我们使用ls -l
命令查看文件时,除了文件名,还能看到文件的元数据(属性),比如权限、所有者、大小和修改时间等信息。
每行包含:文件权限
(读、写、执行权限),链接数
(有多少个目录项指向这个inode),拥有者和用户组
,文件大小
,文件创建、修改、访问时间
,文件类型
(普通文件、目录、链接等),
-
ls -l
读取的是文件的信息, -
除了通过
ls -l
查看文件信息外,我们还可以使用stat
命令来获取文件的更多详细元数据。
我们来想个问题:文件的数据都放在“块”
里,那文件的各种信息,比如谁创建的、什么时候创建的、文件多大, 这些东西得放哪里呢,这些文件的“身份证明”和属性信息,就是存在叫做 inode
(中文叫“索引节点”)的地方。
-
每⼀个
⽂件
都有对应的inode
,⾥⾯包含了与该⽂件有关的⼀些信息。为了能解释清楚inode
,我们需要是深⼊了解⼀下⽂件系统
。 -
在 Linux 里,文件的属性和内容是分开存着的。
-
文件的属性信息都存在一个叫
inode
的地方。每个文件对应一个inode
,里面有个唯一的编号,叫做inode
号。
inode在linux系统中的源代码:
#define EXT2_N_BLOCKS 15struct ext2_inode {__le16 i_mode; /* 文件类型和权限 */__le16 i_uid; /* 所有者用户ID */__le32 i_size; /* 文件大小(字节) */__le32 i_atime; /* 最后访问时间 */__le32 i_ctime; /* 创建时间 */__le32 i_mtime; /* 最后修改时间 */__le32 i_dtime; /* 删除时间 */__le16 i_gid; /* 所属组ID */__le16 i_links_count; /* 链接数 */__le32 i_blocks; /* 文件占用的块数 */__le32 i_flags; /* 文件标志 */__le32 i_block[EXT2_N_BLOCKS]; /* 数据块指针数组 */// 省略其他字段...
};
注意:
- 文件名本身其实不保存在
inode
里面。 - inode 的大小一般是
128 字节
或256 字节
,我们这边统一按照128 字节
来讲。 - 不管文件内容有多大,文件的属性大小都是一样的,因为 inode 的结构是固定的。
本文用于文件系统的硬件学习,如果要学习软件请阅读Linux系统:Ext系列文件系统(软件篇)