Linux LVM 逻辑卷扩容与缩容实战指南(Production环境适用)
引言
在生产环境中,磁盘空间不足是运维工程师最常遇到的“噩梦”之一。无论是数据库日志暴涨、容器镜像堆积,还是业务数据量超出预期,当df -h显示使用率达到95%以上时,运维的“警报灯”就会亮起。
LVM(Logical Volume Manager)是Linux环境下最强大的磁盘管理工具之一,它允许我们在不中断服务的情况下动态调整存储容量。然而,LVM的扩容虽相对简单,但缩容操作却暗藏风险。本文将从实战出发,带你掌握LVM在Production环境下的扩容与缩容全流程。
环境说明
- 操作系统:CentOS 7.9 / Ubuntu 20.04(命令通用)
- 内核版本:3.10.0+ / 5.4.0+
- 文件系统:xfs(默认)和 ext4
- 初始磁盘布局:
– /dev/sda:系统盘(已使用)
– /dev/sdb:20GB,作为PV加入VG
– /dev/sdc:20GB,新加入的扩容盘
- VG名称:
vg_data - LV名称:
lv_data,挂载点/data
实战操作步骤
第一步:环境现状确认
在进行任何操作前,必须全面了解当前的存储拓扑。运行以下命令获取完整信息:
查看物理卷
pvs
输出示例:
PV VG Fmt Attr PSize PFree
/dev/sdb vg_data lvm2 a-- 19.99g 0
查看卷组
vgs
VG #PV #LV #SN Attr VSize VFree
vg_data 1 1 0 wz--n- 19.99g 0
查看逻辑卷
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_data vg_data -wi-ao---- 19.99g
查看挂载和文件系统
df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data 20G 18G 2.0G 90% /data
查看块设备
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─vg_data-lv_data 253:0 0 20G 0 lvm /data
sdc 8:32 0 20G 0 disk
当前环境:/dev/sdb已全部使用,/data使用率达90%,需立即扩容。
第二步:物理卷扩容——新加硬盘加入VG
假设新硬盘/dev/sdc已插入服务器,首先将其初始化为物理卷(PV):
1. 创建物理卷
pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
2. 将新PV加入已有VG
vgextend vg_data /dev/sdc
Volume group "vg_data" successfully extended
3. 验证VG空间
vgs vg_data
VG #PV #LV #SN Attr VSize VFree
vg_data 2 1 0 wz--n- 39.99g 20.00g
生产环境注意:
- 确保新硬盘的
/dev/sdc路径正确,可通过lsblk或fdisk -l确认 - 如果硬盘已有分区表,需先清空:
dd if=/dev/zero of=/dev/sdc bs=1M count=10 - 若使用RAID卡,需先在RAID控制器层面创建虚拟磁盘
第三步:逻辑卷在线扩容(xfs/ext4通用)
#
3.1 扩展LV大小
将/data的LV从20G扩展到30G:
方案一:增加指定大小
lvextend -L +10G /dev/vg_data/lv_data
方案二:扩展到绝对大小
lvextend -L 30G /dev/vg_data/lv_data
方案三:使用VG剩余空间百分比
lvextend -l +100%FREE /dev/vg_data/lv_data验证LV变化
lvs /dev/vg_data/lv_data
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_data vg_data -wi-ao---- 30.00g
#
3.2 扩展文件系统(关键区别)
对于xfs文件系统(如CentOS 7默认):
xfs只能在线扩容,不能缩容
xfs_growfs /data
meta-data=/dev/mapper/vg_data-lv_data isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
data blocks changed from 5242880 to 7864320
确认扩容结果
df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data 30G 18G 12G 60% /data
对于ext4文件系统:
需先卸载(生产环境需谨慎!)
umount /data执行文件系统检查(必须)
e2fsck -f /dev/vg_data/lv_data扩容文件系统
resize2fs /dev/vg_data/lv_data重新挂载
mount /dev/vg_data/lv_data /data
生产环境核心原则:
- xfs支持热扩容,无需卸载,零停机
- ext4建议先卸载再
resize2fs,虽然部分内核支持在线扩容(resize2fs /dev/...),但存在风险 - 无论哪种文件系统,扩容前必须备份数据
第四步:逻辑卷缩容(仅ext4,高风险操作)
缩容是LVM中最危险的操作,稍有不慎将导致文件系统损坏。xfs不支持缩容,以下仅针对ext4。
#
4.1 缩容前置检查
1. 检查文件系统完整性(必须)
e2fsck -f /dev/vg_data/lv_data2. 查看当前文件系统块大小
tune2fs -l /dev/vg_data/lv_data | grep 'Block size'
Block size: 4096
3. 计算目标大小对应的块数(例如缩容到25G)
25G = 25 * 1024 * 1024 * 1024 / 4096 = 6553600 blocks
也可以直接用resize2fs自动计算
#
4.2 执行缩容(严格步骤)
强烈建议:在单用户模式下或维护窗口执行
1. 卸载文件系统
umount /data2. 再次检查文件系统
e2fsck -f /dev/vg_data/lv_data3. 缩小文件系统(先缩文件系统,再缩LV)
resize2fs /dev/vg_data/lv_data 25G4. 缩小逻辑卷
lvreduce -L 25G /dev/vg_data/lv_data
WARNING: Reducing active logical volume to 25.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_data/lv_data? [y/n]: y
Size of logical volume vg_data/lv_data changed from 30.00 GiB (7680 extents) to 25.00 GiB (6400 extents).
5. 重新挂载并验证
mount /dev/vg_data/lv_data /data
df -h /data
风险警示:
- 缩容顺序必须严格:先缩文件系统,再缩LV,顺序颠倒会直接导致数据丢失
- 缩容后立即执行
e2fsck检查文件系统 - 缩容大小必须小于等于文件系统实际数据量,建议保留10%-20%余量
- 生产环境强烈不建议缩容,优先考虑迁移数据或重建LV
第五步:卷组跨多块硬盘的管理
当VG跨多块物理盘时,需注意性能与冗余策略:
查看PV分布
pvs -o pv_name,vg_name,pe_size,total_pe,free_pe
PV VG PE Size TotalPE FreePE
/dev/sdb vg_data 4.00M 5119 0
/dev/sdc vg_data 4.00M 5119 5119
查看LV的物理分布
lvdisplay -m /dev/vg_data/lv_data
--- Segments ---
Logical extent 0 to 5119:
Type linear
Physical volume /dev/sdb
Logical extent 5120 to 7679:
Type linear
Physical volume /dev/sdc
将LV数据迁移到特定PV(如需移除某块盘)
pvmove /dev/sdb /dev/sdc
/dev/sdb: Moved: 100.00%
从VG中移除PV
vgreduce vg_data /dev/sdb
Removed "/dev/sdb" from volume group "vg_data"
最佳实践:
- 使用
pvmove迁移数据时,需确保目标PV有足够空间 - 移除PV前务必确认LV不再使用该盘
- 跨盘管理时,建议使用
striped或mirror类型提升性能/冗余(需额外配置)
常用排查命令速查表
| 命令 | 用途 | 关键输出字段 |
|——|——|————-|
| pvs | 查看所有物理卷 | PV, VG, PSize, PFree |
| vgs | 查看卷组信息 | VG, #PV, #LV, VSize, VFree |
| lvs | 查看逻辑卷 | LV, VG, LSize, Attr |
| df -h | 查看文件系统使用率 | Size, Used, Use% |
| lsblk | 查看块设备拓扑 | NAME, SIZE, TYPE, MOUNTPOINT |
| pvdisplay | 显示PV详细信息 | PE大小, PE总数 |
| vgdisplay | 显示VG详细信息 | 物理卷列表, 最大LV数 |
| lvdisplay -m | 显示LV映射关系 | 物理盘分布, 条带信息 |
总结
LVM作为Linux存储管理的核心工具,其灵活的动态调整能力是生产环境的“救命稻草”。通过本文的实战操作,相信你已经掌握了:
1. 扩容流程:新硬盘pvcreate → vgextend → lvextend → xfs_growfs/resize2fs
2. 缩容禁忌:仅ext4支持,顺序不可逆,数据备份是底线
3. 跨盘管理:pvmove实现数据迁移,vgreduce移除故障盘
4. 排查工具:pvs/vgs/lvs/df/lsblk五件套
最后,送给所有运维同仁一句经验之谈:“在Production环境,任何对存储的修改都先备份,任何‘简单’的操作都先验证”。LVM的强大功能建立在对底层原理的深刻理解之上,希望本文能成为你运维工具箱中的一把利刃。
📚 推荐阅读
- Linux系统运维 — 更多Linux实战文章
- 云服务器入侵应急响应 — 安全运维必读