16 - LVM 逻辑卷管理与快照
前提条件
- 已完成第 15 章磁盘分区(
/dev/sdb或/dev/sdb1已准备好,暂未格式化 / 挂载) - 以 root 身份登录,或 ops 用户执行
sudo -i切换至 root 环境 - 系统运行在 Debian 12 Bookworm
- VMware Workstation Pro:建议至少 2 块虚拟磁盘(系统盘 + 数据盘 ≥ 40 GB)
全局参数
主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops
LVM 卷组名 datavg,逻辑卷名 datalv,挂载点 /mnt/lvmdata
LVM 三层结构
物理卷(PV)→ 卷组(VG)→ 逻辑卷(LV)→ 文件系统 → 挂载点
PV 是底层磁盘/分区的抽象;VG 将多个 PV 合并成存储池;LV 从 VG 中按需划分,对上层表现为普通块设备。
详细步骤
1. 安装 LVM 工具
apt update
apt install -y lvm2
2. 查看当前 LVM 状态
| 命令 | 说明 |
|---|---|
pvs |
简洁列出所有物理卷 |
vgs |
简洁列出所有卷组 |
lvs |
简洁列出所有逻辑卷 |
pvdisplay |
物理卷详细信息 |
vgdisplay |
卷组详细信息(含空闲空间) |
lvdisplay |
逻辑卷详细信息 |
3. 创建物理卷(PV)
pvcreate /dev/sdb
# 若使用分区而非整盘:pvcreate /dev/sdb1
pvs
检查点
pvs 输出中显示 /dev/sdb,PSize 列显示磁盘容量。
4. 创建卷组(VG)
vgcreate datavg /dev/sdb
# 多块磁盘组成卷组:vgcreate datavg /dev/sdb /dev/sdc
vgs
检查点
vgs 输出中显示 datavg,VFree 列显示全部可用空间。
5. 创建逻辑卷(LV)
# 创建固定大小的逻辑卷
lvcreate -L 20G -n datalv datavg
# 或使用全部剩余空间(-l 100%FREE)
# lvcreate -l 100%FREE -n datalv datavg
lvs
检查点
lvs 输出中显示 datalv,LSize 为 20.00g,VG 为 datavg。
6. 格式化并挂载逻辑卷
mkfs.xfs -f -L datalv /dev/datavg/datalv
mkdir -p /mnt/lvmdata
mount /dev/datavg/datalv /mnt/lvmdata
df -h /mnt/lvmdata
永久挂载(fstab):
blkid /dev/datavg/datalv
vim /etc/fstab
添加行:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/lvmdata xfs defaults,noatime 0 2
测试:
umount /mnt/lvmdata
mount -a
df -h /mnt/lvmdata
检查点
mount -a 无报错,df -h /mnt/lvmdata 显示约 20 GB 可用空间。
7. LVM 快照创建与恢复
LVM 快照基于 COW(Copy-on-Write) 机制:快照创建时不复制数据,只记录原卷此后发生的变更。快照空间只用于存储"原卷变更前的旧数据"。
创建测试数据:
touch /mnt/lvmdata/testfile{1..5}.txt
ls /mnt/lvmdata
创建快照(为原卷预留 5 GB COW 空间):
lvcreate -L 5G -s -n datalv_snap /dev/datavg/datalv
lvs
| lvs 字段 | 说明 |
|---|---|
Attr 含 s |
该卷为快照 |
Origin |
快照来源的原始逻辑卷 |
Data% |
快照 COW 空间已使用百分比 |
模拟数据破坏并恢复:
# 模拟误删
rm -f /mnt/lvmdata/testfile*.txt
ls /mnt/lvmdata # 文件已消失
# 卸载原卷,合并快照
umount /mnt/lvmdata
lvconvert --merge /dev/datavg/datalv_snap
# 提示需要重新激活或重启后生效
# 重新激活卷(无需重启)
lvchange -an /dev/datavg/datalv
lvchange -ay /dev/datavg/datalv
mount /dev/datavg/datalv /mnt/lvmdata
ls /mnt/lvmdata # testfile* 已恢复
快照空间不足的后果
若快照的 Data% 达到 100%(原卷写入量超过快照预留空间),快照自动失效,无法用于恢复。生产环境中快照空间应设为原卷预期变更量的 120% 以上,并监控 Data%。
检查点
合并后 ls /mnt/lvmdata 看到 5 个 testfile*.txt 文件恢复,lvs 中快照条目消失。
8. 在线扩展逻辑卷(零停机)
LVM + xfs 支持在挂载状态下扩容,无需停服:
# 两步缺一不可:先扩 LV,再扩文件系统
lvextend -L +10G /dev/datavg/datalv # 扩展块设备 +10G
xfs_growfs /mnt/lvmdata # 同步扩展 xfs 文件系统
# ext4 文件系统使用:resize2fs /dev/datavg/datalv
df -h /mnt/lvmdata # 确认新容量(约 30 GB)
两步缺一不可
lvextend 只扩展了块设备边界,文件系统尚未感知新空间。必须紧接着执行 xfs_growfs(xfs)或 resize2fs(ext4),否则 df 显示的可用空间不变。
9. 扩展卷组(添加新物理卷)
当卷组空间耗尽时,添加新磁盘扩展:
pvcreate /dev/sdc
vgextend datavg /dev/sdc
vgs # VFree 空间增加
lvextend -l +100%FREE /dev/datavg/datalv # 使用新增的全部空间
xfs_growfs /mnt/lvmdata
实践任务
- 创建物理卷、卷组
datavg、逻辑卷datalv(20 GB),格式化为 xfs 并挂载到/mnt/lvmdata - 在
/mnt/lvmdata上创建 5 个测试文件,创建 5 GB 快照datalv_snap - 删除
/mnt/lvmdata中的测试文件,通过合并快照恢复数据,验证文件已恢复 - 将
datalv扩展 10 GB 并用xfs_growfs在线扩容,用df -h验证新容量
自测问题
1. LVM 快照基于什么机制实现,空间不足时会发生什么?
LVM 快照基于 COW(Copy-on-Write,写时复制) 机制。快照创建的瞬间不复制任何数据(几乎零时延),快照只是原卷在该时刻的"指针集合"。此后每当原卷上的某个数据块被修改,内核会先将该块的旧内容复制到快照的 COW 区域,再写入新内容。快照始终指向旧数据,实现"回到过去"的效果。
若快照 COW 空间耗尽(Data% = 100%),快照自动标记为 invalid,所有读取快照的操作都会失败,无法再用于恢复。监控命令:lvs -o +data_percent /dev/datavg/datalv_snap。
2. 如何在线扩展 xfs 文件系统上的逻辑卷而不卸载?
两步操作(顺序不可颠倒):
lvextend -L +10G /dev/datavg/datalv # 步骤1:扩展 LV 块设备
xfs_growfs /mnt/lvmdata # 步骤2:扩展 xfs 文件系统
xfs 的 xfs_growfs 支持在挂载(在线)状态下扩展,无需卸载文件系统,业务零中断。ext4 对应命令为 resize2fs /dev/datavg/datalv,同样支持在线扩展。
3. lvcreate -s 命令中的 -s 参数代表什么?
-s 是 --snapshot 的缩写,指定创建的是快照逻辑卷而非普通逻辑卷。完整命令格式为:
lvcreate -L <快照COW空间大小> -s -n <快照名> <原始逻辑卷路径>
-L 参数在快照创建时指定的是 COW 区域大小(非数据大小),应根据快照生命周期内原卷预期写入量来估算。
4. 如果卷组 datavg 空间不足,如何添加新物理卷?
# 1. 准备新磁盘/分区
pvcreate /dev/sdc
# 2. 将新 PV 加入现有 VG(在线操作,无需停服)
vgextend datavg /dev/sdc
# 3. 验证 VG 空间已扩大
vgs # VFree 增加
# 4. 扩展 LV 使用新增空间
lvextend -l +100%FREE /dev/datavg/datalv
xfs_growfs /mnt/lvmdata
整个过程无需卸载文件系统,业务零中断。vgextend 支持同时添加多个 PV:vgextend datavg /dev/sdc /dev/sdd。
总结
LVM 是 Debian 生产环境中数据盘管理的事实标准,提供灵活的在线扩容、快照回滚和跨磁盘聚合能力。快照功能特别适合数据库备份前一致性保障、测试环境快速回滚、误删恢复等场景。后续章节的 NFS 共享、备份策略、数据库数据目录都将优先使用 LVM 逻辑卷。