Centos6.5 LVM跨盘数据盘缩容回收与替换扩容
记录时间:2026-08-26
环境:RHEL 6.5(CentOS 系)/ LVM2 / ext4 / Xen 云主机(xvd 系列虚拟磁盘)
一、背景 / 问题现象
一台 RHEL 6.5 云主机,100G 数据盘 xvdf 被云平台配置成了独立-非持久模式,关机后这块盘的数据会丢。云平台反馈需要做数据盘替换:把旧盘回收,换一块持久盘。
拿到需求我的第一反应是 umount 挂载点、云平台卸盘就完事了。看了眼 lsblk 才发现根本不是挂载问题:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 100G 0 disk
├─xvda1 202:1 0 200M 0 part /boot
├─xvda2 202:2 0 15.6G 0 part [SWAP]
└─xvda3 202:3 0 84.2G 0 part
├─VolGroup-root (dm-0) 253:0 0 20G 0 lvm /
├─VolGroup-AppData (dm-1) 253:1 0 130G 0 lvm /AppData
├─VolGroup-AppHome (dm-2) 253:2 0 20G 0 lvm /AppHome
└─VolGroup-AppLogs (dm-3) 253:3 0 10G 0 lvm /AppLogs
xvdf 202:80 0 100G 0 disk
└─VolGroup-AppData (dm-1) 253:1 0 130G 0 lvm /AppData
xvdf 上没有任何独立挂载点,它是 LVM 的物理卷(PV),和系统盘上的 xvda3 同属 VolGroup。/AppData 这个 130G 的逻辑卷(LV)跨在两块盘上。直接在云平台删盘,/AppData 立刻 I/O error,VG 元数据也就坏了。
先算了笔账再定方案:
| 项目 | 容量 | 说明 |
|---|---|---|
| xvda3 总量 | 84.2G | root 20G + AppHome 20G + AppLogs 10G 已占 50G |
| xvda3 能给 AppData 的上限 | ~34G | 84.2G – 50G |
| AppData 逻辑卷 | 130G | xvda3 上约 34G + xvdf 上约 96G |
| AppData 实际数据 | 3.7G | df 显示 3% 使用 |
结论:把 AppData 缩到 34G 以内(我取了 30G),数据全部落回系统盘 xvda3,xvdf 就能干净摘出来。整个操作分三段:缩容摘盘 → 云平台换盘 → 扩容还原。
二、操作过程
2.1 前置确认
df -T /AppData
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup-AppData ext4 134176040 3807104 123554472 3% /AppData
必须是 ext4 才能缩小。这台是 RHEL 6.5,默认 ext4(RHEL 6 连 xfsprogs 都不预装)。如果碰到 xfs 要注意:xfs 只能扩不能缩,只能走备份 → lvremove 删卷重建 → 恢复数据的路子。
数据只有 3.7G,先备份兜底:
tar czf /root/AppData_bak_$(date +%F).tgz -C / AppData
2.2 缩容并摘除 xvdf
停掉占用 /AppData 的业务进程,卸载(ext4 只支持在线扩大,不支持在线缩小,缩文件系统必须离线做):
fuser -mv /AppData # 有输出先停对应服务
cd / # shell 若在 /AppData 下,umount 会报 target is busy
umount /AppData
离线检查文件系统。第一次跑弹了个提示:
[root@localhost /]# e2fsck -f /dev/mapper/VolGroup-AppData
Pass 3: Checking directory connectivity
/lost+found not found. Create<y>? yes
文件系统里没有 lost+found 目录,e2fsck 顺手补建,正常提示,回 y 即可。
先缩文件系统,再缩逻辑卷,这个顺序反了数据就没了:
e2fsck -f /dev/mapper/VolGroup-AppData
resize2fs /dev/mapper/VolGroup-AppData 30G
lvreduce -L 30G /dev/mapper/VolGroup-AppData # 丢数据警告回 y
然后把 xvdf 摘出卷组:
pvmove /dev/xvdf
vgreduce VolGroup /dev/xvdf
pvremove /dev/xvdf
pvmove 输出 No data to move for VolGroup,我还愣了一下,随后想明白了:lvreduce 默认从 LV 尾部释放物理扩展(PE),这次恰好把落在 xvdf 上的 PE 全放掉了,pvmove 自然无事可做。这一步不能省,它是保险:万一 lvreduce 释放的尾部有一部分在 xvda3 上,pvmove 会把 xvdf 上的残留 PE 挪回系统盘,保证 vgreduce 一定干净。
挂回来确认数据还在:
mount -a
df -h /AppData # 30G,数据 3.7G 完好
lsblk # xvdf 光秃秃,下面没有任何 LV
2.3 云平台换盘
系统内确认 pvs 只剩 /dev/xvda3、lsblk 里 xvdf 是裸盘之后,才去云平台卸载并回收 xvdf。顺序不能反,先删云盘的话 /AppData 的 VG 元数据直接损坏,重启都起不来。
新持久盘挂上来后:
[root@localhost ~]# lsblk
...
xvde 202:64 0 100G 0 disk
新盘是 xvde 不是 xvdf,这是正常的:盘符由内核按发现顺序分配,不保证稳定。LVM 认 PV 的 UUID 不认设备名,不用担心;fstab 走 /dev/mapper/ 路径同样不受影响。
2.4 扩容还原
这次方向反过来了(扩容),ext4 支持在线扩大,全程不用 umount、不用停业务。先确认新盘是空盘、且云平台侧已确认为持久模式(磁盘模式系统里查不到,只能平台侧看):
blkid /dev/xvde # 无输出 = 空盘
pvcreate /dev/xvde
vgextend VolGroup /dev/xvde
lvextend -L +100G /dev/mapper/VolGroup-AppData
resize2fs /dev/mapper/VolGroup-AppData
扩容方向的 resize2fs 连大小参数都不用带,自动把文件系统撑满整个 LV。
三、验证
[root@localhost ~]# df -h /AppData
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-AppData 128G 3.7G 118G 3% /AppData
[root@localhost ~]# lsblk
xvda ...
├─VolGroup-AppData (dm-1) 253:1 0 130G 0 lvm /AppData
xvde 202:64 0 100G 0 disk
└─VolGroup-AppData (dm-1) 253:1 0 130G 0 lvm /AppData
/AppData 恢复 128G,数据完好,拓扑和换盘前一致(xvdf 换成了 xvde)。
这次换盘的目的就是解决非持久丢数据,所以最后约了个窗口重启了一次:开机后 lsblk 正常、/AppData 数据都在、提前 touch 的测试文件也在,持久性确认无误。业务跑稳几天后把 /root 下的备份 tgz 清掉。
四、注意事项 / 常见问题
先缩文件系统再缩 LV(resize2fs → lvreduce),顺序反了文件系统直接损坏。缩小方向的 resize2fs 必须给目标大小,且离线执行。
系统内摘干净(pvremove)之后才能去云平台删盘,反过来做 /AppData 立刻 I/O error,VG 元数据损坏后恢复很麻烦。
缩小目标有硬上限:不能超过其他逻辑卷占完后系统盘上的剩余空间(本例 34G),不然数据落不回去。
lvreduce 默认从 LV 尾部释放 PE,不一定正好全落在要摘的盘上,所以 pvmove 不能省。
ext4 只能在线扩不能在线缩;xfs 只能扩不能缩(xfs 想缩小只能备份重建)。
云平台换盘后盘符会变(xvdf → xvde),LVM 和 fstab 都不受影响,按 lsblk 实际名字操作即可。
缩容期间业务要停(umount 才能缩),扩容方向在线做就行,计划停机窗口只按缩容那段留。
五、参考资料
- 验证命令:
lsblk/pvs/df -T/blkid,每一步操作后都跑一遍确认状态再往下走 - Red Hat《Logical Volume Manager Administration Guide》:https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/
- man 手册:
lvm(8)、lvreduce(8)、pvmove(8)、resize2fs(8)