pvmove 不能直接按逻辑卷迁移,因其粒度为物理扩展(pe)且不识别lv边界;需先用 lvs -o +seg_pe_ranges 查出目标lv在源pv上的精确pe区间(如/dev/sdb1:128-255),再以 pvmove /dev/sdb1:128-255 /dev/sdc1 指定迁移,最后验证并清理。

不能直接用 pvmove 搬迁“特定逻辑卷的数据分片”,因为 pvmove 的操作粒度是物理扩展(PE),不识别 LV 边界;它按 PE 顺序迁移,不区分属于哪个 LV。但你可以通过限定范围、结合 LV 映射信息,实现“仅迁移某 LV 占用的那些 PE”——本质是精准指定源 PV 上该 LV 实际占用的 PE 区域。
确认目标 LV 在源 PV 上实际占用的 PE 范围
这是最关键的前置步骤。LVM 不提供直接“查某 LV 在某 PV 上占哪些 PE”的命令,需组合查询:
- 用
lvs -o +seg_pe_ranges [VG/LV]查看该 LV 各段(segment)在哪些 PV 上、起始 PE 编号及长度,例如:lvs -o +seg_pe_ranges myvg/mylv
输出中PE Ranges列会显示类似/dev/sdb1:128-255,表示该段数据在/dev/sdb1的 PE 128 到 255(含)。 - 若 LV 有多个线性段或镜像/条带结构,需逐段检查;只关注源 PV(如
/dev/sdb1)上出现的区间。 - 注意:PE 编号从 0 开始,范围是闭区间(含首尾)。
使用 pvmove 指定 PE 范围进行迁移
一旦获得精确 PE 区间(如 128-255),即可只搬这些 PE:
- 基本语法:
pvmove /dev/sdb1:128-255 /dev/sdc1
表示将/dev/sdb1的 PE 128 至 255 全部迁移到/dev/sdc1(目标 PV 需有足够空闲 PE)。 - 可一次指定多个不连续区间,用逗号分隔:
pvmove /dev/sdb1:0-63,/dev/sdb1:128-191 /dev/sdc1 - 不指定目标 PV 时,LVM 自动选 VG 内其他空闲 PV:
pvmove /dev/sdb1:128-255
验证迁移结果并清理(可选)
迁移完成后务必验证,避免误操作导致数据错位:
- 再次运行
lvs -o +seg_pe_ranges [VG/LV],确认原 PV 上已无该 LV 的 PE 区间。 - 用
pvs -o +pe_start,pe_count,pe_alloc /dev/sdb1查看源 PV 的 PE 分配状态,确认对应区间已释放。 - 如果目标是彻底移除源 PV,且它已无任何 LV 数据,再执行
vgreduce [VG] /dev/sdb1。
注意事项与常见误区
这类操作对精度要求高,稍有不慎可能影响数据一致性:
- 不能依赖 lvdisplay 的 “LV Size” 或 “Data%” 推算 PE 范围 —— 因为 LV 可能稀疏、有快照、跨多个 PV 或含元数据区域。
- 迁移过程中禁止修改该 LV(写入、resize、snapshot),否则 PE 映射可能动态变化,导致迁移不完整或冲突。
- 目标 PV 必须属于同一 VG,且空闲 PE 总数 ≥ 迁移 PE 数量。
- 如果 LV 使用了 striping 或 mirroring,
seg_pe_ranges会列出所有镜像/条带副本的位置,需分别处理各副本所在 PV 的对应区间。











