한 볼륨 그룹에서 다른 볼륨 그룹으로 논리 볼륨 이동

한 볼륨 그룹에서 다른 볼륨 그룹으로 논리 볼륨 이동

논리 볼륨을 한 볼륨 그룹에서 다른 볼륨 그룹으로 전체적으로 이동할 수 있습니까?

어느 정도 일치하는 lv를 만들고 데이터를 복사하는 것이 가능하지만 LVM 도구만으로 이를 수행할 수 있는 방법이 있습니까?

그렇지 않다면 이론적인 이유나 기술적 한계(확장 크기)가 있습니까?

답변1

볼륨 그룹은 전체 물리 볼륨으로 구성됩니다. 물리 볼륨은 여러 익스텐트로 구성됩니다(익스텐트는 일반적으로 4MB). 각 익스텐트는 다른 논리 볼륨에 속할 수 있습니다. 논리 볼륨을 다른 그룹으로 전송하기 위해 단순히 익스텐트를 전송할 수는 없습니다. 소스 VG와 대상 VG 간에 물리 볼륨이 분할될 수 있기 때문입니다.

당신이 할 수 있는 일은 하나 이상의 PV를 소스 VG에서 대상 VG로 전송하는 것입니다.vgsplit명령. 전송하려는 PV 또는 LV를 지정할 수 있습니다(단, 한 번에 하나만). 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

vgmergeDebian Stretch(9.0), 즉 2.02.168-2의 LVM에서는 , lvconvert및 의 조합을 사용하여 볼륨 그룹 전체에 논리 볼륨을 복사하는 것이 가능합니다 vgsplit. 이동은 복사와 삭제의 조합이므로 이동에도 적용됩니다.

pvmove또는 대신 를 사용하여 물리적 범위를 이동할 수 있습니다 . 인용하려면U&L: 물리적 범위의 목적:

단일 물리적 확장 영역은 LVM에서 개별적으로 관리할 수 있는 가장 작은 디스크 공간 단위입니다.

루프 장치와 다음을 사용하는 완전한 독립형 예제 세션입니다 lvconvert.

vg1요약: 논리 볼륨 lv1vg2으로 볼륨 그룹을 생성 하고 의 lv2복사본을 만듭니다 .lv1vg2

파일을 생성합니다.

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. 이러한 명령의 대부분은 루트로 실행해야 합니다. 일부 #명령 앞의 는 해당 명령이 주석임을 나타냅니다. 루트 프롬프트를 나타내지 않습니다.

  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

관련 정보