☰
从MBR/GPT到LVM:Linux磁盘扩容与分区实操指南
2026/10/14 4:02:37 网站建设 项目流程

最近帮一台测试服务器做存储扩容,正好把传统磁盘分区的老流程和 LVM 逻辑卷的扩容路径完整走了一遍。从新磁盘接入系统开始,到 MBR/GPT 分区、格式化、挂载,再到 LVM 的 PV/VG/LV 创建,以及 VG 剩不剩空间两种扩容思路,整个过程踩了几个不算深但很典型的坑。这类操作在 Linux 磁盘管理里属于高频场景,生产环境也经常用到,但很多朋友平时只在虚拟机里点几个按钮,真到了命令行环境反而容易卡壳。这篇我就按实际操作顺序,把这些流程完整梳理一遍。

1. 新磁盘接入后必须想清楚的第一件事:MBR 还是 GPT

1.1 为什么分区表格式会直接影响后续扩容方案

新磁盘接上服务器后,系统里通常会出现类似/dev/sdb、/dev/nvme0n1这样的设备名,但如果直接格式化,你会发现大多数工具都会先问一个问题:用 MBR 还是 GPT。很多人对这一步不太在意,随手就选了默认值,等到后面磁盘容量不够想扩容时才发现麻烦。

MBR 全称 Master Boot Record,它只有 512 字节的引导扇区,其中分区表只占 64 字节,每条分区记录固定 16 字节,所以最多只能记录 4 个主分区。想分更多分区就得把其中一个主分区改成扩展分区,再在扩展分区里划分逻辑分区。MBR 对单个分区的容量限制是 2TB,超过 2TB 的磁盘或者需要超过 4 个主分区的场景,MBR 就完全不够用了。

GPT 全称 GUID Partition Table,它使用全局唯一标识符来管理分区,理论上支持 128 个分区,单个分区容量也可以做到很大。现代操作系统对 GPT 的支持已经很完善,UEFI 引导环境基本也都要求 GPT 分区表。所以我的建议非常直接:如果磁盘容量大于 2TB,或者你无法确定以后会不会超过这个值,直接选 GPT;只有老旧的 BIOS 引导环境或某些特殊兼容性场景,才需要考虑 MBR。

1.2 分区表选择对后续 LVM 扩容的影响

分区表格式不仅影响“能分几个区”,还影响后续的扩容操作路径。使用 MBR 时,如果你把磁盘的前 2TB 空间都分给了一个分区,那这个分区本身没法再扩大,必须重新分区或者新建分区,扩容成本很高。GPT 虽然没有 2TB 限制,但同样存在“分区连续空间不足”的问题。

更重要的是,无论 MBR 还是 GPT,传统分区一旦建立,分区大小就固定了。要想灵活调整,就必须引入 LVM。LVM 的逻辑卷扩容并不特别关心底层分区是 MBR 还是 GPT,但创建 PV 时最好把整个磁盘或一个大分区直接交给 LVM,这样后续 VG 有剩余空间时扩容最方便。我见过不少朋友在传统分区上直接用mkfs格式化,走了传统文件系统的路,后面想扩却扩不了,只能推倒重来。

这里分享一个我自己的习惯:接到一块新数据盘,如果未来可能扩容,先想清楚它是固定容量用途,还是可能弹性增长。固定容量就传统分区 + 格式化 + 挂载,简单直接;弹性增长就整个磁盘建 PV 进 LVM,后面扩容路径宽得多。这个判断在初始阶段只花一分钟,后面能省非常多事。

1.3 查看磁盘信息与确认设备名

在实际操作之前,先用命令确认新磁盘是否被系统识别。这里我最常用的两个命令是:

lsblk # 或 fdisk -l

lsblk的输出非常直观,会列出所有块设备、大小、挂载点等信息。比如新接入的一块 500G 数据盘,通常显示为/dev/sdb,没有任何分区,也没有挂载点。此时确认设备名后,不要急着操作,先检查一下服务器里是否有服务还在往这块盘读写数据,避免误操作。

我也碰到过一种情况:云服务器控制台里加了数据盘,但系统里看不到。这时候通常需要去云平台的控制台执行“在线扩容”或“挂载”操作,或者重启实例让内核重新扫描。物理机的话,可能需要检查 SAS/SATA 背板、HBA 卡驱动之类的硬件层问题。总之,设备名确认这一步直接影响后续所有操作,建议用lsblk和fdisk -l双重验证,避免搞错磁盘。

2. 传统分区从 fdisk 到挂载的完整流程与细节

2.1 用 parted 还是 fdisk:两种分区工具的选型对比

Linux 下传统分区工具有很多,老牌的fdisk和后来的parted是最常用的两个。我个人的习惯是:

  • 2TB 以下磁盘,用fdisk操作,交互式界面大家比较熟悉
  • 2TB 以上磁盘,用parted操作,因为parted原生支持 GPT,操作更直接

很多教程一上来就用fdisk /dev/sdb然后按n、p、w,这套流程确实经典,但也需要注意它默认创建的是 MBR 分区表。你想做 GPT 时,需要先用fdisk里的g命令,或者在parted里执行mklabel gpt。这块如果没注意,后面分区表格式可能不符合预期。

parted的命令行风格更适合脚本化,比如:

parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 1MiB 100%

这里把起始位置设为1MiB,是为了给分区对齐留出余量,避免性能损失。很多初学者直接0%开始,也不算错,但现代磁盘 4K 扇区对齐的需求下,从 1MiB 开始更稳妥。

2.2 fdisk 交互式分区的完整指令序列

以一块 200G 的新盘/dev/sdb为例,假设我们要做一个传统分区并格式化为 ext4。整个操作如下:

fdisk /dev/sdb

进入交互界面后依次输入:

n # 新建分区 p # 主分区 1 # 分区号 回车 # 默认起始扇区 回车 # 默认结束扇区(使用全部空间) w # 保存并退出

保存后系统会自动刷新分区表。然后用lsblk或fdisk -l验证,能看到新的分区/dev/sdb1,大小为 200G。

这里有一个很重要的细节:w只是写入了分区表,内核不一定立刻识别新分区。部分系统上可能需要执行:

partprobe /dev/sdb

partprobe的作用是让内核重新读取分区表,有些场合不执行直接格式化也能成功,但偶发会报“找不到设备”之类的错误。在脚本化部署时,我会习惯性地在 fdisk 结束后加上partprobe。

2.3 格式化的文件系统选择与 mkfs 参数

分区建好后,接下来是格式化。Linux 下常见的文件系统有 ext4、xfs、btrfs 等。对于大部分通用场景,我的选择是:

  • 存储大量小文件、需要高可靠性:ext4
  • 大文件、大容量、顺序读写为主的场景:xfs
  • 需要快照、压缩等高级特性:btrfs(但生产环境要更谨慎)

格式化命令如下:

mkfs.ext4 /dev/sdb1

如果使用 xfs:

mkfs.xfs /dev/sdb1

格式化时还有个容易忽略的点:mkfs会输出文件系统 UUID 等信息。这个 UUID 在后期挂载和/etc/fstab配置时非常重要。建议把格式化后的 UUID 记下来,或者用blkid /dev/sdb1随时查看。

我还遇到过一种情况:格式化大型磁盘时,默认参数可能不够合适,比如 ext4 的inode数量。对于海量小文件场景,可以加上-i 4096调大 inode 密度,但日常使用默认值足够。核心原则是:格式化前先想清楚文件系统类型和用途,因为改文件系统需要重新格式化,数据需要先备份。

2.4 临时挂载与永久挂载的正确姿势

格式化完成后,手动挂载测试:

mkdir -p /data mount /dev/sdb1 /data df -h

此时/data目录就能用了。但重启以后挂载会消失,所以必须写入/etc/fstab实现永久挂载。这里我强烈建议你使用 UUID,而不是设备名。因为设备名在系统重启后可能变化,比如原来/dev/sdb1变成了/dev/sdc1,导致开机挂载失败。 UUID 是文件系统唯一标识,稳定性高得多。

先在/etc/fstab中追加一行:

UUID=你的UUID号 /data ext4 defaults 0 2

然后验证配置是否正确:

mount -a

如果mount -a没有报错,说明 fstab 写对了。这块有个小坑:xfs 文件系统的 fstab 挂载参数如果用defaults,大多数情况没问题,但某些环境可能需要加上uquota/gquota之类的选项,最好先查文档确认。

3. LVM 到底解决了什么问题:逻辑卷机制拆解

3.1 传统分区扩容之痛:为什么需要 LVM

可以这么说:没有 LVM 之前,Linux 磁盘扩容是非常痛苦的。假设你有一块 100G 数据盘,传统分区方式下格式化了/dev/sdb1并挂载到/data,跑了一段日子后发现空间不够了。这时你有两条路:

  • 重新插一块更大的盘,把数据完整复制过去,再改挂载路径或替换设备
  • 如果磁盘物理容量还有剩余,尝试用resize2fs在线扩容,但前提是分区表本身有未分配空间,而且分区大小可调整

不管哪条路,都需要停机维护或者至少短暂卸载文件系统,这在生产环境里是很大的麻烦。LVM 的出现,就是想把“磁盘容量调整”这件事变得像“调整目录大小”一样灵活。

3.2 PV、VG、LV、PE 四个核心概念的通俗理解

LVM 的逻辑结构分四层:

  • PV(Physical Volume,物理卷):可以是一个整块磁盘,也可以是磁盘上的一个分区。PV 是 LVM 的最底层存储单元。
  • VG(Volume Group,卷组):由多个 PV 组成的一个存储池。VG 相当于把这些物理磁盘的空间合并成一个大的“原料池”。
  • LV(Logical Volume,逻辑卷):从 VG 里划分出来的逻辑存储空间。LV 才是最终被格式化、挂载给应用使用的设备。
  • PE(Physical Extent,物理扩展块):VG 存储空间的最小分配单位,默认 4MiB。VG 里的空间按 PE 切成小块,LV 从 VG 中申请 PE 组成逻辑空间。

用一个不太严谨但很好理解的生活类比:PV 是“零散的钱”,VG 是“钱包”,LV 是“从钱包里掏出来准备花的一叠钱”。钱包里的钱总数可以变,加钱包就相当于往钱包里塞更多钱,掏出来的那叠钱也可以变大变小,只要钱包里的总量够。

3.3 传统分区、整盘 PV 与 LVM 的架构对比

在规划存储方案时,我常把三种架构拉在一起对比:

架构方式扩容灵活性数据保护适用场景
传统分区 + 直接格式化极低,扩容需重新分区或迁移弱,单点故障固定容量系统盘、临时数据盘
整块磁盘做 PV + LVM高,可在线扩容缩容中等,依赖 VG 冗余设计数据增长不确定的业务存储
分区做 PV + LVM较高,但受分区表限制中等同上一块盘上同时放系统和其他数据

实际使用中,生产环境很多会直接把整块物理磁盘做成 PV,然后加入 VG。这样做的好处是 VG 里的可用空间最大,且不受 MBR 2TB 限制。如果盘上还得分其他分区,再考虑分区做 PV 的方案。

4. 从零创建一套 LVM 逻辑卷的分步实操

4.1 创建 PV:pvcreate 与 pvdisplay

以一块全新数据盘/dev/sdc(500G)为例,这次我们不再做传统分区,而是把整块磁盘直接交给 LVM。

  • 确认设备无误后,先清除可能存在的旧分区表:wipefs -a /dev/sdc
  • 创建 PV:pvcreate /dev/sdc
  • 查看 PV 信息:pvdisplay /dev/sdc或pvs

pvcreate其实就是在磁盘头部写入 LVM 元数据标记。如果磁盘上有旧的文件系统或分区表,pvcreate会提示找不到有效 PV 元数据,这时wipefs -a可以清掉签名,是个很好用的工具。

需要注意:整盘做 PV 后,这个设备不再是一个普通分区设备,lsblk看到的是一块没有分区的磁盘直接作为 PV。这种做法完全合法,也是我比较推荐的数据盘处理方式。

4.2 创建 VG:vgcreate 与 vgdisplay

创建卷组:

vgcreate data_vg /dev/sdc

这条命令的意思是,把/dev/sdc这个 PV 放入名为data_vg的卷组。成功后的输出会显示卷组大小和可用 PE 数量。用vgdisplay data_vg可以查看更详细的信息。

这里说明一个细节:VG 名字可以自己取,但尽量使用有意义的命名。我见过用vg0、vg1这样的名字,短期没什么问题,机器一多就不太好维护。建议用data_vg、app_vg、backup_vg这种一眼能看出用途的命名。

4.3 创建 LV:lvcreate 的常用参数

VG 创建好后,从 VG 里划分 LV。比如我们想给/data目录准备 100G 空间:

lvcreate -L 100G -n data_lv data_vg

-L指定大小,-n指定逻辑卷名字。创建完成后,逻辑卷设备路径为/dev/data_vg/data_lv。

如果你不想按固定大小创建,也可以使用-l参数指定 PE 数量。比如-l 100%FREE表示使用 VG 剩余所有空间。这种用法适合“把空间全部分配出去”的场景,但注意:如果后续 VG 扩容了,LV 不会自动变大,还得手动执行扩容命令,这个后面会详细说。

查看 LV 信息:

lvdisplay /dev/data_vg/data_lv

4.4 格式化、挂载与开机自动挂载配置

LV 创建后就跟一块普通分区一样,可以格式化、挂载:

mkfs.ext4 /dev/data_vg/data_lv mkdir -p /data mount /dev/data_vg/data_lv /data

写入 fstab 时,同样推荐用 UUID,不过 LVM 设备除了文件系统 UUID 外,还有一个 LVM 自身的 UUID。用blkid查看时,/dev/data_vg/data_lv会显示文件系统 UUID;另一个是 LVM 元数据里的内部 UUID,通常用lvs查看。 fstab 挂载用文件系统 UUID 即可。

在 fstab 里加一行:

UUID=你的文件系统UUID /data ext4 defaults 0 2

执行mount -a验证无报错。到此 LVM 基本链路已经跑通,可以看到整个流程跟传统分区差不太多,只是中间多了一层 VG 的“空间池化”过程。

5. VG 还有剩余空间时的逻辑卷扩容:最顺滑的一条路

5.1 判断 VG 是否还有剩余空间的两条命令

假设上面的例子中,data_vg总大小 500G,我们只给data_lv分了 100G。业务跑了一段时间后,/data空间告急,这是日常运维最典型的场景。先看 VG 剩余空间:

vgs

输出里有一列VFree,表示 VG 剩余多少空间。如果VFree大于 0,说明不需要新增物理磁盘,直接在 VG 内扩容 LV 即可。

再精确一点可以用vgdisplay data_vg,里面的 “Free PE / Size” 会直接告诉你可以使用的空间大小。PE 数量乘以 PE 大小(默认 4MiB),就是剩余容量。

5.2 lvextend 扩容逻辑卷的核心用法

确认 VG 有剩余空间后,执行扩容。比如把data_lv从 100G 扩大到 200G:

lvextend -L 200G /dev/data_vg/data_lv

-L指定最终大小,也可以指定增加多少。两种写法:

lvextend -L +50G /dev/data_vg/data_lv # 增加 50G lvextend -l +100%FREE /dev/data_vg/data_lv # 把所有剩余空间全部加进去

我自己更习惯用-L +50G这种“增加多少”的写法,因为扩容记录更清晰。如果希望把 VG 全部剩余空间都塞给某个 LV,再考虑-l +100%FREE。扩容后使用lvs或lvdisplay确认 LV 大小已经变化。

5.3 文件系统在线扩容:ext4 的 resize2fs 与 xfs 的 xfs_growfs

LV 扩容完成后,文件系统大小并不会自动跟着变,这一步特别容易忽略。如果你提前用df -h查看,会发现挂载点大小还是原来的值,必须执行文件系统扩容命令:

  • ext4 文件系统用resize2fs
  • xfs 文件系统用xfs_growfs

ext4 示例:

resize2fs /dev/data_vg/data_lv

xfs 示例:

xfs_growfs /data

很多人会问,为什么不直接resize2fs对所有文件系统都适用?因为 xfs 不支持缩容,也只能在挂载状态下通过xfs_growfs扩容,而且参数是挂载点而不是设备路径。这个区别在运维中是高频踩坑点,一定要提前区分清楚。

5.4 扩容后立即验证稳定性的几个步骤

文件系统扩容完成后,验证步骤比想象中重要:

df -h /data lvs vgs

df确认文件系统大小已经扩大,lvs确认 LV 信息,vgs确认 VG 剩余空间的变化。有些场景下,文件系统扩容需要几秒时间,尤其大容量磁盘,执行resize2fs或xfs_growfs时不要中途强制中断,否则可能导致文件系统元数据异常,尽管一般可以修复,但没必要冒风险。

我还会额外做一步:

sync

把缓存数据强制落盘,确保元数据更新完成。对生产环境来说,扩容后最好同时监控一下业务写入是否正常,确认没有 I/O 错误。

6. VG 没有剩余空间时的扩容实战:新盘加入 VG 后再扩容

6.1 为什么出现 VG 空间不足:容量规划偏差的常见情况

现实中最尴尬的场景不是“VG 有空间不会扩”,而是“VG 根本没有剩余空间了”。出现这种状况,通常是因为初始容量规划不足。比如一开始只给data_vg配了一块 500G 盘,LV 用了 450G,现在业务又要 200G 空间,VG 只剩 50G,显然不够。

这时扩容思路变成了两段式:先给 VG 加新物理盘,再从 VG 扩 LV。这个流程在生产环境很常见,也是 LVM 被广泛使用的重要原因——存储池本身可以横向扩容。

6.2 新磁盘做 PV 并加入现有 VG:vgextend 全流程

假设服务器管理员又插了一块 300G 的新盘/dev/sdd。先按之前同样的步骤创建 PV:

pvcreate /dev/sdd

然后把它加入已有的卷组data_vg:

vgextend data_vg /dev/sdd

执行成功后,data_vg的总容量就变成了 500G + 300G = 800G。用vgs查看,VSize应该已经变大,VFree也增加了约 300G。

这一步是整篇文章里我唯一觉得“操作简单但意义重大”的动作。因为从这一刻起,VG 的物理组成发生了变化,底层磁盘不再是一块,而是两块。数据本身不会自动迁移到新盘上,但后续新分配的 PE 会从新盘的空间里取。

6.3 VG 扩容后重新计算 LV 扩容容量

VG 有了新空间,接下来又回到第 5 节的扩容操作。此时我们要把data_lv再扩大,比如扩容 200G:

lvextend -L +200G /dev/data_vg/data_lv

然后文件系统扩容照旧:

resize2fs /dev/data_vg/data_lv

如果是 xfs:

xfs_growfs /data

扩容完成后照例df -h验证。这一个流程下来,你会发现:新增物理盘、加入 VG、扩容 LV、扩容文件系统,总共四条命令,中间不需要停机,不需要重新格式化,业务几乎无感知。这正是 LVM 面对“VG 无剩余空间”场景时的核心价值。

6.4 新增 PV 后 pvdisplay 的物理布局观察

扩容完成后,用pvdisplay可以观察到 VG 下的多个 PV。每个 PV 会显示各自的 PE 总数和已分配 PE 数。比如/dev/sdc的已分配 PE 可能是满的,而/dev/sdd的已分配 PE 很少,因为新空间是被后续 LV 扩容逐步消耗的。

了解 PV 布局有什么作用?如果你后续要做数据迁移、缩减 VG 或移除某块坏盘,提前知道数据在哪些 PV 上分布,能帮你评估风险和操作顺序。LVM 默认不会自动跨 PV 做镜像,所以单 PV 损坏确实会影响对应数据。

7. 多次扩容踩坑后总结的操作习惯与注意事项

7.1 在 fstab 中使用 UUID 而不是设备路径

前几节我反复强调 UUID,但实际中依然有不少同学在/etc/fstab里写/dev/sdb1、/dev/data_vg/data_lv这种设备路径。短时间没问题,一旦设备顺序发生变化或者 LVM 设备节点没激活,开机就可能出现挂载失败,系统会进入维护模式。

正确姿势是用blkid查看 UUID:

blkid /dev/data_vg/data_lv

然后把 UUID 写入 fstab。LVM 设备虽然路径相对稳定,但使用文件系统 UUID 和设备路径各有优劣。我自己的习惯是:普通分区用 UUID,LVM 逻辑卷也可以用 UUID,不过要在系统重启后特别确认 VG 被正常激活。如果遇到启动时找不到 LVM,通常需要检查 initramfs 是否包含 lvm2 模块,可以执行dracut --force重建。

7.2 xfs 与 ext4 的扩容范围差异:哪些能做、哪些不能做

这里把文件系统限制说清楚,能少踩很多坑。ext4 既能扩容也能缩容,但缩容操作必须离线,而且生产环境我不建议轻易缩容。xfs 只能扩容不能缩容。很多人刚接触 LVM 时以为 LVM 能缩容,文件系统也一定能缩容,其实未必。

如果用 xfs 又想缩容,唯一安全的路是:备份数据、重建 LV、还原数据。这个成本相当高。所以在选择文件系统时,如果预测未来可能需要缩容,优先考虑 ext4;如果确定容量只会增长不会下降,xfs 性能优势更明显。

7.3 LVM 扩容后常见的三个低级错误

我总结过扩容流程中最高频的三个错误,值得单独列一下:

  1. LV 扩了,文件系统没扩。这是最常见的,原因在于很多人执行lvextend后直接看df -h没变化,以为命令没生效,实际上只是忘了resize2fs或xfs_growfs。
  2. 在系统盘 / 分区上乱扩。根分区如果本身没有 LVM,补丁执行resize2fs可能不一定可行,需要先扩展底层分区再扩展文件系统,顺序错了容易失败。
  3. 扩容前没备份元数据。对于生产环境,执行 LVM 操作之前导出 VG 元数据备份是一个非常稳妥的习惯,命令为:
vgcfgbackup data_vg

这条命令会备份 VG 的元数据到/etc/lvm/backup目录,万一元数据损坏,可以借助vgcfgrestore恢复,关键时刻能保命。

7.4 在线扩容的操作窗口与业务影响评估

很多运维新人对“在线扩容”有误解,以为任何时刻执行都无影响。实际上,虽然 LVM 在线扩容不需要卸载文件系统,但大规模扩容操作仍有瞬时 I/O 压力,尤其对繁忙的生产库。我的建议是:

  • 尽量在业务低峰期执行扩容
  • 扩容前确认磁盘健康状态(比如smartctl -a /dev/sdc)
  • 扩容过程中不要同时跑大量备份或数据迁移任务
  • 扩容完成后确认df -h和dmesg尾部没有 I/O error

这里想多说一句:扩容不是日常小操作,每次都应记录变更,包括原容量、目标容量、VG 剩余空间、操作时间、操作人。内容看似琐碎,但排查问题时价值巨大。

写在最后的经验体会

实际上,磁盘管理这块内容并不复杂,但真的很考验“流程感”。传统分区和 LVM 操作命令就那么几个,麻烦的是每一次遇到的实际环境都不同,有的是 GPT 分区表没选对,有的是 xfs 不能缩容,有的是 VG 没空间要先加盘。我在多次接手同事的服务器时发现,大部分事故都不是命令写错,而是对整个存储链路的理解不够完整。建议刚开始学的朋友,先在虚拟机里把 MBR、GPT、LVM 三种路径各走一遍,再试着人为制造“VG 满了”的场景做一次新盘加入,整个过程半小时就能跑完,但对理解这套机制会有质的帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询