web-dev-qa-db-ja.com

論理ボリュームをあるボリュームグループから別のグループに移動/コピーする簡単な方法はありますか? (LVM2)

自宅のサーバーにある一連のディスクを再配置していますが、LVM論理ボリュームの束を別のボリュームグループに移動したいという立場にいます。これを行う簡単な方法はありますか?私はcplvコマンドについて言及しましたが、これは古いものか、Linuxで利用できるものではないようです。

15
jkp

論理ボリュームを残りのソースボリュームグループとは別の物理ボリュームのサブセットに配置できる場合(lvconvert sourcevg/sourcelv /dev/pv1 ...が役立つ場合があります)、vgsplitを使用してlvを新しいvgとvgmergeは、新しいvgをターゲットvgにマージします。

LVMにはミラーリング機能がありますが、ミラーの両方のレッグが同じvgに存在する必要があり、 関連付けが可能であるため、これを使用してボリュームグループ間でコピーを作成することはできません。壊れる

LVMボリュームを別のボリュームにコピーするには、ボリュームを別のボリュームにコピーする方法と同じです。適切なサイズのターゲットlvを作成してから、dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4Mを使用して内容をコピーします。ソースボリュームがアクティブな場合、LVMを利用して一貫したコピーを作成できます。最初にlvcreate -sを使用してソースlvのスナップショットを作成してから、スナップショットをコピーします。

pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmoveは物理ボリューム間でデータを移動できます: LVM管理者ガイド

2
milan

Debianストレッチ(9.0)のLVM、つまり2.02.168-2以降では、vgmergelvconvert、およびvgsplit。移動はコピーと削除の組み合わせであるため、これは移動にも有効です。

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

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

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

ファイルを作成します。

truncate pv1 --size 100MB
truncate pv2 --size 100MB

ファイルにループデバイスを設定します。

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

ループデバイスに物理ボリュームを作成します(LVMで使用するためにループデバイスを初期化します)。

pvcreate /dev/loop1 /dev/loop2

ボリュームグループvg1およびvg2/dev/loop1および/dev/loop2にそれぞれ作成します。

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

論理ボリュームlv1およびlv2vg1およびvg2にそれぞれ作成します。

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

lv1lv2にext4ファイルシステムを作成します。

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

必要に応じて、lv1に何かを書き込んで、後でコピーが正しく作成されたことを確認できるようにします。 vg1を非アクティブにします。

vgchange -a n vg1

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

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ミラーペアを作成します。 <>引数は、lvconvertlv1_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.
1
Faheem Mitha