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。
物理卷的创建与初始化
创建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栈的稳定性和数据安全性。