LVMを使用するサーバーでは、単一のドライブ(PV)に単純な線形LVがあります。次に、サーバーにさらに2つの(同じサイズの)ドライブ(PV)を追加しました。
既存のリニアLVを、可能であればオンラインで3つのドライブ間でストライプLV(RAID0のような)に変換したい。これにより、ストライピングのおかげでパフォーマンスを向上させることができます。私はそれが理論的に可能であることを知っています。
このウェブサイトのテクニック に基づいてLVのストライプミラーを作成するなど、さまざまなことを試しましたが、私の場合、元のドライブ(ウェブサイトでは、単一のドライブLVから3otherドライブへの移行です。
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
)で、2つの新しいドライブが/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|
|_______| |_______| |_______|
これが続行する方法です:
免責事項:私はこれをほとんど思い出に基づいて書きました、コマンドを再確認してください(そして必要に応じて投稿を編集してください!)
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
は、PVが大きいことをLVMに認識させます。lvextend -l 100%VG vg_orig/lv_orig
でLVを大きくしますresize2fs vg_orig/lv_orig
。どうぞ!
この種類の操作用に作成されたと思われるLVMのようなツールでは、1つ(または2つ)のコマンドでこのタスクを簡単に実行できないことはかなり混乱しています...