在我使用 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
Run Code Online (Sandbox Code Playgroud)
我终于找到了一个技巧。
设置:假设我们的原始驱动器是/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|
|_______| |_______| |_______|
Run Code Online (Sandbox Code Playgroud)
以下是如何进行:
免责声明:我主要是根据回忆写的,请仔细检查命令(如果需要,请编辑帖子!)
sdb1
和sdb2
,分别为 42 MB 和 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
,/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
,lvextend -l +1 vg_orig/lv_orig
,sdb2
和sdc2
:lvconvert --type mirror --mirrors 0 vg_orig/lv_orig /dev/sd{b,c}2
,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 这样的工具,据说是为这种操作而设计的,无法在单个(或两个)命令中轻松完成此任务......