一、存储分区概述
1.1 什么是存储分区
存储分区,说白了就是把一块物理硬盘,逻辑上切成几个独立的小空间。
我刚开始接触存储系统时,总觉得分区是个很玄乎的概念。后来亲手做过一次磁盘管理才明白——分区就是给硬盘画格子。每个格子有自己的起始地址和结束地址,互不干扰。
举个例子:一块 500GB 的硬盘,你可以把它分成:
- C 盘:100GB,装操作系统
- D 盘:200GB,装应用程序
- E 盘:200GB,存个人数据
每个分区在操作系统看来,就像一块独立的硬盘。但实际上,它们共享同一块物理介质。
核心概念:分区表(Partition Table)记录了每个分区的起始扇区号、结束扇区号、分区类型等信息。MBR 和 GPT 是两种主流的分区表格式。
1.2 分区的作用与价值
你可能会问:为什么不直接用一整块硬盘?非要搞分区这么麻烦?
嗯,这里有几个关键原因:
- 数据隔离:系统崩溃了,重装 C 盘就行,D 盘的数据还在。我在项目中遇到过客户把系统盘和数据盘混在一起,结果一次蓝屏,所有业务数据全丢了……那叫一个惨。
- 多系统共存:一台机器装 Windows 和 Linux,各占一个分区,互不打架。
- 性能优化:不同分区可以用不同的文件系统、块大小、挂载参数。比如日志分区用 ext4,数据库分区用 XFS。
- 容量管理:限制某个分区的最大使用量,防止某个进程把磁盘写爆。
我的经验:做存储系统设计时,我建议至少分三个区:系统区、数据区、日志区。日志区单独出来,方便排查问题。我曾经因为日志和系统混在一起,排查 I/O 瓶颈时花了整整两天……
1.3 分区在操作系统中的位置
分区管理位于操作系统存储栈的哪一层?我画了一张图,你看完就明白了:
从这张图可以清楚看到:分区管理层位于文件系统之下、块设备层之上。它负责把物理磁盘的 LBA(逻辑块地址)映射到各个分区的逻辑地址空间。
举个例子:
- 文件系统说:「我要读第 1000 号逻辑块」
- 分区管理层查表:「哦,这个块属于分区 2,物理地址是 LBA 50000」
- 然后交给块设备层去执行
注意:分区管理层不负责数据校验!它只做地址映射。数据校验是文件系统或上层应用的事。我曾经见过有人把校验逻辑写在分区层,结果性能直接腰斩……千万别这么干。
1.4 分区地址映射的基本原理
每个分区在创建时,分区表会记录它的起始 LBA 和结束 LBA。操作系统通过一个简单的偏移计算来完成地址转换:
// 分区地址映射伪代码
// 输入:分区号 part_id,分区内逻辑块号 block_offset
// 输出:物理 LBA
uint64_t partition_to_lba(int part_id, uint64_t block_offset) {
// 从分区表获取该分区的起始 LBA
uint64_t start_lba = partition_table[part_id].start_lba;
// 地址映射:物理地址 = 分区起始地址 + 偏移量
uint64_t physical_lba = start_lba + block_offset;
// 越界检查
if (physical_lba > partition_table[part_id].end_lba) {
// 抛出异常或返回错误
return ERROR_OUT_OF_BOUNDS;
}
return physical_lba;
}
这个逻辑看起来简单,但实际项目中坑不少。我记得有一次排查一个存储系统的 bug,发现某个分区读写总是报错。查了半天,原来是分区表里的 start_lba 被意外修改了——地址映射全乱套了。
避坑指南:分区表一定要做 CRC 校验!我曾经因为分区表被静默损坏,导致整个存储系统不可用。从那以后,我设计的系统都会在分区表末尾加一个 4 字节的 CRC32 校验码。
1.5 分区与文件系统的关系
很多人分不清分区和文件系统的区别。我打个比方:
- 分区 = 一个房间(划定空间范围)
- 文件系统 = 房间里的书架和抽屉(组织数据的方式)
一个分区必须先格式化(创建文件系统),才能存放文件。没有文件系统的分区,就是个空房间,啥也放不了。
| 特性 | 分区 | 文件系统 |
|---|---|---|
| 职责 | 地址映射、空间划分 | 文件组织、数据管理 |
| 粒度 | 扇区/块级别 | 文件/目录级别 |
| 校验 | 通常不做(分区表除外) | 可选(如 ext4 的 journal) |
| 典型操作 | fdisk、parted、gdisk | mkfs.ext4、mount、umount |
一句话总结:分区解决的是「空间怎么分」的问题,文件系统解决的是「数据怎么存」的问题。两者配合,才能构成一个完整的存储体系。
好了,这一章就讲到这里。分区是存储系统的地基,地基不稳,上层再好的设计也白搭。下一章我们会深入分区表的内部结构,看看 MBR 和 GPT 到底有什么区别。
可可精品资料库