3、硬盘分区与格式化:MBR与GPT分区表、主分区与扩展分区、文件系统格式化原理、分区对齐对性能的影响
3.1 MBR与GPT分区表——老规矩与新标准
说到硬盘分区,第一个绕不开的就是分区表。我刚开始做DVR那会儿,用的全是MBR。那时候硬盘容量普遍在500GB到1TB之间,MBR完全够用。但后来监控项目越做越大,单盘容量飙到4TB、8TB甚至16TB,MBR就开始力不从心了。
MBR(主引导记录),说白了就是硬盘的第一个扇区(LBA 0)。它里面存了两样东西:一段引导代码和分区表。分区表只有64字节,每条分区记录占16字节,所以最多只能有4个主分区。你想想看,4个分区哪够用?所以后来才有了扩展分区的概念——把其中一个主分区变成“容器”,在里面再切逻辑分区。
MBR还有一个硬伤:它用32位逻辑块地址(LBA)来寻址。每个扇区512字节的话,最大只能管理2TB的硬盘。超过2TB的部分,系统根本认不出来。我在一个老项目里就踩过这个坑——客户买了块4TB硬盘,插上去只显示2TB,查了半天才发现是MBR的限制。
GPT(GUID分区表) 就是来解决问题的。它用64位LBA寻址,理论上支持高达9.4ZB的硬盘容量。而且GPT没有主分区数量限制,Windows下最多支持128个分区,Linux下几乎没有限制。GPT还在硬盘头和尾各存了一份分区表备份,万一主分区表损坏了,还能从备份恢复——这个设计我特别喜欢,做嵌入式系统时可靠性太重要了。
我个人习惯是:所有新项目一律用GPT。除非是兼容老旧的BIOS启动设备,否则没必要再用MBR。UEFI+GPT已经是标配了。
| 特性 | MBR | GPT |
|---|---|---|
| 最大磁盘容量 | 2TB | 9.4ZB |
| 主分区数量 | 4个(含扩展分区) | 无限制(Windows限制128个) |
| 分区表备份 | 无 | 有(头尾各一份) |
| 引导方式 | Legacy BIOS | UEFI |
| 可靠性 | 一般 | 高(CRC校验) |
3.2 主分区与扩展分区——分区布局的学问
在MBR时代,分区布局是个技术活。4个主分区的限制,逼着大家用扩展分区来“曲线救国”。我记得有一次给一个16盘位的NVR做系统,客户要求每个硬盘分3个区:系统区、缓存区、录像区。如果用MBR,每个硬盘只能有4个主分区,刚好够用。但如果某个硬盘需要更多分区,就必须用扩展分区了。
扩展分区 本身不能存数据,它只是一个“容器”。你可以在扩展分区里创建任意多个逻辑分区。逻辑分区的数量没有硬性限制,但实际项目中我一般不超过10个,太多了管理起来也麻烦。
在GPT下,这些限制都不存在了。你可以直接创建任意数量的主分区。所以如果你用的是GPT,根本不需要关心什么扩展分区、逻辑分区——直接全上主分区就行。
- 系统分区:50-100GB,存放操作系统和应用程序
- 缓存分区:硬盘容量的5%-10%,用于录像写入缓冲
- 录像分区:剩余全部空间,用于存储监控录像
3.3 文件系统格式化原理——不只是“格式化”那么简单
很多人觉得格式化就是把硬盘清空,其实没那么简单。格式化分为两种:低级格式化 和 高级格式化。
低级格式化 是硬盘出厂时做的,由硬盘厂商完成。它会划分磁道、扇区,标记坏道。普通用户不需要做低级格式化,而且现在的硬盘也不支持用户级别的低格操作。我曾经见过有人用低级格式化工具折腾SSD,结果把硬盘搞废了——嗯,这里要注意,千万别乱来。
高级格式化 才是我们日常说的“格式化”。它做的事情是:创建文件系统结构,包括超级块、inode表、目录项等。不同的文件系统,格式化后的结构完全不同。
在DVR/NVR项目中,我常用的文件系统有这几种:
- ext4:Linux下最成熟的选择。支持日志、大文件、在线扩容。我大部分项目都用它。
- XFS:适合超大文件和高并发写入。录像文件动辄几十GB,XFS的表现比ext4好一些。
- Btrfs:支持快照和压缩,但稳定性不如ext4。我一般只在实验环境用。
- NTFS:Windows下的标准文件系统。如果NVR跑在Windows上,那就只能用NTFS了。
格式化时还有一个关键参数:块大小(block size)。默认是4KB,但如果你知道你的文件都是大文件(比如录像文件),可以设置成64KB甚至1MB。块越大,大文件的读写性能越好,但会浪费更多空间(内部碎片)。
# 格式化时指定块大小为64KB
mkfs.ext4 -b 65536 /dev/sda1
# 查看格式化后的文件系统信息
tune2fs -l /dev/sda1 | grep -i "block size"
3.4 分区对齐对性能的影响——一个容易被忽视的细节
分区对齐,说白了就是让分区的起始位置正好是物理扇区的整数倍。为什么这个很重要?因为现代硬盘(包括SSD)的物理扇区大小是4KB,而不是传统的512字节。如果分区没有对齐,一个4KB的物理扇区可能被两个逻辑块共享,导致一次写入操作需要读-改-写两次,性能直接腰斩。
我曾经在一个项目中遇到过:同样的硬件,同样的文件系统,有的硬盘写入速度能达到150MB/s,有的只有80MB/s。查了两天才发现是分区没对齐。用fdisk重新分区对齐后,性能立刻恢复正常。
怎么检查分区是否对齐?
# 查看分区起始扇区
fdisk -l /dev/sda
# 如果起始扇区能被8整除(512字节扇区)或能被8整除(4KB扇区),说明对齐了
# 例如:起始扇区为2048,2048 ÷ 8 = 256,对齐了
在Linux下,用parted工具可以确保分区对齐:
# 使用parted创建对齐的分区
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary 0% 100%
parted /dev/sda align-check optimal 1
如果align-check返回optimal,说明分区已经对齐了。
| 分区起始扇区 | 是否对齐(4KB扇区) | 性能影响 |
|---|---|---|
| 63 | ❌ 未对齐 | 性能下降30%-50% |
| 2048 | ✅ 对齐 | 正常性能 |
| 4096 | ✅ 对齐 | 正常性能 |
对于SSD来说,分区对齐更加重要。SSD的擦除块大小通常是512KB或1MB,如果分区没对齐,写入放大效应会更严重,不仅性能下降,还会缩短SSD的寿命。在NVR项目中如果用SSD做缓存盘,分区对齐是必须保证的。
好了,这一章的内容就到这里。分区表的选择、分区的布局、文件系统的格式化、分区对齐——这四个环节环环相扣,任何一个出问题都会影响整个存储系统的性能和可靠性。下一章我会讲文件系统的挂载和自动挂载配置,到时候再聊。
公众号:蓝海资料掘金营,微信deep3321