将单驱动器 LVM 卷转换为跨 3 个驱动器的条带卷

Tot*_*tor 7 storage lvm

在我使用 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)

Tot*_*tor 6

我终于找到了一个技巧

设置:假设我们的原始驱动器是/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)

以下是如何进行:

免责声明:我主要是根据回忆写的,请仔细检查命令(如果需要,请编辑帖子!)

  • 创建分区sdb1sdb2,分别为 42 MB 和 58 MB,
  • 同样的事情sdc
  • pvcreate /dev/sd{b,c}{1,2},
  • vgextend vg_orig /dev/sdb2 /dev/sdc2,
  • pvmove /dev/sda1将所有 LV 数据移动到sdb2sdc2
  • vgreduce vg_orig /dev/sda1并且pvremove /dev/sda1将LVM完全停止使用sda
  • 创建42 MB分区/dev/sda1(擦除如果需要前一个),和pvcreate /dev/sda1vgextend 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的倍数,在这种情况下,可以简单地添加1或2个延伸至这样的LV: lvextend -l +1 vg_orig/lv_orig
  • 用这个命令,我们将摆脱我们在数据的临时镜像拷贝sdb2sdc2lvconvert --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分区更大,因此删除sdb2sdc2分区并重新创建sda1,sdb1sdc1分区,使它们以相同的扇区号开始,但以更高的扇区号结束(不要害怕:)),
  • 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 这样的工具,据说是为这种操作而设计的,无法在单个(或两个)命令中轻松完成此任务......