在我使用 LVM 的服务器上,我在单个驱动器 (PV) 上有一个简单的线性 LV。现在,我向服务器添加了另外 2 个(相同大小)驱动器 (PV)。
我想将现有的线性 LV 转换为跨 3 个驱动器的条带 LV(类似 RAID0),如果可能的话,在线转换。由于条带化,这将使我能够提高性能。我知道它是理论上可能的。
我尝试了很多东西,比如为我的 LV 创建一个条纹镜子,基于本网站技术,但就我而言,情况更复杂,因为我想继续使用原始驱动器(在网站上,这是从单驱动器 LV 迁移到 3其他驱动器)。
我越来越熟悉pvmove
、lvconvert
和其他 LVM 工具,但没有成功。请帮忙。 :)
如果需要,我在另一个驱动器上几乎没有额外空间(大约是原始 LV 大小的 5%)。
我lvdisplay -m
的如下:
--- Logical volume ---
LV Path /dev/vg_space/vol_space
LV Name vol_space
VG Name vg_space
LV Status available
# open 1
LV Size 260.75 GiB
Current LE 66752
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Segments ---
Logical extent 0 to 66751:
Type linear
Physical volume /dev/sda5
Physical extents 0 to 66751
答案1
我终于找到了一个窍门。
设置:假设我们原来的驱动器是/dev/sda
(PV 是/dev/sda1
),我们的两个新驱动器是/dev/sdb
和/dev/sdc
。所有驱动器均为 100 MB 大。
这个想法:因为我们所有的数据都可以放在 和 的一半上sdb
,所以sdc
我们可以暂时将数据放在那里,同时在驱动器的另外 3 半上创建 LV 的条带镜像。然后,去掉(临时)镜子的原始一侧,并将我们的条纹 LV 扩展到全尺寸。
这件美妙的艺术品应该更好地解释:
original state:
sda sdb sdc
_______ _______ _______
| | | | | |
| | | | | |
|lv_orig| | empty | | empty |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
|_______| |_______| |_______|
partition sdb & sdc, pvmove, then partition sda:
sda sdb sdc
_______ _______ _______
| | | | | |
| sda1 | | sdb1 | | sdc1 |
| empty | | empty | | empty |
|_______| |_______| |_______|
| | | | | |
| sda2 | |lv_orig| |lv_orig| <= linear on 2 drives
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|
add sda{1,2,3} to vg, mirror the LV on this in striped mode:
sda sdb sdc
_______ _______ _______
|lv_orig| |lv_orig| |lv_orig|
|mirror | |mirror | |mirror | <= striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
| | | | | |
| sda2 | |lv_orig| |lv_orig|
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|
get rid of the sd{b,c}2 side of the mirror:
sda sdb sdc
_______ _______ _______
| | | | | |
|lv_orig| |lv_orig| |lv_orig| <= still striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
| | | | | |
| sda2 | | sdb2 | | sdc2 |
| empty | | empty | | empty |
|_______| |_______| |_______|
delete sd{a,b,c}2 partitions to extend sd{a,b,c}1 on the whole disk,
finally, extend the lv:
sda sdb sdc
_______ _______ _______
| | | | | |
| sda1 | | sdb1 | | sdc1 |
| | | | | |
|lv_orig| |lv_orig| |lv_orig| <= definitely striped!
| | | | | |
|bigger&| |bigger&| |bigger&|
|striped| |striped| |striped|
|_______| |_______| |_______|
以下是如何进行:
免责声明:我主要是根据记忆写的,请仔细检查命令(并根据需要编辑帖子!)
- 创建分区
sdb1
和sdb2
,分别为 42 和 58 MB, - 同样的事情对于
sdc
, pvcreate /dev/sd{b,c}{1,2}
,vgextend vg_orig /dev/sdb2 /dev/sdc2
,pvmove /dev/sda1
将把所有 LV 数据移至sdb2
和sdc2
,vgreduce vg_orig /dev/sda1
并使pvremove /dev/sda1
LVM完全停止使用sda
,- 创建一个 42 MB 分区
/dev/sda1
(如果需要,擦除前一个分区),并且pvcreate /dev/sda1
,vgextend vg_orig dev/sd{a,b,c}1
, lvconvert --type mirror --mirrors 1 --stripes 3 vg_orig/lv_orig /dev/sd{a,b,c}1
将创建我们原始 LV 卷的剥离镜像(我们正在寻找的!),您可以使用查看详细信息lvdisplay -am
,- 如果 LV 中的扩展总数不是 3 的倍数,则前面的命令可能会失败,在这种情况下,您可以简单地向 LV 添加 1 或 2 个扩展,如下所示
lvextend -l +1 vg_orig/lv_orig
: - 使用此命令,我们将删除
sdb2
and中数据的临时镜像副本sdc2
:lvconvert --type mirror --mirrors 0 vg_orig/lv_orig /dev/sd{b,c}2
- 删除我们不再需要的 sdX2 分区:
vgreduce vg_orig /dev/sd{b,c}2
,pvremove /dev/sd{b,c}2
, - 现在我们有了原始数据的条带版本,我们仍然需要使分区
sd{a,b,c}1
更大,因此删除sdb2
和sdc2
分区并重新创建sda1
,sdb1
和sdc1
, 分区,以便它们以相同的扇区号开始,但以更高的扇区号结束(不要害怕:)), partprobe /dev/sd{a,b,c}1
刷新内核分区表,pvresize /dev/sd{a,b,c}1
让LVM意识到PV更大,lvextend -l 100%VG vg_orig/lv_orig
现在把LV做大,resize2fs vg_orig/lv_orig
如果您有一个想要在线扩展的 ext 文件系统。
干得好!
让我感到非常困惑的是,像 LVM 这样的工具,据称是为这种操作而设计的,却无法通过单个(或两个)命令轻松完成此任务......
答案2
我的解决方案是根据@Totor图,但是,我会通过在新的lvm raid0(在sdb和sdc上)上创建新文件系统来更改第二步。然后用 复制到它rsync -avP
。然后在(sda1、sdb1、sdc1)上创建具有 3 个条带的新 raid0。然后从 2 个条带 rsync 到 3 个条带,并进行 lvresize/extend。只需复制 2 次。