文件系统入门到精通:理解与优化 Linux 文件存储
个人主页:chian-ocean
文章专栏-Linux
前言:
Linux 文件系统是 Linux 内核管理数据存储和访问的核心部分,它提供了一种结构化方式来组织、存储和检索数据。Linux 支持多种文件系统类型,如 ext4、XFS、Btrfs、FAT32、NTFS 等。
机械磁盘(HHD)
HHD构成
机械磁盘(硬盘)由以下几个主要部分组成:
- 盘片:存储数据的圆形盘片,表面涂有磁性材料,数据通过磁头读取或写入。
- 磁头:用于读写数据的部件,悬挂在磁头臂上,移动时在盘片表面上方“飞”行。
- 磁头臂:支撑磁头的臂,控制磁头在盘片表面上定位。
- 主轴电机:驱动盘片旋转的电机,通常以7200转/分钟或5400转/分钟的速度旋转。
- 控制电路:硬盘的控制器,处理数据读写请求并控制磁头、盘片和电机的操作。
- 外壳:硬盘的金属外壳,保护内部组件免受外界损害。
盘片构造
左侧 (a) 单个盘片的结构:
- 主轴(中心蓝色部分):用于驱动盘片旋转。
- 磁道(同心圆):数据存储在盘片表面上的磁道中,每个磁道由多个扇区组成。
- 间隙:磁道之间存在间隙,以避免数据干扰。
右侧 (b) 多个盘片的结构:
- 多个盘片(盘片 0、盘片 1、盘片 2):硬盘通常由多个盘片叠加在主轴上,每个盘片的两面都可以存储数据。
- 柱面(Cylinder):在所有盘片相同磁道编号的位置组成的垂直数据存储单元,称为柱面。
- 主轴:所有盘片固定在主轴上,并由主轴电机驱动同步旋转。
磁盘IO本质(通过磁头)
磁头和盘片之间存在一定间隙(大约0.1微米)。主要通过磁场变化进行IO:
-
电流通过线圈:在写操作中,磁头内部有一个非常细小的线圈,当电流通过线圈时,会产生一个强大的磁场。
-
磁场作用:这个磁场作用于盘片表面的磁性颗粒,磁头会控制磁场的方向,从而改变磁性颗粒的极性。每个磁性颗粒在盘片表面都可以被改变磁极,代表“0”或“1”数据。
- 磁场方向的变化会将磁性颗粒的方向改变,形成不同的磁性状态。这种状态的变化表示了存储的数据(通常是二进制数据,即“0”和“1”)。
扇区写入:这些磁性颗粒的排列方式在物理上存储数据,每个磁道上的一段数据通常由多个扇区组成。磁头的动作会将每个扇区的磁性状态按照预定的数据模式进行写入。
磁盘访问时间影响
磁盘以扇区为单位进行IO:对扇区的访问有以下三个主要部分
-
寻道时间(Seek time): 机械硬盘使用一个机械臂,靠近盘片表面读取或写入数据。这个过程首先需要将磁头移动到正确的磁道位置上。这一步骤会产生一定的延迟时间。磁头在磁盘上来回移动,以找到存储数据的正确位置。
-
旋转延迟(Rotational Latency): 硬盘盘片以一定的速度旋转,通常是5400 RPM(转/分钟)或7200 RPM等。由于磁盘的旋转,所需访问的数据可能还需要等待一段时间,直到目标数据的磁道恰好旋转到磁头下面。这段等待的时间称为旋转延迟(Rotational Latency),具体时间取决于磁盘的转速。转速越快,旋转延迟越短。
-
数据传输(Data Transfer): 一旦磁头定位到正确的磁道,并且目标数据位于磁头下方,硬盘就可以开始读取或写入数据。此时的数据传输速度主要取决于硬盘的旋转速度、磁头读取速度和硬盘的缓存等因素。数据传输的速度通常是一个持续的过程,直到整个操作完成。
磁盘寻址方式
寻址在计算机系统中有着重要的意义,它不仅是硬盘、内存等存储设备正常运作的基础,还涉及到数据的高效存取、资源的合理分配、系统的兼容性等多个方面。下面介绍两种常见的寻址方式:
CHS寻址
CHS寻址(Cylinders, Heads, Sectors)是一种早期的硬盘数据存取方式,基于硬盘的物理结构来定位存储在硬盘上的数据。CHS寻址方式是通过三个参数来确定数据的存储位置:
- C (Cylinder - 磁道柱):硬盘的每个盘片上有多个同心圆形的磁道,所有盘片上对应位置的磁道共同形成一个磁道柱。磁道柱的编号从0开始,指示硬盘上的磁道位置。每个磁道柱都包含硬盘所有磁头对同一磁道的访问。
- H (Head - 磁头):硬盘通常由多个盘片组成,每个盘片有一个磁头用于读取和写入数据。磁头的编号从0开始,用来表示硬盘的哪一个磁头正在访问数据。硬盘的每个盘面通常都有一个磁头。
- S (Sector - 扇区):每个磁道被划分为若干个扇区,每个扇区是硬盘存储数据的最小单位。每个扇区的大小通常为512字节。扇区从0开始编号,表示磁道上的具体存储位置。
CHS寻址方式的工作原理:
硬盘使用这三个参数来定位数据的具体位置。**Cylinder(磁道柱)**指的是在硬盘上垂直方向上的数据位置,**Head(磁头)指定使用哪个磁头访问数据,而Sector(扇区)**则确定磁道上的具体存储位置。通过这三个信息,硬盘可以定位到数据所在的确切位置。
LBA寻址方式(Logical Block Addressing,逻辑块寻址)是一种现代硬盘(HDD)、固态硬盘(SSD)和其他存储设备常用的寻址方式。它通过将硬盘视为一个连续的逻辑地址空间,每个存储单元(通常是一个扇区)都有一个唯一的编号,而不依赖于硬盘的物理结构(如磁道、磁头和扇区)。
LBA的基本概念
在LBA寻址方式中,硬盘的存储单元(通常是一个扇区)被赋予一个连续的逻辑地址。每个扇区通常为512字节或4KB。LBA采用单一的逻辑块号来标识硬盘中的每个扇区,而不再依赖于物理位置(如磁道、磁头、扇区)。
LBA如何工作
- 线性地址空间:LBA将硬盘中的所有扇区视为一个大的线性数组,每个扇区有一个唯一的编号,从0开始依次递增。每个LBA地址指向硬盘中的某个具体存储单元。
- 简化寻址:操作系统通过LBA直接访问硬盘上的逻辑块。硬盘的控制器负责将LBA地址转换为具体的物理地址(如磁道、磁头、扇区)。这种方式隐藏了硬盘的物理结构,简化了数据的存取。
- LBA地址映射:当操作系统请求访问某个LBA地址时,硬盘内部的控制器会将该LBA地址转换为实际的物理磁道、磁头和扇区组合。这是通过硬盘的内部映射机制完成的。
LBA与CHS的区别
特性 | LBA寻址 | CHS寻址 |
---|---|---|
寻址方式 | 使用逻辑块编号,硬盘看作一个连续的存储区 | 依赖于磁道、磁头、扇区的物理结构 |
数据存储方式 | 线性寻址 | 依赖于硬盘的物理结构 |
访问效率 | 高,适用于大容量存储 | 较低,难以应对大容量硬盘 |
适用硬盘容量 | 支持TB级及以上 | 适用于较小的硬盘容量 |
灵活性 | 非常灵活,支持不同硬盘架构 | 受硬盘物理结构限制 |
文件系统(ext2为主)
Ext文件系统(Extended File System)是Linux操作系统中广泛使用的一系列文件系统的统称。Ext系列文件系统起源于1992年,经过多个版本的更新与改进,目前主要包括 Ext2、Ext3 和 Ext4。
fdisk -l #查看磁盘信息
磁盘信息
- 磁盘设备:
/dev/vda
,这是您系统上的虚拟磁盘设备,通常在虚拟化环境中使用。 - 磁盘大小:
42.9 GB
,这表示磁盘的总容量为 42.9 GB(42949672960 字节)。 - 磁盘扇区数:
83886080 sectors
,磁盘的扇区总数。每个扇区的大小为 512 字节,因此总磁盘容量为 42.9 GB。
单位
- 单位:
sectors of 1 * 512 = 512 bytes
,每个扇区大小为 512 字节,磁盘空间是按扇区来计算的。
扇区大小
- Sector size (logical/physical):
512 bytes / 512 bytes
,表示每个逻辑和物理扇区的大小都是 512 字节。
I/O 大小
- I/O size (minimum/optimal):
512 bytes / 512 bytes
,最小和最优的 I/O 大小也是 512 字节。
磁盘标签类型
- Disk label type:
dos
,表示磁盘使用的是 DOS 分区表(MBR)。这种分区类型是传统的分区方案,最多支持 4 个主分区或 3 个主分区加一个扩展分区。
磁盘标识符
- Disk identifier:
0x000148e1
,这是磁盘的唯一标识符,用于区分不同的磁盘。
磁盘分区
磁盘与分区
- 磁盘(Disk):这是物理存储设备,图中展示了一个典型的磁盘,它被划分为多个分区(Partition 1、Partition 2、Partition 3、Partition 4)。
- 每个分区被格式化为一个 Ext2 文件系统(如 Partition 1、Partition 2 等)。
文件系统和块组
- Ext2 文件系统:每个分区被格式化为 Ext2 文件系统。Ext2 文件系统通过 块组(Block Group) 来管理磁盘上的存储空间。每个分区被划分成若干个块组(Block Group 0、Block Group 1、…Block Group N)。每个块组都包含文件系统的一部分数据。
块组(Block Group)
每个块组包括以下几个重要部分:
- 超级块(Superblock):超级块包含文件系统的元数据,例如块组的数量、块大小、总文件系统大小等。
- 组描述符表(Group Descriptor Table,GDT):记录每个块组的具体信息,如 inode 位图、数据块位图、inode 表的位置等。
- 块位图(Block Bitmap):记录块组内哪些数据块是空闲的,哪些已经被占用。
- inode 位图(Inode Bitmap):记录块组内哪些 inode 是空闲的,哪些已经被占用。
- inode 表(Inode Table):存储文件和目录的元数据,即 inode。每个文件或目录都有一个对应的 inode,包含文件的大小、权限、时间戳、指向数据块的指针等信息。
- 数据块(Data Blocks):存储文件的实际数据。每个块组都有数据块,用于存储文件的内容。
inode 表
- inode 是一个关键的数据结构,描述文件的元数据,包括文件的类型、权限、大小、所有者(UID/GID)等信息。它还包含指向数据块的指针。
- inode 表 中列出了每个文件或目录的 inode 号码、文件类型、权限、链接计数、文件大小、用户和组 ID(UID/GID)等信息。
启动块(Boot Block/Sector)
- 启动块是文件系统的第一部分,它的大小为 1KB,并包含操作系统启动所需的信息。启动块仅在系统引导时使用,一旦系统启动,Ext2 文件系统的管理才开始。
Inode和Data Block
inode 和 DataBlock 是文件系统中的两个核心概念,它们分别承担不同的职责,共同帮助操作系统管理文件的存储和访问。
文件 = 属性 + 数据(内容),属性就是 储存的inode
里面,数据储存在Data Block
中,他们之间存在某种映射关系建立联系。
inode
中大致包含
文件类型:文件是普通文件、目录、符号链接等。
文件权限:包括文件的读、写、执行权限。
文件大小:文件的大小(以字节为单位)。
创建时间、修改时间和访问时间:文件的时间戳。
硬链接数:指向该 inode 的硬链接数量。
文件的用户 ID 和组 ID:文件的所有者和所属的用户组。
指向数据块的指针:这些指针指向存储文件内容的数据块。
......
inode 和 datablock 的映射方式:
- 直接指针(Direct Pointers):inode 中包含多个直接指针,直接指向文件的数据块。如果文件大小较小,inode 中的直接指针足够指向所有数据块。
- 例如,如果一个文件有 5KB 的数据,inode 中可能包含 1 或 2 个直接指针,每个指针指向 1KB 或 2KB 大小的数据块。
- 间接指针(Indirect Pointers):对于较大的文件,inode 中的直接指针无法容纳所有的数据块,因此使用间接指针来支持更大的文件。
- 一级间接指针(Single Indirect Pointer):inode 中有一个指向一个指针块的指针。指针块本身存储了多个指向数据块的指针。因此,一级间接指针可以指向更多的数据块。
- 二级间接指针(Double Indirect Pointer):如果文件的数据块更加庞大,inode 中还会包含指向二级指针块的指针。二级指针块本身包含指向一级指针块的指针,而一级指针块包含指向数据块的指针。
- 三级间接指针(Triple Indirect Pointer):对于非常大的文件,inode 中可能包含三级间接指针,依此类推。
理解文件和目录
文件:文件 = 属性 + 数据
- 属性储存在inode里 。
- 数据存储在数据块中。
目录的定义:
- 目录也是一种文件,拥有自己的 inode(索引节点),包含文件的内容和属性。
- 文件的组成是“内容 + 属性”,而目录本身也有内容和属性。
dentry缓存:
- 目录会有自己的 inode 编号,并且存在 dentry 缓存,这主要用于提高目录查找效率。
目录中是否有内容:
- 目录本身确实有内容,内容是与该目录相关的文件名及文件的 inode 映射关系。目录内容存储的是文件名与文件 inode 编号的关联。
软硬连接
软连接(Symbolic Link)和硬连接(Hard Link)是文件系统中的两种连接方式,它们各自有不同的特点和应用场景:
1软连接(Symbolic Link, symlink)**:
-
软连接类似于快捷方式,它是一个指向另一个文件路径的文件。
-
特点:
- 软连接有自己的 inode,指向原文件的路径,而不是原文件的数据块。
- 如果原文件被删除或移动,软连接会失效(成为“悬挂链接”或“死链接”),因为它依赖于文件路径。
- 可以跨文件系统创建软连接。
- 支持链接目录。
-
创建方法:
ln -s <目标文件> <软连接文件>
ln -s file link #建立软链接
硬连接(Hard Link):
- 硬连接是指两个或多个文件名指向同一个 inode 号码,即它们都指向同一块数据存储区域。
- 特点:
- 硬连接和原文件共享同一个 inode,数据内容是相同的,硬连接的文件内容修改会影响其他硬连接。
- 删除一个硬连接不会影响其他硬连接,只要有一个硬连接存在,文件内容就不会被删除。
- 不能跨文件系统创建硬连接。
- 不能为目录创建硬连接(除非超级用户使用特定操作)。
- 创建方法
ln <目标文件> <硬连接文件>
ln file hard_link
引用计数变为了2 ,增加了一个硬链接。
- 创建目录,为什么默认的引用计数为 2
对于目录而言,硬链接计数的含义略有不同。每个目录至少会有 两个硬链接(即硬链接计数为 2),这是由以下两个部分组成的:
- 一个指向该目录本身的硬链接,即目录的正常名字。
- 一个指向该目录的父目录的硬链接,每个目录项
.
和..
都是一个硬链接。
观察dir1的引用计数
目录 dir1
:
-
目录
dir1
的硬链接数为 3。这表示该目录有 3 个硬链接:- 一个链接指向
dir1
本身。 - 另一个链接指向该目录的父目录
..
。
(即硬链接计数为 2),这是由以下两个部分组成的:
- 一个链接指向
-
一个指向该目录本身的硬链接,即目录的正常名字。
-
一个指向该目录的父目录的硬链接,每个目录项
.
和..
都是一个硬链接。