我正在重新安排家里服务器上的一堆磁盘,发现自己想要将一堆 LVM 逻辑卷移动到另一个卷组。有没有简单的方法可以做到这一点?我看到提到了一个cplv
命令,但这似乎要么是旧的,要么不是 Linux 上曾经可用的东西。
答案1
如果您可以将逻辑卷安排在与源卷组其余部分不同的物理卷子集上(lvconvert sourcevg/sourcelv /dev/pv1 ...
可能会有帮助),您可以使用vgsplit
它将 lv 分离到新的 vg 中,vgmerge
并将新的 vg 合并到目标 vg 中。
尽管 LVM 具有镜像功能,但您不能(理智地)使用它在卷组之间进行复制,因为镜像的两个分支必须位于同一个卷组 (vg) 上,并且关联不可破坏。
您可以将一个 LVM 卷复制到另一个卷,就像将任何卷复制到另一个卷一样:创建适当大小的目标 lv,然后使用 复制内容dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M
。如果源卷处于活动状态,您可以利用 LVM 进行一致的复制:首先使用 对源 lv 进行快照lvcreate -s
,然后复制快照。
答案2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1
pvmove 可以在物理卷之间移动数据:LVM 管理员指南
答案3
从 Debian 延伸版 (9.0) 中的 LVM(即 2.02.168-2)开始,可以使用 、 和 的组合跨卷组复制逻辑卷vgmerge
。lvconvert
由于vgsplit
移动是复制和删除的组合,因此这也适用于移动。
或者,您也可以使用pvmove
来移动物理范围。引用U&L:物理范围的目的:
单个物理范围是 LVM 可以单独管理的最小磁盘空间单位。
使用循环设备的完整独立示例会话
lvconvert
如下。
摘要:我们创建vg1
具有逻辑卷的卷组lv1
,并vg2
具有,并在中lv2
复制。lv1
vg2
创建文件。
truncate pv1 --size 100MB
truncate pv2 --size 100MB
在文件上设置循环设备。
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
在循环设备上创建物理卷(初始化循环设备以供 LVM 使用)。
pvcreate /dev/loop1 /dev/loop2
分别在/dev/loop1和/dev/loop2上创建卷组vg1和vg2。
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
在vg1和vg2上分别创建逻辑卷lv1和lv2。
lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
在 lv1 和 lv2 上创建 ext4 文件系统。
mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
可选地,在 lv1 上写一些内容,以便您稍后可以检查副本是否正确创建。使 vg1 处于非活动状态。
vgchange -a n vg1
在测试模式下运行合并命令。这会将 vg1 合并到 vg2 中。
vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1
然后才是真正的。
vgmerge -A y -l -v vg2 vg1
lv1
然后使用创建 RAID 1 镜像对lvconvert
。
dest-pv
参数指示lvconvert
在 上创建镜像副本/dev/loop2
。
lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
然后分割镜像。新的 LV 现在是lv1_copy
。
lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1
使其vg2/lv1
不活动。
lvchange -a n /dev/vg2/lv1
然后(测试模式)
vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
真正的
vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
结果输出:
lvs
[...]
lv1 vg1 -wi-a----- 12.00m
lv1_copy vg2 -wi-a----- 12.00m
lv2 vg2 -wi-a----- 12.00m
笔记:
大多数命令都需要以 root 身份运行。
如果两个卷组中的逻辑卷名称有任何重复,
vgmerge
将拒绝继续。合并时, 中的逻辑卷必须处于非活动状态。拆分时,中
vg1
的逻辑卷必须处于非活动状态。在我们的例子中,这是。vg2
vg1
lv1
答案4
“pvmove -n lvol1 /dev/sdb1 /dev/sdc1”应该如果两个磁盘都在同一个卷组中,则可行……否则会失败并出现此错误
pvmove -v -n vm-100-disk-1 /dev/sda3 /dev/sdb1
Physical Volume "/dev/sdb1" not found in Volume Group "pve".
如果 LV 很薄(例如:Proxmox 的默认值),它也可能会失败,因为 PVMove 假定为 LINEAR 类型。
lvdisplay -m
--- Logical volume ---
LV Path /dev/pve/vm-100-disk-1
LV Name vm-100-disk-1
VG Name pve
LV Pool name data
LV Size 100.00 GiB
Current LE 25600
Segments 1
--- Segments ---
Virtual extents 0 to 25599:
Type thin
而厚书卷:
--- Logical volume ---
LV Path /dev/pve/swap
...
--- Segments ---
Logical extents 0 to 2047:
Type linear
Physical volume /dev/sda3
Physical extents 0 to 2047
你也无法转换它
lvconvert --type linear /dev/pve/vm-100-disk-1
Operation not permitted on LV pve/vm-100-disk-1 type thin.
如果你尝试将精简卷移动到不同的 PV(磁盘)...它会给出错误消息
pvmove -v -n vm-100-disk-1 /dev/sda3 /dev/sdb1
Creating logical volume pvmove0
No data to move for pve.
因此,无论 LV 类型如何或 PV 位于何处(不同的 VG),OP 的解决方案是 1 - 在备用磁盘上创建 PV 2 - 使用 DD 移动数据,3 - 删除旧 LV,4 - 将新 LV 重命名为与旧 LV 相同的名称
# format disk partition as LVM
pvcreate /dev/sdX1
# add new PV to a new VG (or re-use an existing VG)
vgcreate VOLGROUP /dev/sdX1
# Create new LV
lvcreate -L 100G -n vm-100-disk-1-NEW VOLGROUP
# migrate data over, now it will be thick
dd if=/dev/pve/vm-100-disk-1 of=/dev/VOLGROUP/vm-100-disk-1-NEW bs=1M conv=fdatasync status=progress
# you may want to double check your new data is good first
# remove the old data
lvremove -v pve/vm-100-disk-1
# rename the new LV into the old name
lvrename /dev/VOLGROUP/vm-100-disk-1-NEW /dev/VOLGROUP/vm-100-disk-1