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

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

在我使用 LVM 的服务器上,我在单个驱动器 (PV) 上有一个简单的线性 LV。现在,我向服务器添加了另外 2 个(相同大小)驱动器 (PV)。

我想将现有的线性 LV 转换为跨 3 个驱动器的条带 LV(类似 RAID0),如果可能的话,在线转换。由于条带化,这将使我能够提高性能。我知道它是理论上可能的。

我尝试了很多东西,比如为我的 LV 创建一个条纹镜子,基于本网站技术,但就我而言,情况更复杂,因为我想继续使用原始驱动器(在网站上,这是从单驱动器 LV 迁移到 3其他驱动器)。

我越来越熟悉pvmovelvconvert和其他 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|
|_______| |_______| |_______|

以下是如何进行:

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

  • 创建分区sdb1sdb2,分别为 42 和 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/sda1LVM完全停止使用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
  • 使用此命令,我们将删除sdb2and中数据的临时镜像副本sdc2lvconvert --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 这样的工具,据称是为这种操作而设计的,却无法通过单个(或两个)命令轻松完成此任务......

答案2

我的解决方案是根据@Totor图,但是,我会通过在新的lvm raid0(在sdb和sdc上)上创建新文件系统来更改第二步。然后用 复制到它rsync -avP。然后在(sda1、sdb1、sdc1)上创建具有 3 个条带的新 raid0。然后从 2 个条带 rsync 到 3 个条带,并进行 lvresize/extend。只需复制 2 次。

相关内容