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


17

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


詳細を教えてください。新しいVGとLVの作り方を知っていますか?データパーティションまたはルートパーティションを移動していますか?
パンサー

@ bodhi.zazen:実際、ある種のデータパーティションを移動しようとしていました。「種類」とは、これらの論理ボリュームが仮想マシンであることを意味します。(つまり、これらの論理ボリュームは、ブロックデバイスとして仮想マシンに表示されます)。とにかく、私は自分のやり方で状況を処理することができました。手順は回答に記載されています。しかし、あなたとあなたのすべてが私の方法についてコメントを歓迎します。この種のことをするためのより良い方法があれば、それを共有するのに十分親切にしてください。:)
誰も

最初に新しいPV / LVを作成し、VMをシャットダウンしてから、ddを使用してデータをコピーし、新しいVMを起動して、動作することを確認します。
パンサー

回答:



9

最初に.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

2
これは少し簡単すぎます。言及されたサイズが正確に何であるかは言及していません-たとえば、<the size>は、スナップショットの違いのみのため、非常に小さくすることができます。
16

@gornは有効なポイントですが、彼は以下の誰の回答にも答えていませんでした。追加のコンテキストについてはこれをお読みください。
トバイアスJ

7

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

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)lvremoveとをrmそれぞれ使用して、スナップショットとイメージのバックアップを削除します。

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


誰かがより良いオプション/方法を持っているなら、私にも知らせてください:
誰も

2

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

または、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

次に、を使用してRAID 1ミラーペアを作成lv1lvconvertます。<>引数が伝えlvconvertミラーコピーを作成すること lv1_copy/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を非アクティブにします。

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.

それは無意味です。ファイルシステムのマウントを解除したり、ボリュームを非アクティブ化したりする必要があります。ディレクトリをマウント解除してデータをコピーすることもできます。
user189142

2

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

lvdisplay --units m

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

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

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

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

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


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

0

VG Aから別のVG Bに論理ボリュームをコピーする必要がある場合、を使用して興味深いバリアントを見つけましたpartclone。スナップショットを作成してからddでコピーするのは良い方法ですが、ファイルシステムがいっぱいでない場合は遅くなる可能性があります。このソリューションは、使用済みブロックのみをコピーするため、非常に高速です。

  1. 最初にソースLVのスナップショットを作成します
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

これ--sizeは、スナップショットが無効になる前にどれだけの書き込みが発生する可能性があるかです

  1. 宛先VGに宛先LVを作成します
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size 少なくともソースLVのサイズである必要があります

  1. ファイルシステムをソースLVバックアップから宛先LVにコピーします
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typeすることができext4fat32btrfsxfs、...任意のFSはpartcloneでサポートされています

  1. スナップショットを削除する
lvremove /dev/sourcevg/lv-backup
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.