論理ボリュームをあるボリュームグループから別のボリュームグループに移動する

論理ボリュームをあるボリュームグループから別のボリュームグループに移動する

論理ボリュームをあるボリューム グループから別のボリューム グループに丸ごと移動することは可能ですか?

(ほぼ)一致する lv を作成してデータをコピーすることは可能ですが、LVM ツールだけでこれを行う方法はありますか?

そうでない場合、理論的な理由または技術的な制限(エクステントのサイズ)があるのでしょうか?

答え1

ボリューム グループは、物理ボリューム全体から構成されます。物理ボリュームは多数のエクステントから構成されます (エクステントは通常 4MB)。各エクステントは異なる論理ボリュームに属することができます。論理ボリュームを別のグループに転送する場合、エクステントを転送するだけでは不十分です。そうすると、物理ボリュームがソース VG とターゲット VG の間で分割される可能性があるためです。

1つまたは複数のPVをソースVGからターゲットVGに転送することができます。vgsplitコマンド。転送する 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

使用する必要があるかもしれませんpvmoveまず、移動する論理ボリュームが別々の PV 上に存在するようにします。

VGの物理的な境界を維持したままデータを移動したい場合、組み込みツールはありませんが、鏡を作り、元のものを削除する

答え2

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

代わりに、pvmove物理的な範囲を移動するために を使用することもできます。引用するとU&L: 物理範囲の目的:

単一の物理エクステントは、LVM によって個別に管理できるディスク領域の最小単位です。

ループ デバイスを使用した完全な自己完結型サンプル セッションを lvconvert以下に示します。

概要:vg1論理ボリュームlv1vg2および を含むボリューム グループを作成し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

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

テスト モードでマージ コマンドを実行します。これにより、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

lv1次に、を使用してから RAID 1 ミラー ペアを作成しますlvconvert。 引数は、 にミラー コピーを作成するように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 として実行する必要があります。#一部のコマンドの先頭の は、コメントであることを示します。これは、root プロンプトを表すものではありません。

  2. 2 つのボリューム グループ内の論理ボリュームの名前が重複している場合は、vgmerge続行が拒否されます。

  3. マージ時には、 の論理ボリュームはvg1非アクティブである必要があります。また、分割時には、vg2に属するの論理ボリュームはvg1非アクティブである必要があります。この場合、これは ですlv1

答え3

私自身の意見を述べます:

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

というボリュームがあるとしますs0

$ pvs -o+pv_used

PV         VG Fmt  Attr PSize    PFree   Used
/dev/sda2  cl lvm2 a--  <118.24g      0  <118.24g
/dev/sdb   s0 lvm2 a--  <223.57g      0  <223.57g
/dev/sdc1  s0 lvm2 a--  <465.76g      0  <465.76g
/dev/sdd1     lvm2 ---   931.51g 931.51g       0 

新しい物理ディスクに/dev/sdb移動したい/dev/sdc1/dev/sdd1

sdd1に物理ボリュームを作成する

$ pvcreate /dev/sdd1

s0新しいディスクでボリュームグループを拡張できるようになりました

$ vgextend s0 /dev/sdd1

これでデータの移動を開始できます

$ pvmove /dev/sdb /dev/sdd1

終了するまで待つ

/dev/sdb: Moved: 10.0%
...

/dev/sdb: Moved: 50.0%
...

/dev/sdb: Moved: 100.0%

チェック

$ pvs -o+pv_used

PV         VG Fmt  Attr PSize    PFree   Used    
/dev/sda2  cl lvm2 a--  <118.24g      0  <118.24g
/dev/sdb      lvm2 ---   223.57g 223.57g       0 
/dev/sdc1  s0 lvm2 a--  <465.76g      0  <465.76g
/dev/sdd1  s0 lvm2 a--  <931.51g 707.94g <223.57g

グループ/dev/sdbから削除できるようになりましたs0

$ vgreduce s0 /dev/sdb

同じ手順で/dev/sdc1

関連情報