web-dev-qa-db-ja.com

論理ボリューム(lv)を別のボリュームグループ(vg)に移動/コピーする方法

基本的に、move/copyいくつかの論理ボリューム(lv)を新しいボリュームグループ(vg)にしたい。新しいボリュームグループは、新しい物理ボリュームのセットに存在します。これらの論理ボリューム内のデータに損傷を与えることなく安全に行う方法を知っている人はいますか?

17
nobody

vgmerge では、2つのVGをマージできます。 pvmove を使用してVG内でデータを移動することもできます。複数のVGに戻る場合は vgsplit を使用することもできます。

11
Gabriel

最初に.imgファイルにコピーする理由はありません。まずlvcreateを実行し、次に直接コピーします:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume
9
anon

さて、私は自分のやり方で状況を処理することができました。私が行ったステップは次のとおりです。

1)ターゲット論理ボリュームのスナップショットを作成します。

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

注:スナップショットのサイズは、必要に応じて大きくも小さくもできます。重要なのは、スナップショット期間中に変更をキャプチャするのに十分なスペースを確保することです。

2)ddを使用して、スナップショットコンテンツのイメージコピーを作成します

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3)ターゲティング(新しい)ボリュームグループに十分なサイズの新しい論理ボリュームを作成します。

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4)ddを使用して、イメージバックアップから新しい論理ボリュームにデータを書き込みます

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5)lvremovermをそれぞれ使用して、スナップショットとイメージのバックアップを削除します。

それはすべての人々です...これが誰かに役立つことを願っています:)

7
nobody

Debian stretch(9.0)のLVM、つまり2.02.168-2では、vgmergelvconvert、およびvgsplitの組み合わせを使用して、ボリュームグループ間で論理ボリュームのコピーを行うことができます。移動はコピーと削除の組み合わせであるため、これは移動に対しても機能します。

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

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

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

ファイルを作成します。

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

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

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ミラーペアを作成します。 <>引数は、lv1_copy上のミラーコピー/dev/loop2を作成するようにlvconvertに指示します。

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を非アクティブにします。

vgchange -a n vg2

その後(テストモード)

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)マージ時:

Logical volumes in `vg1` must be inactive

分割して:

Logical volume `vg2/lv1` must be inactive.
2
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
2
conan

これまでの4つの答えはすべて見落としているため、ボリュームの正確なサイズは不明なことがよくあります。 lvdisplayは小数点以下2桁に丸められた値のみを表示し、man lvdisplayは使用可能なオプションの他のコマンドのみを指します。以下では、MiBを選択します。これは、デフォルトのLVMブロックサイズ4 MiBで十分に正確です。

lvdisplay --units m

MiBは、lvcreate--sizeのデフォルト単位でもあります。疑わしい場合は、ターゲットボリュームを作成した後、lvdisplayで正しいサイズを再確認してください。次に、他の回答のようにコピーを作成します。さらに、たとえばcmpを使用してコピーを検証することをお勧めします。

ここで、スナップショットが使用される理由と、スナップショットが保護するものと保護しないもの:

  • スナップショットは、スナップショットが作成された時点のすべてのデータがコピーされるように作成されます。コピープロセス中のソースボリュームでのアクティビティは、コピーに反映されません。

  • スナップショットは、ddコマンドラインでのヒューマンエラーからソースボリュームを保護します。スナップショットに誤って書き込むと、スナップショットのデータのみが破損するため、スナップショットを削除して最初からやり直すことができます。

  • コピー処理中、ターゲットボリュームは保護されません。別の管理者(またはdracutのos-proberなどの自動プロセス)が不完全なボリュームをマウントすると、マウントが問題を起こす可能性があります。 (読み取り専用マウントでも、ジャーナルエントリをボリュームに書き込む場合があります。)

2
Joachim Wagner