web-dev-qa-db-ja.com

シングルドライブLVMボリュームを3つのドライブにわたるストライプボリュームに変換

LVMを使用するサーバーでは、単一のドライブ(PV)に単純な線形LVがあります。次に、サーバーにさらに2つの(同じサイズの)ドライブ(PV)を追加しました。

既存のリニアLVを、可能であればオンラインで3つのドライブ間でストライプLV(RAID0のような)に変換したい。これにより、ストライピングのおかげでパフォーマンスを向上させることができます。私はそれが理論的に可能であることを知っています。

このウェブサイトのテクニック に基づいてLVのストライプミラーを作成するなど、さまざまなことを試しましたが、私の場合、元のドライブ(ウェブサイトでは、単一のドライブLVから3otherドライブへの移行です。

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
5
Totor

ついに見つけた 騙す 仕方。

セットアップ:元のドライブが/dev/sda(PVが/dev/sda1)で、2つの新しいドライブが/dev/sdb/dev/sdcだとします。すべてのドライブのサイズは100 MBです。

アイデア:すべてのデータはsdbsdcの半分に収まるため、一時的にそこにデータを配置し、その間にストライプミラーを作成できます。ドライブの他の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の使用を完全に停止するようにします。
  • 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の倍数でない場合、前のコマンドは失敗する可能性があります。その場合、次のように、LVに1または2の拡張を追加するだけです: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}2pvremove /dev/sd{b,c}2
  • これで、元のデータのストライプバージョンができましたが、それでもsd{a,b,c}1パーティションを大きくする必要があるため、sdb2およびsdc2パーティションを削除し、sda1sdb1および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を大きくします
  • オンラインで拡張したいextファイルシステムがある場合は、resize2fs vg_orig/lv_orig

どうぞ!

この種類の操作用に作成されたと思われるLVMのようなツールでは、1つ(または2つ)のコマンドでこのタスクを簡単に実行できないことはかなり混乱しています...

4
Totor