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


18

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

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

そうでない場合、理論的な理由または技術的な制限(範囲サイズ)がありますか?

回答:


13

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

できることは、vgsplitコマンドを使用して、ソースVGからターゲットVGに1つ以上のPVを転送することです。転送する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

使用する必要があるかもしれません pvmove最初して、移動する論理ボリュームを個別のPVに配置ます。

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


target_groupは既存のものであるように見えますか?
XTL

8

Debianのストレッチ(9.0)、即ち2.02.168-2でLVMのように、それはの組み合わせを使用してボリュームグループにまたがる論理ボリュームのコピーを行うことが可能だvgmergelvconvertvgsplit。移動はコピーと削除の組み合わせであるため、これは移動に対しても機能します。

または、pvmoveボリュームを移動するだけに使用できます。

ループデバイスを使用した完全な自己完結型のセッション例と lvconvert次のとおりです。

要約:vg1論理ボリュームlv1、およびvg2でボリュームグループを作成しlv2lv1inのコピーを作成しますvg2ます。

ファイルを作成します。

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

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

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

次に、を使用してRAID 1ミラーペアを作成lv1lvconvertます。 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です。


2

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

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

これは質問のほぼ正反対です。ポイントは、データを新しいボリュームにコピーするのではなく、ボリュームを移動することです。
XTL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.