Storage

將單驅動器 LVM 卷轉換為跨 3 個驅動器的條帶捲

  • May 29, 2019

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

我終於找到了一個絕招

設置:假設我們的原始驅動器是/dev/sda(PV 是/dev/sda1),我們的兩個新驅動器是/dev/sdband /dev/sdc。所有驅動器都是 100 MB 大。

想法sdb:因為我們所有的數據都可以放在and的一半上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 的倍數,則前面的命令可能會失敗,在這種情況下,您可以像這樣簡單地將 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分區並重新創建sda1sdb1sdc1,分區,以便它們從相同的扇區號開始,但以更高的扇區號結束(不要害怕:)),
  • 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 這樣的工具,據說是為這種操作而設計的,不能用一個(或兩個)命令輕鬆完成這項任務……

引用自:https://unix.stackexchange.com/questions/348873