web-dev-qa-db-ja.com

論理ボリュームをあるボリュームグループから別のボリュームグループに移動する

論理ボリュームをあるボリュームグループから別のボリュームグループ全体に移動することはできますか?

(多かれ少なかれ)一致するlvを作成してデータをコピーすることは可能ですが、LVMツールだけでこれを行う方法はありますか?

そうでない場合、理論的な理由または技術的な制限(エクステントサイズ)はありますか?

18
XTL

ボリュームグループは、物理ボリューム全体で構成されています。物理ボリュームは多くのエクステントで構成されます(エクステントは通常4MBです)。各エクステントは異なる論理ボリュームに属している場合があります。論理ボリュームを別のグループに転送するには、エクステントを単純に転送することはできません。これは、ソースVGとターゲットVGの間で物理ボリュームを分割する可能性があるためです。

vgsplit コマンドを使用して、1つ以上のPVをソースVGからターゲットVGに転送できます。転送するPVまたはLVを指定できます(ただし、一度に1つだけ)。 LVを指定する場合は、LVとソースVG内の他のLVが別々のPV上にある必要があります。指定された名前のVGが存在しない場合、宛先VGが作成されます。

vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99

移動する論理ボリュームを別々のPVに配置するために、最初に pvmove を使用する必要がある場合があります。

VGの物理的な境界を保持してデータを移動するつもりなら、組み込みのツールはありませんが、 ミラーを作成してから元のイメージを削除 することはできます。

DebianストレッチのLVM(9.0)、つまり2.02.168-2以降、vgmergelvconvert、およびの組み合わせを使用して、ボリュームグループ間で論理ボリュームのコピーを行うことが可能です。 vgsplit。移動はコピーと削除の組み合わせなので、これは移動にも有効です。

または、pvmoveを使用して、ボリュームを移動することもできます。

ループデバイスとlvconvertを使用した完全な自己完結型のサンプルセッションが続きます。

概要:論理ボリュームvg1でボリュームグループlv1を作成し、vg2lv2を作成し、lv1vg2のコピーを作成します。

ファイルを作成します。

truncate pv1 --size 100MB
truncate pv2 --size 100MB

ファイルにループデバイスを設定します。

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

ループデバイスに物理ボリュームを作成します(LVMで使用するためにループデバイスを初期化します)。

pvcreate /dev/loop1 /dev/loop2

/ dev/loop1と/ dev/loop2にそれぞれボリュームグループvg1とvg2を作成します。

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

論理ボリュームlv1とlv2をそれぞれvg1とvg2に作成します。

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Lv1とlv2にext4ファイルシステムを作成します。

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

必要に応じて、lv1に何かを書き込んで、後でコピーが正しく作成されたことを確認できるようにします。 vg1を非アクティブにします。

vgchange -a n vg1

テストモードでマージコマンドを実行します。これにより、vg1がvg2にマージされます。

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

そして実際に。

vgmerge -A y -l -v vg2 vg1

次に、lvconvertを使用してlv1からRAID 1ミラーペアを作成します。 dest-pv引数は、lvconvert/dev/loop2にミラーコピーを作成するように指示します。

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

次に、ミラーを分割します。新しいLVはlv1_copyになりました。

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

vg2/lv1を非アクティブにします。

lvchange -a n /dev/vg2/lv1

次に(テストモード)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

まじ?実際に

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

結果の出力:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

ノート:

1)これらのコマンドのほとんどは、rootとして実行する必要があります。

2)2つのボリュームグループの論理ボリュームの名前に重複がある場合、vgmergeは続行を拒否します。

3)マージ時には、vg1の論理ボリュームは非アクティブでなければなりません。また、分割時に、vg2に属するvg1の論理ボリュームは非アクティブでなければなりません。私たちの場合、これはlv1です。

9
Faheem Mitha

私は自分のものを提供します:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

すべてが良ければソースを削除

lvremove vgsource/lv0
3
conan

この質問に対する正確な答えは次のとおりです。「いいえ、(論理的に)移動あるボリュームグループ(VG1)から別の(VG2)への論理ボリューム(LV)はできません。データは物理的にコピーされました。」

理由:論理ボリュームデータは、特定のボリュームグループに割り当てられたブロックデバイス(ディスク、パーティション)に物理的に保存されます。 移動/dev/sda/dev/sdbで構成されるVG1から/dev/sdcで構成されるVG2への論理ボリュームは、move/dev/sdaからのデータまたは/dev/sdbから/dev/sdcへのデータ物理的なcopy少なくとも2つのブロックデバイス(またはパーティション)間の操作。

追伸すべてのLVデータがVG1から完全に除外できる物理ボリュームに格納されている場合、この物理ボリュームをVG2に割り当てることができます。しかし、それは物理ボリュームをあるボリュームグループから別のボリュームグループに移動することであり、論理ボリュームの移動ではありません。

1
Krzysztof