Storage
將單驅動器 LVM 卷轉換為跨 3 個驅動器的條帶捲
在我使用 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/sdb
and/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| |_______| |_______| |_______|
以下是如何進行:
免責聲明:我主要是根據記憶寫的,請仔細檢查命令(如果需要,請編輯文章!)
- 創建分區
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 的倍數,則前面的命令可能會失敗,在這種情況下,您可以像這樣簡單地將 1 或 2 個擴展添加到 LV
lvextend -l +1 vg_orig/lv_orig
:- 使用此命令,我們將擺脫我們擁有的數據的臨時鏡像副本
sdb2
和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 這樣的工具,據說是為這種操作而設計的,不能用一個(或兩個)命令輕鬆完成這項任務……