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


18

하나의 볼륨 그룹에서 다른 볼륨 그룹으로 논리적 볼륨을 이동할 수 있습니까?

일치하는 lv를 작성하고 데이터를 복사 할 수 있지만 LVM 도구만으로이를 수행 할 수있는 방법이 있습니까?

그렇지 않은 경우 이론적 인 이유 또는 기술적 제한 (확장자 크기)이 있습니까?

답변:


13

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

수행 할 수있는 작업은 vgsplit명령을 사용하여 하나 이상의 PV를 소스 VG에서 대상 VG로 전송하는 것 입니다. 전송할 PV 또는 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의 물리적 경계를 유지하고 데이터를 이동하려는 경우 기본 제공 도구가 없지만 미러를 만든 다음 원본을 제거 할 수 있습니다.


target_group이 이미 존재하는 것 같습니까?
XTL

8

데비안 스트레치 (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

/ 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

이어서로부터 RAID 1 미러 쌍을 생성 lv1하여 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입니다.


2

나는 내 자신을 제공 할 것입니다 :

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

이것은 질문의 반대입니다. 요점은 데이터를 새로운 볼륨으로 복사하는 대신 볼륨을 이동시키는 것입니다.
XTL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.