跳转至

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/sdbPSize 列显示磁盘容量。

4. 创建卷组(VG)

vgcreate datavg /dev/sdb
# 多块磁盘组成卷组:vgcreate datavg /dev/sdb /dev/sdc
vgs

检查点

vgs 输出中显示 datavgVFree 列显示全部可用空间。

5. 创建逻辑卷(LV)

# 创建固定大小的逻辑卷
lvcreate -L 20G -n datalv datavg

# 或使用全部剩余空间(-l 100%FREE)
# lvcreate -l 100%FREE -n datalv datavg

lvs

检查点

lvs 输出中显示 datalvLSize20.00gVGdatavg

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 字段 说明
Attrs 该卷为快照
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

实践任务

  1. 创建物理卷、卷组 datavg、逻辑卷 datalv(20 GB),格式化为 xfs 并挂载到 /mnt/lvmdata
  2. /mnt/lvmdata 上创建 5 个测试文件,创建 5 GB 快照 datalv_snap
  3. 删除 /mnt/lvmdata 中的测试文件,通过合并快照恢复数据,验证文件已恢复
  4. 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 逻辑卷。