在Linux系统管理中,磁盘空间管理一直是运维人员的核心工作之一。传统分区管理方式存在诸多限制:分区大小固定后难以调整,存储空间无法灵活调配,扩容缩容操作风险高等问题。逻辑卷管理(Logical Volume Manager,简称LVM)正是为解决这些痛点而生。
我第一次接触LVM是在2013年维护一个在线教育平台时,当时数据库分区即将用尽,传统方法需要停机、备份、重建分区、恢复数据,预计需要8小时窗口期。而使用LVM在线扩容仅用15分钟就解决了问题,这让我深刻认识到其价值所在。
LVM通过抽象层将物理存储设备与文件系统解耦,主要优势体现在:
物理卷是LVM的最底层构建块,可以是整个磁盘(如/dev/sdb)或磁盘分区。初始化物理卷的命令如下:
bash复制# 将整个磁盘初始化为PV
pvcreate /dev/sdb
# 使用分区创建PV(需先使用fdisk/gdisk创建分区)
pvcreate /dev/sda3
关键属性检查命令:
bash复制pvdisplay /dev/sdb # 查看详细信息
pvs # 查看简要信息
pvscan # 扫描系统中所有PV
重要提示:生产环境中建议使用整个磁盘作为PV,避免与分区表产生冲突。若必须使用分区,需将分区类型标记为8e(MBR)或8e00(GPT)。
卷组是物理卷的集合,构成存储池。创建卷组时需考虑以下策略:
bash复制# 创建名为data_vg的卷组
vgcreate data_vg /dev/sdb /dev/sdc
# 扩展卷组(添加新PV)
vgextend data_vg /dev/sdd
# 缩减卷组(需先迁移数据)
pvmove /dev/sdb # 将数据移出目标PV
vgreduce data_vg /dev/sdb
VG管理技巧:
-s参数指定PE大小(默认4MB):vgcreate -s 8M data_vg /dev/sdbvgchange -l 255 data_vgvgchange -a y data_vg逻辑卷是从卷组划分出的虚拟块设备,支持多种类型:
bash复制lvcreate -L 20G -n data_lv data_vg
bash复制lvcreate -i 3 -I 64 -L 100G -n stripe_lv data_vg
# -i 指定条带数,-I 指定条带大小(KB)
bash复制lvcreate -m 1 -L 50G -n mirror_lv data_vg
# -m 指定镜像副本数
LV扩展与缩减示例:
bash复制# 扩展LV容量(先扩展LV,后扩展文件系统)
lvextend -L +10G /dev/data_vg/data_lv
resize2fs /dev/data_vg/data_lv # 针对ext4文件系统
# 缩减LV(需先卸载文件系统并检查)
umount /data
e2fsck -f /dev/data_vg/data_lv
resize2fs /dev/data_vg/data_lv 15G
lvreduce -L 15G /dev/data_vg/data_lv
mount -a
LVM快照通过写时复制(CoW)机制实现,创建前需计算所需空间:
bash复制# 计算变更量预估(根据应用负载调整)
lvcreate -s -n db_snap -L 5G /dev/data_vg/db_lv
快照使用注意事项:
dmsetup statuslvconvert --merge data_vg/db_snap使用SSD为慢速磁盘加速:
bash复制# 1. 创建缓存池
lvcreate -L 50G -n cache_pool data_vg /dev/nvme0n1
# 2. 将缓存池附加到目标LV
lvconvert --type cache --cachepool data_vg/cache_pool \
--cachemode writethrough /dev/data_vg/data_lv
缓存模式对比:
创建精简池和精简卷:
bash复制# 创建thin池
lvcreate -L 100G -T data_vg/thin_pool
# 从池中创建thin卷(虚拟大小可大于物理空间)
lvcreate -V 500G -T data_vg/thin_pool -n thin_vol
监控空间使用:
bash复制lvs -o lv_name,data_percent,metadata_percent,thin_count
某MySQL服务器数据目录使用LVM,扩容流程:
bash复制pvcreate /dev/sde
bash复制vgextend mysql_vg /dev/sde
bash复制lvextend -L +200G /dev/mysql_vg/mysql_lv
resize2fs /dev/mysql_vg/mysql_lv
bash复制df -h /var/lib/mysql
原系统使用直接分区,迁移到LVM步骤:
dd或rsync复制数据/etc/fstab和grub配置bash复制dracut --force --add lvm
将VG从ServerA迁移到ServerB:
bash复制vgchange -a n data_vg
vgexport data_vg
bash复制pvscan
vgimport data_vg
vgchange -a y data_vg
问题1:VG无法激活
bash复制vgchange -a y data_vg
Volume group "data_vg" not found
解决方案:
bash复制pvscan --cache # 重新扫描PV
vgimport data_vg
问题2:LV显示为inactive
bash复制lvdisplay
/dev/data_vg/data_lv: not found
处理方法:
bash复制vgchange -a y data_vg
lvchange -a y /dev/data_vg/data_lv
bash复制echo deadline > /sys/block/sdb/queue/scheduler
bash复制lvcreate -i 4 -I 128 -L 1T -n perf_lv data_vg
# -i 建议等于磁盘数量,-I 根据负载调整
bash复制iostat -xm 1 # 查看I/O负载
lvmstats # LVM性能统计
场景1:误删LV
bash复制vgcfgrestore -f /etc/lvm/archive/data_vg_xxxx.vg data_vg
场景2:PV损坏
bash复制pvcreate --uuid <原UUID> --restorefile /etc/lvm/archive/vgcfgbackup /dev/sdb
vgcfgrestore data_vg
ini复制backup = 1
backup_dir = "/var/backups/lvm"
bash复制vgcfgbackup data_vg
bash复制lvchange -p r /dev/data_vg/critical_lv # 设置为只读
ini复制filter = [ "a|^/dev/sd[ab]|", "r|.*|" ]
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| LVM快照 | 瞬时创建,空间高效 | 临时性,不能长期保存 | 短期备份/应用一致性点 |
| dd克隆 | 完全镜像 | 占用空间大 | 小容量关键分区 |
| 存储阵列快照 | 独立于主机 | 需要专用硬件 | 企业级环境 |
| 文件级备份 | 灵活,可增量 | 恢复慢 | 常规数据备份 |
在实际运维中,我通常会结合LVM快照和文件级备份。例如每天创建数据库快照后立即执行pg_dump,这样既保证了备份速度,又能获得可移植的备份文件。