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


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, 그리고 vg2와 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

이어서로부터 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.