4. LVM架构与物理卷管理

LVM(Logical Volume Manager,逻辑卷管理器)是RHEL中用于在物理存储与文件系统之间增加一层抽象的核心机制。它的价值在于把“磁盘分区大小固定、扩容困难”的问题转化为“存储池按需分配、在线调整”的能力。理解LVM,首先要建立三个层次的对象概念:PV(Physical Volume,物理卷)、VG(Volume Group,卷组)和LV(Logical Volume,逻辑卷)。

PV是LVM的最底层,它可以是整块磁盘(如 /dev/sdb)、一个分区(如 /dev/sdb1),也可以是多路径聚合后的设备(如 /dev/mapper/mpatha)。PV并不直接承载文件系统,而是被“初始化”为LVM可识别的元数据容器。VG由一个或多个PV组成,是容量池,所有PV的空间汇总后由VG统一管理。LV从VG中划分出来,是最终可以被格式化为文件系统、挂载使用的逻辑设备。三者关系可以概括为:PV汇聚成VG,VG切分出LV。

LVM 三层架构与物理卷管理关系 PV 物理卷层(Physical Volume) /dev/sdb 整盘 PV /dev/sdc1 分区 PV /dev/mapper/mpatha 多路径 PV pvcreate 初始化 写入 LVM 元数据 VG 卷组层(Volume Group)— 容量池 vg_data = PV1 + PV2 + PV3 → 统一 PE 分配单元(默认 4MiB) LV 逻辑卷层(Logical Volume)— 可格式化、可挂载 lv_root → / (xfs) lv_home → /home(xfs) lv_swap → swap

物理卷的创建与初始化

创建PV使用 pvcreate 命令。它的作用是在块设备上写入LVM标签(label)和元数据区,使该设备被LVM识别。执行前需要确认设备未被挂载、未被其他文件系统占用,否则会破坏原有数据。

# 查看块设备
lsblk

# 将 /dev/sdb 初始化为物理卷
pvcreate /dev/sdb

# 同时初始化多个设备
pvcreate /dev/sdc1 /dev/sdd1

# 强制覆盖已有文件系统签名(谨慎)
pvcreate -ff /dev/sdb

初始化完成后,可以用 pvdisplay 查看PV的详细信息,包括PV名称、所属VG、PV大小、PE大小、已分配/空闲PE数量等。如果PV尚未加入任何VG,VG Name一栏会显示为空。

pvdisplay /dev/sdb

# 简洁列表形式
pvs
pvs -o pv_name,vg_name,pv_size,pv_free,pv_used

其中PE(Physical Extent)是LVM分配的最小单位,默认4MiB。PV加入VG时会被划分为若干PE,LV的容量实际上是PE数量的整数倍。因此,如果创建一个100MiB的LV,实际占用的是25个PE(100/4=25)。理解PE有助于解释为什么LV大小有时与预期略有差异。

物理卷的检查与修复

pvck 用于检查PV的LVM元数据一致性。它不会修改数据,只做诊断。当系统出现“PV not found”“VG incomplete”等异常时,pvck是排查的第一步。

# 检查指定PV
pvck /dev/sdb

# 检查所有PV
pvck --all

# 显示详细信息
pvck -v /dev/sdb

如果pvck报告元数据损坏,可以尝试用 pvck --repair 从VG的其他元数据副本恢复。LVM默认在VG中保存多份元数据副本,因此单个PV的元数据损坏通常不会导致整个VG不可用。但修复前应确认没有其他PV同时故障,并尽量先备份 /etc/lvm/backup/ 下的VG描述文件。

注意:pvck --repair 会写入元数据,操作前应确保VG未处于活动写入状态,必要时先 vgchange -an vg_name 停用卷组。生产环境建议先在测试环境验证修复流程。

多路径设备作为PV的注意事项

在SAN或iSCSI环境中,同一块LUN可能通过多条路径被主机看到,例如 /dev/sdb 和 /dev/sdc 实际指向同一存储块。如果直接对其中一条路径执行 pvcreate,LVM会把它当作独立设备,导致同一LUN被重复初始化,进而出现PV重复、VG元数据冲突甚至数据损坏。

正确做法是先由 multipathd 将多条路径聚合为一个多路径设备,通常位于 /dev/mapper/mpathX 或 /dev/mapper/WWID。然后只对这个聚合设备执行 pvcreate。同时需要在 /etc/lvm/lvm.conf 中配置过滤器,排除底层单路径设备,避免LVM扫描到重复PV。

# 查看多路径设备
multipath -ll

# 确认聚合设备
ls -l /dev/mapper/mpatha

# 只对多路径设备创建PV
pvcreate /dev/mapper/mpatha

# 在 lvm.conf 中过滤底层路径
filter = [ "a|/dev/mapper/mpath.*|", "r|/dev/sd.*|" ]

配置过滤器后,应执行 pvscan 确认LVM只识别到多路径设备,而不是每个单路径。如果发现重复PV,可用 pvdisplay 对比PV UUID,相同UUID的PV说明是同一LUN的重复视图,必须通过过滤器消除。

实践建议:多路径环境下,PV、VG、LV的所有操作都应针对 /dev/mapper/ 下的聚合设备,不要使用 /dev/sdX。同时在 /etc/lvm/lvm.conf 中设置 multipath_component_detection = 1,让LVM自动忽略多路径组件设备。

PV管理常用操作速查

操作 命令 说明
创建PV pvcreate /dev/sdb 初始化块设备为物理卷
查看PV pvdisplay /dev/sdb 显示PV详细信息
简要列表 pvs 一行一个PV,便于脚本处理
扫描PV pvscan 扫描系统中所有PV
检查PV pvck /dev/sdb 检查元数据一致性
移除PV pvremove /dev/sdb 清除LVM标签,需先移出VG
迁移数据 pvmove /dev/sdb 将PV上的数据迁移到同VG其他PV

需要特别强调的是,PV一旦加入VG,就不能随意用 pvremove 删除。正确顺序是:先用 pvmove 把该PV上的数据迁走,再用 vgreduce 将其从VG中移除,最后才能 pvremove。跳过pvmove直接vgreduce,如果PV上仍有LV数据,操作会被拒绝或导致数据丢失。

掌握PV、VG、LV三层关系以及pvcreate、pvdisplay、pvck的实际用法,是后续创建卷组、划分逻辑卷、在线扩容和快照管理的基础。尤其在多路径存储环境中,PV层的正确识别与过滤,直接决定了整个LVM栈的稳定性和数据安全性。