論理ボリュームをあるボリュームグループから別のボリュームグループ全体に移動することはできますか?
(多かれ少なかれ)一致するlvを作成してデータをコピーすることは可能ですが、LVMツールだけでこれを行う方法はありますか?
そうでない場合、理論的な理由または技術的な制限(エクステントサイズ)はありますか?
ボリュームグループは、物理ボリューム全体で構成されています。物理ボリュームは多くのエクステントで構成されます(エクステントは通常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以降、vgmerge
、lvconvert
、およびの組み合わせを使用して、ボリュームグループ間で論理ボリュームのコピーを行うことが可能です。 vgsplit
。移動はコピーと削除の組み合わせなので、これは移動にも有効です。
または、pvmove
を使用して、ボリュームを移動することもできます。
ループデバイスとlvconvert
を使用した完全な自己完結型のサンプルセッションが続きます。
概要:論理ボリュームvg1
でボリュームグループlv1
を作成し、vg2
でlv2
を作成し、lv1
に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
論理ボリューム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
です。
私は自分のものを提供します:
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
この質問に対する正確な答えは次のとおりです。「いいえ、(論理的に)移動あるボリュームグループ(VG1)から別の(VG2)への論理ボリューム(LV)はできません。データは物理的にコピーされました。」
理由:論理ボリュームデータは、特定のボリュームグループに割り当てられたブロックデバイス(ディスク、パーティション)に物理的に保存されます。 移動/dev/sda
と/dev/sdb
で構成されるVG1から/dev/sdc
で構成されるVG2への論理ボリュームは、move/dev/sda
からのデータまたは/dev/sdb
から/dev/sdc
へのデータ物理的なcopy少なくとも2つのブロックデバイス(またはパーティション)間の操作。
追伸すべてのLVデータがVG1から完全に除外できる物理ボリュームに格納されている場合、この物理ボリュームをVG2に割り当てることができます。しかし、それは物理ボリュームをあるボリュームグループから別のボリュームグループに移動することであり、論理ボリュームの移動ではありません。