논리 볼륨 (lv)을 다른 볼륨 그룹 (vg)으로 이동 / 복사하는 방법은 무엇입니까?


17

기본적으로 여러 논리 볼륨 (lv)을 새 볼륨 그룹 (vg) 으로 이동 / 복사 하고 싶습니다 . 새로운 볼륨 그룹은 새로운 물리적 볼륨 세트에 상주합니다. 누구나 논리 볼륨 내부의 데이터를 손상시키지 않고 안전하게 수행하는 방법을 알고 있습니까?


더 자세한 정보를 제공 할 수 있습니까? 새로운 VG와 LV를 만드는 방법을 알고 있습니까? 데이터 파티션 또는 루트 파티션을 이동하고 있습니까?
Panther

@ bodhi.zazen : 실제로 일종의 데이터 파티션을 이동하려고했습니다. "종류"의 의미는 논리 볼륨이 가상 머신이라는 것입니다. (즉, 이러한 논리 볼륨은 가상 장치에 블록 장치로 나타납니다). 어쨌든, 나는 내 자신의 방식으로 상황을 처리 할 수있었습니다. 단계는 내 대답에 나와 있습니다. 그러나 귀하와 귀하는 모두 내 방법에 대해 의견을 제시 할 수 있습니다. 이런 종류의 일을하는 더 좋은 방법이 있다면 공유하십시오. :)
아무도

먼저 새 PV / LV를 생성하고 VM을 종료 한 다음 dd를 사용하여 데이터를 복사하고 새 VM을 부팅하고 작동하는지 확인했습니다.
Panther

답변:


11

vgmerge를 사용하면 두 개의 VG를 병합 할 수 있습니다. pvmove 를 사용 하여 VG 내에서 데이터를 이동 하고 여러 VG로 돌아가려면 vgsplit 을 사용할 수도 있습니다 .


9

먼저 .img 파일로 복사 할 이유가 없습니다. 먼저 lvcreate를 수행 한 다음 직접 복사하십시오.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume

2
이것은 너무 짧습니다. 언급 된 크기가 정확히 무엇인지 말하지 않습니다. 예를 들어 <크기>는 스냅 샷 차이에만 해당되므로 매우 작을 수 있습니다.
go at

@gorn은 유효한 요점이지만, 그는 처음에 아래에 아무도 대답하지 않았습니다. 추가 컨텍스트를 보려면 읽어보십시오.
Tobias J

7

좋아, 나는 내 자신의 방식으로 상황을 처리 할 수 ​​있었다. 내가 취한 단계는 다음과 같습니다.

1) 대상 논리 볼륨의 스냅 샷을 만듭니다.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

참고 : 스냅 샷의 크기는 원하는만큼 크거나 작을 수 있습니다. 중요한 것은 스냅 샷 기간 동안 변경 사항을 캡처 할 수있는 충분한 공간이 있다는 것입니다.

2) 다음을 사용하여 스냅 샷 컨텐츠의 이미지 사본을 작성하십시오. dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) 대상 (새) 볼륨 그룹에 충분한 크기의 새 논리 볼륨을 작성하십시오.

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) 다음을 사용하여 이미지 백업에서 새 논리 볼륨에 데이터 쓰기 dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5)를 사용하여 스냅 샷 이미지 백업을 삭제 lvremove하고 rm각각을.

그게 다야 .. 누군가에게 도움이되기를 바랍니다 :)


누군가가 더 나은 옵션 / 방법을 가지고 있다면 나에게도 알려주십시오 :-)
nobody

2

데비안 스트레치 (9.0)의 LVM, 즉 2.02.168-2 vgmerge에서 lvconvert, 및 조합을 사용하여 볼륨 그룹에서 논리 볼륨의 사본을 수행 할 수 있습니다 vgsplit. 이동은 사본과 삭제의 조합이므로 이동에도 적용됩니다.

또는 pvmove볼륨을 이동하는 데 사용할 수 있습니다 .

루프 장치를 사용한 완전한 자체 포함 된 예제 세션 lvconvert입니다.

요약 : 논리 볼륨 lv1을 사용하여 볼륨 그룹 vg1을 작성하고 lv2를 사용하여 vg2를 작성하고 vg2에 lv1의 사본을 작성합니다.

파일을 작성하십시오.

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

테스트 모드에서 병합 명령을 실행하십시오. 이것은 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.

그것은 무의미합니다. 파일 시스템을 마운트 해제하고 볼륨을 비활성화해야합니다. dir 마운트를 해제하고 데이터를 복사 할 수도 있습니다.
user189142

2

지금까지 4 가지 대답은 모두 볼륨의 정확한 크기를 알 수없는 것으로보고 있습니다. lvdisplay소수점 이하 2 자리로 반올림 된 값만 표시 man lvdisplay하고 사용 가능한 옵션에 대해서는 다른 명령 만 가리 킵니다. 다음은 기본 LVM 블록 크기 4MiB로 충분히 정확한 MiB를 선택합니다.

lvdisplay --units m

MiB도의 기본 단위 --size입니다 lvcreate. 의심스러운 경우 lvdisplay대상 볼륨을 생성 한 후로 정확한 크기를 다시 확인하십시오 . 그런 다음 다른 답변과 마찬가지로 복사하십시오. 또한, 내가하는 것이 좋습니다 것 사본을 확인 으로, 예를 들면 cmp.

다음은 스냅 샷이 사용되는 이유와이를 보호하고 보호하지 않는 이유입니다.

  • 스냅 샷은 스냅 샷 생성 당시의 모든 데이터가 복사되도록 만들어집니다. 복사 프로세스 중 소스 볼륨에 대한 활동은 복사에 반영되지 않습니다.

  • 스냅 샷은 또한 dd명령 행 에서 사람 볼륨으로부터 소스 볼륨을 보호합니다 . 실수로 스냅 샷에 쓰면 스냅 샷의 데이터 만 손상되므로 스냅 샷을 제거하고 다시 시작할 수 있습니다.

  • 복사 과정 중에 대상 볼륨이 보호되지 않습니다. 다른 관리자 (또는 os-prober와 같은 자동 프로세스 dracut)가 불완전한 볼륨을 마운트하면 마운트가 문제를 일으킬 수 있습니다. 읽기 전용 마운트에서도 여전히 저널 항목을 볼륨에 쓸 수 있습니다.


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

0

VG A에서 다른 VG B로 논리 볼륨을 복사해야하는 경우을 사용하여 흥미로운 변형을 찾았습니다 partclone. 그런 다음 dd로 복사하는 스냅 샷이 좋은 방법이지만 파일 시스템이 가득 차지 않으면 속도가 느려질 수 있습니다. 이 솔루션은 사용 된 블록 만 복사하므로 매우 빠릅니다.

  1. 먼저 소스 LV의 스냅 샷을 만듭니다.
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

다음 --size은 스냅 샷을 비활성화하기 전에 얼마나 많이 쓸 수 있는지입니다.

  1. 대상 VG에서 대상 LV 생성
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size 최소한 소스 LV의 크기 여야합니다

  1. 소스 lv 백업에서 대상 LV로 파일 시스템 복사
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_type할 수있다 ext4, fat32, btrfs, xfs, ... 어떤 FS는 partclone 지원

  1. 스냅 샷 삭제
lvremove /dev/sourcevg/lv-backup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.