基本的に、move/copyいくつかの論理ボリューム(lv)を新しいボリュームグループ(vg)にしたい。新しいボリュームグループは、新しい物理ボリュームのセットに存在します。これらの論理ボリューム内のデータに損傷を与えることなく安全に行う方法を知っている人はいますか?
最初に.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
さて、私は自分のやり方で状況を処理することができました。私が行ったステップは次のとおりです。
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
をそれぞれ使用して、スナップショットとイメージのバックアップを削除します。
それはすべての人々です...これが誰かに役立つことを願っています:)
Debian stretch(9.0)のLVM、つまり2.02.168-2では、vgmerge
、lvconvert
、および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.
私は自分のものを提供します:
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
これまでの4つの答えはすべて見落としているため、ボリュームの正確なサイズは不明なことがよくあります。 lvdisplay
は小数点以下2桁に丸められた値のみを表示し、man lvdisplay
は使用可能なオプションの他のコマンドのみを指します。以下では、MiBを選択します。これは、デフォルトのLVMブロックサイズ4 MiBで十分に正確です。
lvdisplay --units m
MiBは、lvcreate
の--size
のデフォルト単位でもあります。疑わしい場合は、ターゲットボリュームを作成した後、lvdisplay
で正しいサイズを再確認してください。次に、他の回答のようにコピーを作成します。さらに、たとえばcmp
を使用してコピーを検証することをお勧めします。
ここで、スナップショットが使用される理由と、スナップショットが保護するものと保護しないもの:
スナップショットは、スナップショットが作成された時点のすべてのデータがコピーされるように作成されます。コピープロセス中のソースボリュームでのアクティビティは、コピーに反映されません。
スナップショットは、dd
コマンドラインでのヒューマンエラーからソースボリュームを保護します。スナップショットに誤って書き込むと、スナップショットのデータのみが破損するため、スナップショットを削除して最初からやり直すことができます。
コピー処理中、ターゲットボリュームは保護されません。別の管理者(またはdracut
のos-proberなどの自動プロセス)が不完全なボリュームをマウントすると、マウントが問題を起こす可能性があります。 (読み取り専用マウントでも、ジャーナルエントリをボリュームに書き込む場合があります。)