适用场景:虚拟机磁盘从 200G 扩到 500G(hypervisor 层已扩),系统使用 GPT 分区表 + LVM,需要把新增空间扩容到 /home。 文件系统:Rocky Linux 默认 XFS(只能扩大,不能缩小)。
一、环境现状
卷组 rl 内逻辑卷:
rl-root 70G,挂载 /rl-swap 7.9G,SWAPrl-home 120.5G,挂载 /home ← 本次扩容目标
二、查看当前分区情况
通过fdisk -l查看 总磁盘为500G,原实际在用的为200G
fdisk -lGPT PMBR size mismatch (419430399 != 1048575999) will be corrected by write.Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectorsDisk model: Virtual diskUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: gptDisk identifier: 7AF193B8-A86E-492C-9CB4-4F3A77C95FE6Device Start End Sectors Size Type/dev/sda1 2048 1230847 1228800 600M EFI System/dev/sda2 1230848 3327999 2097152 1G Linux filesystem/dev/sda3 3328000 419428351 416100352 198.4G Linux LVMDisk /dev/mapper/rl-root: 70 GiB, 75161927680 bytes, 146800640 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/rl-swap: 7.88 GiB, 8455716864 bytes, 16515072 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/rl-home: 120.54 GiB, 129423638528 bytes, 252780544 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes
- 首次
fdisk -l 提示的 GPT PMBR size mismatch (419430399 != 1048575999) will be corrected by write,是因为磁盘在 hypervisor 层从约 200G 扩到了 500G,但 GPT 的备份头还停留在旧位置。
[root@localhost ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 0 500G 0 disk├─sda1 8:1 0 600M 0 part /boot/efi├─sda2 8:2 0 1G 0 part /boot└─sda3 8:3 0 198.4G 0 part ├─rl-root 253:0 0 70G 0 lvm / ├─rl-swap 253:1 0 7.9G 0 lvm [SWAP] └─rl-home 253:2 0 120.5G 0 lvm /home
2. 为什么 sda4 是 "Linux filesystem" 而不是 "Linux LVM"?
因为执行 t 修改类型时输入了 8e,但提示 Type of partition 4 is unchanged。原因是:
8e 是 MBR/DOS 分区表中 "Linux LVM" 的类型码,不是 GPT 的类型别名。- 你的磁盘是 GPT 分区表(
Disklabel type: gpt)。在 GPT 下,fdisk 不认 8e,所以没生效,分区保持默认的 "Linux filesystem"。 - 在 GPT 下,
fdisk 里 "Linux LVM" 的别名是 30(对应 GUID E6D6D379-F507-44C2-A23C-238F2A3DF928)。
重要:分区类型只是一个"标记/提示",并不影响 LVM 实际工作。pvcreate 在任何类型的分区上都能成功。所以即使类型是 "Linux filesystem",下面的扩容步骤也能正常完成。但为规范、便于运维识别,建议改成 Linux LVM。
三、完整操作步骤
⚠️ 操作前务必备份重要数据 / 做快照。LVM/分区操作有风险。 全程使用 root 用户。
步骤 0:(强烈建议)先备份或快照
在虚拟化平台对该虚拟机打快照,或备份 /home 重要数据。
步骤 1:用 fdisk 新建分区 sda4
若 sda4 已经创建好,可跳过本步,直接进入步骤 2。 下面是完整的 fdisk 交互过程,# 后为说明,无需输入。
fdisk /dev/sdaWelcome to fdisk (util-linux 2.37.4).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.GPT PMBR size mismatch (419430399 != 1048575999) will be corrected by write.This disk is currently in use - repartitioning is probably a bad idea.It's recommended to umount all file systems, and swapoff all swappartitions on this disk.Command (m for help): n #新建分区Partition number (4-128, default 4): #回车黑认使用4First sector (419428352-1048575966, default 419428352): #回车Last sector, +/-sectors or +/-size{K,M,G,T,P} (419428352-1048575966, default 1048575966): #回车按默认值Created a new partition 4 of type 'Linux filesystem' and of size 300 GiB.Command (m for help): w #保存The partition table has been altered.Syncing disks.
说明:
- 首次
fdisk -l 出现 GPT PMBR size mismatch ... will be corrected by write,在执行 w 写入时会被自动修正,无需手动处理。 - 新建分区默认类型是
Linux filesystem,下一步再改为 LVM。
步骤 2:用 fdisk 把 sda4 类型改为 Linux LVM(推荐)
关键点:GPT 分区表里 Linux LVM 的别名是 30,不是 MBR 的 8e。 之前输入 8e 提示 Type ... is unchanged 就是这个原因。
方式 A —— 用 fdisk 交互修改:
fdisk /dev/sda # 再次进入 fdiskCommand (m for help): t # t = 修改分区类型Partition number (1-4, default 4): 4 # 选择分区 4(也可直接回车用默认)Partition type or alias (type L to list all): 30 # 输入 30(GPT 的 Linux LVM 别名) # 可先输入 L 查看全部别名Changed type of partition 'Linux filesystem' to 'Linux LVM'.Command (m for help): w # 写入并退出The partition table has been altered.Syncing disks.
提示:在 t 之后输入 L 可列出所有 GPT 类型别名,其中30 = Linux LVM、20 = Linux filesystem、19 = Linux swap、1 = EFI System。
方式 B —— 用 sgdisk(非交互,更省事;sgdisk 用 8e00 表示 Linux LVM):
sgdisk -t 4:8e00 /dev/sda
验证:
fdisk -l /dev/sda | grep sda4# 期望看到类型变为:Linux LVM
注意:分区类型只是标记,即使保持 "Linux filesystem",后续 pvcreate/扩容也能成功,改成 LVM 只是更规范。
步骤 3:让内核重新读取分区表
磁盘正在使用中,分区表更改不会立即对内核生效,需要刷新:
partprobe /dev/sda# 若 partprobe 不可用或失败,可用:# partx -u /dev/sda
确认 sda4 已被识别:
如果上述命令均提示设备忙、内核仍未识别 sda4,则重启服务器后再继续(重启最稳妥)。
步骤 4:创建物理卷(PV)
验证:
步骤 5:把新 PV 加入卷组 rl
验证(应能看到 VG 空闲空间增加约 300G):
vgsvgdisplay rl | grep -i free
步骤 6:扩展逻辑卷 rl-home
把卷组里全部空闲空间分给 /home:
lvextend -l +100%FREE /dev/mapper/rl-home
如果不想全部给 home,只加固定大小,改用:lvextend -L +300G /dev/mapper/rl-home
验证:
lvslvdisplay /dev/mapper/rl-home | grep -i "LV Size"
步骤 7:扩展文件系统(XFS)
先确认文件系统类型:
df -T /home# Rocky 默认是 xfs
XFS 扩容(注意:XFS 用挂载点,且可在线扩容):
如果 /home 是 ext4(用 df -T 确认),则改用:resize2fs /dev/mapper/rl-home
步骤 8:最终验证
四、命令速查(确认类型后可直接照抄)
# 0. 新建分区(fdisk 交互):n → 回车 → 回车 → 回车 → w# (或一行非交互:sgdisk -n 4:0:0 /dev/sda)# 1. 改分区类型为 LVM(GPT)# fdisk 交互:t → 4 → 30 → wsgdisk -t 4:8e00 /dev/sda# 2. 刷新分区表(必要时改为重启)partprobe /dev/sdalsblk /dev/sda# 3. 扩容 LVM 三连pvcreate /dev/sda4vgextend rl /dev/sda4lvextend -l +100%FREE /dev/mapper/rl-home# 4. 扩展文件系统(XFS)xfs_growfs /home# 5. 验证df -h /home
五、注意事项与常见问题
- 类型 8e vs 30:MBR 用
8e,GPT 用 30(fdisk)或 8e00(sgdisk)。这是本次"类型没改成功"的根因。 - 类型不影响功能:即使保持 "Linux filesystem",
pvcreate 也能用,扩容仍可完成;改成 LVM 只是更规范。 - XFS 只能扩大不能缩小:扩容方向不可逆,操作前确认目标卷选对(本次是
rl-home)。 - XFS 用挂载点扩容:
xfs_growfs /home,而非设备名;resize2fs 才是用设备名。 - 分区表刷新失败:
partprobe / partx -u 不生效时,重启是最可靠的办法。 - PMBR mismatch
- 务必先备份/快照