Linux服务器在运行过程中经常面临磁盘空间不足、分区结构调整、数据备份恢复等运维需求。LVM(Logical Volume Manager)逻辑卷管理器通过在物理设备和文件系统之间引入抽象层,实现了磁盘空间的动态分配、在线扩容和快照备份,是服务器运维中不可或缺的存储管理工具。本文从LVM核心概念出发,结合实际服务器环境配置PV、VG、LV以及快照恢复的完整流程,给出可直接复用的操作方案。
LVM逻辑卷管理核心概念与架构
LVM将磁盘管理分为三个层次:物理卷(PV,Physical Volume)、卷组(VG,Volume Group)和逻辑卷(LV,Logical Volume)。
物理卷是LVM管理的最底层设备,可以是整个磁盘(如/dev/sdb)或磁盘分区(如/dev/sdb1)。创建PV时,LVM在设备头部写入元数据,记录该PV属于哪个VG、PE大小等信息。
卷组由一个或多个PV组成,是LVM的存储池。VG将底层的物理空间统一管理,向上提供逻辑卷分配的可用空间。同一个VG内的多个PV可以来自不同的物理磁盘,实现跨磁盘的容量聚合。
逻辑卷从VG中分配空间创建,是面向文件系统的逻辑设备。LV可以在不停止服务的情况下在线扩容和缩容,这是LVM相对于传统分区方案的核心优势。
PE(Physical Extent)是VG内的最小分配单位,默认4MB。LE(Logical Extent)与PE一一对应,LV的空间以LE为单位从VG分配。
物理卷PV与卷组VG创建配置
假设服务器新加了两块磁盘/dev/sdb和/dev/sdc,需要创建LVM存储池。操作步骤如下:
# 1. 查看可用磁盘
lsblk
fdisk -l
# 2. 创建物理卷
pvcreate /dev/sdb /dev/sdc
pvdisplay
pvs
# 3. 创建卷组,指定PE大小8MB
vgcreate -s 8M vg_data /dev/sdb /dev/sdc
# 4. 验证卷组
vgdisplay
vgs
# 5. 查看VG总空间和可用空间
vgdisplay vg_data | grep -E "VG Size|Free"
如果后续需要向VG追加新磁盘,使用 vgextend 命令:
# 新增磁盘/dev/sdd加入VG
pvcreate /dev/sdd
vgextend vg_data /dev/sdd
vgs vg_data
在生产环境中,建议将不同类型的磁盘分别创建VG,避免SSD和HDD混在一个VG中导致性能不均匀。例如 vg_ssd 用于数据库和高IO应用, vg_hdd 用于日志和备份存储。
逻辑卷LV创建与在线扩容实战
从VG中创建逻辑卷并格式化挂载:
# 1. 创建100GB逻辑卷
lvcreate -L 100G -n lv_data vg_data
# 2. 按VG剩余空间的百分比创建
lvcreate -l 100%FREE -n lv_backup vg_data
# 3. 创建时指定条带数(跨多PV提升IO性能)
lvcreate -L 200G -i 2 -I 64 -n lv_fast vg_data
# 4. 格式化为xfs文件系统
mkfs.xfs /dev/vg_data/lv_data
# 5. 创建挂载点并挂载
mkdir -p /data
mount /dev/vg_data/lv_data /data
# 6. 写入fstab实现开机自动挂载
echo "/dev/vg_data/lv_data /data xfs defaults 0 0" >> /etc/fstab
-i 2 参数指定条带数为2,数据跨两个PV分布, -I 64 设置条带大小64KB。条带化适合对顺序读写性能要求高的场景,如数据库数据文件。
LV在线扩容是LVM最常用的运维操作。当 /data 空间不足时,无需卸载文件系统即可扩容:
# 1. 检查VG剩余空间
vgs vg_data
# 2. LV扩容50GB
lvextend -L +50G /dev/vg_data/lv_data
# 3. xfs文件系统在线扩容
xfs_growfs /data
# 4. ext4文件系统在线扩容
resize2fs /dev/vg_data/lv_data
# 5. 验证扩容结果
df -h /data
lvs
注意xfs文件系统只能扩容不能缩容,ext4支持双向调整。生产环境推荐使用xfs,除非有明确的缩容需求。如果VG空间不足,先通过 vgextend 追加新PV,再执行 lvextend。
LVM快照机制与数据备份恢复
LVM快照是某一时间点LV数据的只读副本,采用写时复制(Copy-on-Write)机制,初始创建时几乎不占用额外空间,仅在原LV数据被修改时才将旧数据复制到快照区域。快照适用于数据库一致性备份、文件系统冻结备份等场景。
# 1. 创建快照(分配10GB空间存储COW数据)
lvcreate -L 10G -s -n lv_data_snapshot /dev/vg_data/lv_data
# 2. 查看快照状态
lvdisplay /dev/vg_data/lv_data_snapshot
# 3. 从快照备份数据
mkdir -p /mnt/snapshot
mount -o ro /dev/vg_data/lv_data_snapshot /mnt/snapshot
# 使用tar备份快照数据
tar -czf /backup/data_backup_$(date +%Y%m%d).tar.gz -C /mnt/snapshot .
# 4. 备份完成后卸载并删除快照
umount /mnt/snapshot
lvremove -f /dev/vg_data/lv_data_snapshot
快照空间大小取决于快照存活期间原LV数据的变化量。对于高写入频率的数据库LV,建议快照空间设为原LV的10-20%;对于低写入频率的场景,5%即可。快照存活时间应尽量短,完成备份后立即删除,避免COW数据持续增长耗尽快照空间。
从快照恢复数据的操作:
# 方式1:合并快照回原LV(原LV必须卸载)
umount /data
lvconvert --merge /dev/vg_data/lv_data_snapshot
mount /dev/vg_data/lv_data /data
# 方式2:从快照创建新LV
lvcreate -L 100G -s -n lv_data_restored /dev/vg_data/lv_data_snapshot
LVM条带化与镜像高可用配置
对于高可用要求较高的场景,LVM支持LV级别的镜像(Mirror),类似于RAID 1。镜像LV在两块磁盘上维护数据副本,单盘故障时数据不丢失:
# 创建镜像LV(2份镜像)
lvcreate -L 100G -m 1 --mirrorlog disk -n lv_mirror vg_data
# 查看镜像状态
lvs -a -o name,copy_percent,devices vg_data
# 磁盘故障后替换
lvconvert -m 0 /dev/vg_data/lv_mirror /dev/sdb
vgreduce --removemissing vg_data
pvcreate /dev/sdd
vgextend vg_data /dev/sdd
lvconvert -m 1 /dev/vg_data/lv_mirror /dev/sdd
对于大规模存储环境,LVM还支持thin provisioning(精简配置),按实际使用量分配空间而非预分配全部容量:
# 创建thin pool
lvcreate -L 500G -T vg_data/lv_thinpool
# 从thin pool创建thin volume(可超分配)
lvcreate -V 1T -T vg_data/lv_thinpool -n lv_thin_data
# 监控thin pool使用率
lvs -o name,data_percent,metadata_percent vg_data
精简配置允许总thin volume容量超过实际物理空间,但需要监控thin pool使用率,在接近满时及时扩容,否则所有thin volume的写入操作都会失败。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-lvm-luo-ji-juan-guan-li-yu-kuai-zhao-bei-fen/