title: Linux 存储管理实战:从 MBR/GPT 分区基础到 LVM、RAID5 拆除与重构 date: 2026-08-18T10:05:26+08:00 draft: false categories:
- 存储管理 tags:
- MBR
- GPT
- LVM
- RAID5 image: “https://bosh.zz.ac/images/git.jpg" slug: 1787018726670
在 Linux 系统运维中,磁盘存储管理是一项核心基本功。从基础的磁盘分区(MBR/GPT),到高级的动态卷管理(LVM)和磁盘阵列(RAID),理解它们的底层逻辑与操作链路至关重要。
本文将整理自一次真实的 Linux 存储架构排查与重构过程,详细讲解主分区与扩展分区的物理逻辑、多盘拓扑分析,以及如何安全地解构并重构一套复杂的存储环境。
一、 深入理解:MBR 分区体系与 GPT 演进 在进行磁盘分区前,必须弄清磁盘分区表的工作机制。
- 主分区、扩展分区与逻辑分区的关系 主分区(Primary Partition):独立存在的基本分区,可以直接格式化文件系统并挂载使用。
扩展分区(Extended Partition):一种特殊的“主分区容器”。它不能直接格式化或挂载,其唯一作用是作为宿主,划分出多个逻辑分区。
逻辑分区(Logical Partition):在扩展分区内部细分出的分区,可以被正常格式化和使用。
Plaintext 硬盘物理空间 (MBR 分区表) ├── 主分区 1 (sda1) -> 可挂载 ├── 主分区 2 (sda2) -> 可挂载 ├── 主分区 3 (sda3) -> 可挂载 └── 扩展分区 (sda4) -> [容器,不能直接使用] ├── 逻辑分区 1 (sda5) -> 可挂载 └── 逻辑分区 2 (sda6) -> 可挂载
- MBR 分区表的物理限制 为什么会有扩展分区和逻辑分区?这是由于 MBR(Master Boot Record) 的历史设计决定的:
MBR 分区表只保留了 64 字节 的空间用于记录分区信息。
每一个分区条目需要占用 16 字节,因此:
$$\text{最大主分区数} = \frac{64 \text{ Bytes}}{16 \text{ Bytes}} = 4 \text{ 个}$$单块磁盘上最多只能有 4 个主分区(或 3 主分区 + 1 扩展分区)。
独立性:该限制仅针对单块磁盘。若系统挂有 sda、sdb、sdc,则每块盘均拥有独立的 4 个主分区配额。
常见误区 FAQ:能否直接将已创建的“主分区 3”改为“扩展分区”? 答:不能直接修改。主分区与扩展分区的底层数据结构(文件系统 vs EBR 扩展分区表记录)完全不同。必须备份数据后,删除原主分区并重新新建为扩展分区。
- 现代替代方案:GPT 分区表 在 UEFI 启动与大容量存储普及的今天,GPT(GUID Partition Table) 已经全面取代 MBR:
无逻辑分区概念:取消了扩展分区和逻辑分区的区分,所有分区均为独立主分区。
支持 128 个分区:标准配置下单盘默认支持最多 128 个分区。
打破 2TB 限制:完美支持超过 2TB 容量的物理硬盘。
二、 复杂 Linux 存储拓扑结构分析 以下是一台服务器上的真实 lsblk 拓扑输出,展现了一个典型的混合存储架构:
Plaintext
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 300M 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 97.7G 0 part /
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 9G 0 part
│ └─vg_store-lv_date 253:0 0 25G 0 lvm /data
└─sdb2 8:18 0 1023M 0 part [SWAP]
sdc 8:32 0 10G 0 disk
└─sdc1 8:33 0 9G 0 part
└─vg_store-lv_date 253:0 0 25G 0 lvm /data
sdd 8:48 0 10G 0 disk
└─sdd1 8:49 0 9G 0 part
└─vg_store-lv_date 253:0 0 25G 0 lvm /data
sde 8:64 0 15G 0 disk
└─sde1 8:65 0 15G 0 part
└─md0 9:0 0 30G 0 raid5 /raid_storage
sdf 8:80 0 15G 0 disk
└─sdf1 8:81 0 15G 0 part
└─md0 9:0 0 30G 0 raid5 /raid_storage
sdg 8:96 0 15G 0 disk
└─sdg1 8:97 0 15G 0 part
└─md0 9:0 0 30G 0 raid5 /raid_storage
sdh 8:112 0 15G 0 raid
└─sdh1 8:113 0 15G 0 part
└─md0 9:0 0 30G 0 raid5 /raid_storage
架构拆解与技术点
系统根盘 (sda):采用了传统的直接物理分区,放置 /boot、SWAP 和 / 根目录,与业务数据隔离。
动态扩容卷 LVM (sdb, sdc, sdd):
将 sdb1、sdc1、sdd1(各 9G)作为物理卷(PV),聚合为卷组 vg_store。
划分出 25G 的逻辑卷 lv_date 挂载至 /data。支持在线动态扩容。
sdb2 额外划出了 1G 空间补充为交换分区。
冗余阵列 RAID 5 (sde, sdf, sdg, sdh):
4 块 15G 磁盘构建软 RAID5 设备 /dev/md0,挂载于 /raid_storage。
RAID5 的可用容量计算公式为:
$$\text{可用容量} = (N - 1) \times \text{单盘容量}$$此处 4 盘组成阵列,实际展示 30G,说明其中 3 块盘($2 \times 15\text{G} = 30\text{G}$)构建了有效阵列,第 4 块充当了热备盘(Hot Spare)或限制了总体分配。
三、 实战:安全拆除与重构存储环境 要清空 sdb 到 sdh 上的阵列与分区并重新划分,绝不能直接使用 fdisk 强制删除分区。必须遵循 “自上而下”(从逻辑层到底层物理设备) 的顺序解构,否则会因设备忙(Device Busy)报错。
- 拆除步骤(严格按顺序执行) 第一步:取消挂载与禁用 SWAP
Bash
1. 卸载文件系统
sudo umount /data sudo umount /raid_storage
2. 停用 sdb2 上的 SWAP 交换区
sudo swapoff /dev/sdb2 第二步:层级清理 LVM
Bash
按 LV -> VG -> PV 顺序卸载
sudo lvremove -f /dev/vg_store/lv_date sudo vgremove -f vg_store sudo pvremove -f /dev/sdb1 /dev/sdc1 /dev/sdd1 第三步:停止并清空 RAID 阵列
Bash
1. 停止软 RAID 设备
sudo mdadm –stop /dev/md0
2. 清除元数据超级块(Superblock)
sudo mdadm –zero-superblock /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 第四步:擦除磁盘签名并重置分区表
Bash
1. 清空剩余的磁盘元数据特征
sudo wipefs -a /dev/sd[b-h]
2. 批量将 sdb - sdh 刷新为全新的 GPT 分区表
for dev in /dev/sd[b-h]; do sudo parted -s $dev mklabel gpt done 执行完成后,再次运行 lsblk,硬盘将恢复为干净无依赖的裸盘状态。
- 重新分区与挂载示例 示例 A:将单盘划分为常规 ext4 分区 Bash
在 sdb 上建立 GPT 分区并格式化
sudo parted -s /dev/sdb mkpart primary ext4 0% 100% sudo mkfs.ext4 /dev/sdb1
挂载使用
sudo mkdir -p /mnt/storage sudo mount /dev/sdb1 /mnt/storage 示例 B:重新构建全新的 LVM 存储池 Bash
1. 将 sdb, sdc, sdd 创建为 PV
sudo pvcreate /dev/sdb /dev/sdc /dev/sdd
2. 创建新卷组 vg_data 并分配逻辑卷
sudo vgcreate vg_data /dev/sdb /dev/sdc /dev/sdd sudo lvcreate -L 25G -n lv_storage vg_data
3. 格式化为 XFS 并挂载
sudo mkfs.xfs /dev/vg_data/lv_storage sudo mkdir -p /data_new sudo mount /dev/vg_data/lv_storage /data_new 四、 运维注意事项:/etc/fstab 与 ISO 挂载小技巧 更新分区表挂载:在对系统进行重构后,务必检查并更新 /etc/fstab。删除已失效的 LVM/RAID/SWAP 挂载项,新增设备建议使用 blkid 获得的 UUID 进行配置,避免因设备名变动导致开机进入 Emergency Mode。
ISO 镜像挂载参数优化:在 CentOS/RHEL 环境挂载镜像作为本地 Yum 源时:
现代内核 mount 会自动识别并绑定 loop 设备,因此挂载参数中可以省略 loop 参数。
建议配合 nofail 参数防止镜像文件丢失导致系统无法启动: Plaintext /root/CentOS-7-x86_64-Everything-2009.iso /mnt/cdrepo iso9660 defaults,nofail 0 0