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路径正确,可通过lsblkfdisk -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_data

2. 查看当前文件系统块大小

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 /data

2. 再次检查文件系统

e2fsck -f /dev/vg_data/lv_data

3. 缩小文件系统(先缩文件系统,再缩LV)

resize2fs /dev/vg_data/lv_data 25G

4. 缩小逻辑卷

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不再使用该盘
  • 跨盘管理时,建议使用stripedmirror类型提升性能/冗余(需额外配置)

常用排查命令速查表

| 命令 | 用途 | 关键输出字段 |
|——|——|————-|
| 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. 扩容流程:新硬盘pvcreatevgextendlvextendxfs_growfs/resize2fs
2. 缩容禁忌:仅ext4支持,顺序不可逆,数据备份是底线
3. 跨盘管理pvmove实现数据迁移,vgreduce移除故障盘
4. 排查工具pvs/vgs/lvs/df/lsblk五件套

最后,送给所有运维同仁一句经验之谈:“在Production环境,任何对存储的修改都先备份,任何‘简单’的操作都先验证”。LVM的强大功能建立在对底层原理的深刻理解之上,希望本文能成为你运维工具箱中的一把利刃。

📚 推荐阅读

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析

https://t.zsxq.com/40MyD

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This website uses cookies to analyze site traffic and improve your experience. By continuing to use this site, you consent to our use of cookies.