한 볼륨 그룹에서 다른 볼륨 그룹으로 논리 볼륨을 이동 / 복사하는 간단한 방법이 있습니까? (LVM2)


15

집에있는 서버에 많은 디스크를 재배치하고 있고 LVM 논리 볼륨을 다른 볼륨 그룹으로 옮기고 싶은 위치에 있습니다. 이를 수행하는 간단한 방법이 있습니까? cplv명령에 대한 언급을 보았지만 이것은 오래되었거나 Linux에서 사용할 수 없었던 것으로 보입니다.

답변:


20

논리 볼륨이 나머지 소스 볼륨 그룹과 물리적 볼륨의 별도 서브 세트에 있도록 정렬 할 수있는 경우 ( lvconvert sourcevg/sourcelv /dev/pv1 ...도움이 될 수 있음) vgsplitlv를 새 vg로 분리 vgmerge하고 새 vg를 목표 vg.

LVM에는 미러링 기능이 있지만 미러의 양쪽 다리가 같은 vg에 있어야 하며 연결을 끊을 수 없기 때문에 볼륨 그룹간에 사본을 만드는 데이 기능을 사용할 수 없습니다 .

볼륨을 다른 볼륨으로 복사하는 방식으로 LVM 볼륨을 다른 볼륨으로 복사 할 수 있습니다. 적절한 크기의 대상 lv를 만든 다음로 내용을 복사하십시오 dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. 소스 볼륨이 활성화 된 경우 LVM을 활용하여 일관된 사본을 만들 수 있습니다. 먼저 소스 lv lvcreate -s의 스냅 샷을으로 만든 다음 스냅 샷을 복사하십시오.


1
Brilliant Gilles .... vgsplit / vgmerge는 아마 괜찮을 것입니다. 그 후 pvmove를 사용하여 물리적 범위를 새 디스크로 이동 한 다음 VG에서 이전 볼륨을 제거 할 수 있습니다.
jkp

부끄러운 일이지만, 익스텐트 크기가 다르기 때문에 결국에는 효과가 없었습니다. 그래도 문제가되지 않으면이 방법이 가장 좋습니다.
jkp

dd(당신은 오래된 볼륨을 던져 서둘러하지 않는 경우), 새로운 파일 시스템의 UUID를 변경하는 것을 잊지 마세요 : tune2fs를 -U 무작위는 / dev / targetvg / targetlv
midenok

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

pvmove는 물리 볼륨간에 데이터를 이동할 수 있습니다. LVM 관리자 안내서


10
그러나 볼륨 그룹 간에는 아닙니다.
MattBianco

나는 반복한다 : 이것은 2 개의 분리 된 볼륨 그룹에 대해 작동하지 않는다
kissgyorgy

먼저 vgextend새로운 pv로 vg1을 입력 한 다음 pvmovelv를 새 pv로, vg2에서 vgsplit임시 vg로 설정하십시오 vgmerge. 그런 다음 pvmove다시 lv ~ vg2 원본 pv, vgreducevg2를 통해 중간 pv를 읽습니다. 또는 중간 복사본을 피하려면 먼저 vg1을 vg2, pvmovelv1 에 병합 하고 vgsplit다시 vg1을 vg2 에서 병합 할 수 있습니다 . 이 MattBianco 및 @kissgyorgy @의 반대에 응답하고 @Gilles의 솔루션되지만 스냅 샷 및 저수준 교체에 해당한다 dda로pvmove
marcz

1

Debian stretch (9.0)의 LVM, 즉 2.02.168-2 vgmerge에서 lvconvert, 및 조합을 사용하여 볼륨 그룹에서 논리 볼륨의 사본을 수행 할 수 있습니다 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

볼륨 그룹 만들기 vg1vg2/dev/loop1/dev/loop2 각각을.

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

논리 볼륨 생성 lv1lv2에서 vg1하고 vg2각각을.

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

lv1및에 ext4 파일 시스템을 만듭니다 lv2.

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 미러 쌍을 생성 lv1하여 lvconvert. 는 <> 인수는 말한다 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) 이러한 명령의 대부분은 루트로 실행해야합니다.

2) 두 볼륨 그룹에서 논리 볼륨 이름이 중복 vgmerge되면 진행을 거부합니다.

3) 병합시 :

Logical volumes in `vg1` must be inactive

그리고 분할 :

Logical volume `vg2/lv1` must be inactive.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.