LVM을 사용하여 VM 드라이브를 더 작은 드라이브로 복제하는 방법은 무엇입니까?

LVM을 사용하여 VM 드라이브를 더 작은 드라이브로 복제하는 방법은 무엇입니까?

Ubuntu 17.10을 사용하여 Hyper-V에서 여러 가상 머신을 설정했는데 잘못 구성되었음을 발견했습니다. 즉, VHDX 파일의 기본 블록 크기로 설정되었으며 필요한 것보다 훨씬 더 많은 공간을 사용하고 있었습니다. VHDHX 크기가 원하는 것보다 높습니다. 한 가지 예에서는 약 50GB의 드라이브가 있었지만 데이터 용량은 15GB만 포함되어 있었습니다.

보다 합리적인 설정으로 새 VHDHX 파일을 생성하고 드라이브의 모든 항목을 새로 생성된 드라이브에 복제하려고 하는데 몇 가지 문제가 발생합니다. 기존 드라이브는 아래와 같이 2개의 파티션으로 표시되며, 더 큰 파티션에는 2개의 논리 볼륨(데이터용 하나와 스왑용 하나)이 있습니다.

드라이브 정보

이 드라이브를 복제하려는 드라이브는 30GB VHDHX 파일이 될 것이며 이를 수행하는 가장 좋은 방법에 대한 조언이 필요합니다. 처음에 dd를 사용해 보았지만 소스가 대상보다 크기 때문에 오류가 발생했습니다. 그런 다음 gparted를 사용하여 더 큰 드라이브의 크기를 조정하려고 시도했지만 gparted가 LVM 파티션에 여유 공간이 없는 것으로 처리했기 때문에 크기를 조정할 수 없었습니다. 또한 LVM 파티션의 크기를 줄인 다음 gparted를 사용해 보았지만 오류가 발생했습니다. LVM 파티션의 크기를 성공적으로 줄인 다음 dd를 사용하여 LVM 볼륨을 새 드라이브에 생성한 다른 LVM 볼륨에 복제할 수 있었습니다. 하지만 lvreduce를 사용하여 원래 파티션의 크기를 조정할 때 데이터가 연속되지 않고 드라이브에 분산되어 있으면 데이터가 잘릴 수 있습니다.

저는 이 분야에 익숙하지 않기 때문에 무엇을 간과하고 있는지, 이 작업을 수행할 때 무엇을 고려해야 할지 모르지만 기본적으로 새 드라이브에 기존 드라이브의 모든 항목이 포함되도록 하는 데 필요한 단계에 대한 지침을 찾고 있습니다. 그렇다면 부팅할 수 있습니다. 예를 들어, lvreduce를 사용하여 대용량 볼륨의 크기를 필요한 크기로 조정하는 경우 이 작업을 수행하는 동안 아무 것도 잃지 않는다는 것을 어떻게 확인할 수 있습니까? 이것이 올바른 접근 방식입니까?

지금까지 내 계획은 다음과 같습니다.

  1. 이 절차를 수행하려면 새 Ubuntu VM을 생성하세요.
  2. 데이터를 복사할 원본 드라이브 + 새 드라이브를 연결합니다.
  3. 원래 드라이브의 논리 볼륨을 축소합니다.
  4. 새 드라이브에 동일한 파티션과 볼륨을 만듭니다.
  5. dd를 사용하여 논리 볼륨을 새 드라이브의 동등한 논리 볼륨에 복사합니다.

이 작업을 수행하는 더 좋은 방법이 있습니까, 아니면 뭔가 빠졌습니까? / 주의해야 할 함정은?

답변1

누구든지 이것을 발견하고 동일한 문제가 발생하면 나에게 도움이 된 솔루션은 주로 위에서 언급한 솔루션이었습니다. 아래 예제에서 원래 드라이브에는 2개의 파티션, 즉 부팅 파티션과 2개의 논리 볼륨이 있는 데이터 파티션이 있고 대상 드라이브는 논리 볼륨이 없는 부팅 파티션과 데이터 파티션으로 시작됩니다.

  1. 두 개의 디스크가 연결된 VM을 설정하고 Linux Live CD를 사용하여 부팅합니다.
  2. 소스 디스크에서 파일 시스템 검사를 실행합니다 sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root. 볼륨 이름은 출력에서 ​​찾을 수 있습니다.sudo fdisk -l
  3. 논리 볼륨의 크기를 조정하기 전에 파일 시스템을 최소 크기로 축소하십시오. 이 작업은 다음을 사용하여 수행할 수 있습니다.sudo resize2fs -M /dev/mapper/ubuntu--1704--base--vg-root
  4. 논리 볼륨의 크기를 원하는 크기(이 경우 28.5GiB)로 조정합니다.sudo lvreduce --resizefs -L 28.5G /dev/mapper/ubuntu--1704--base--vg-root
  5. 새 드라이브에서 동일한 이름을 사용하므로 기존 드라이브의 볼륨 그룹 이름을 바꿉니다.sudo vgrename ubuntu-1704-base-vg ubuntu-1704-base-vg-2
  6. 새로운 물리 볼륨을 생성합니다:sudo pvcreate /dev/sda2
  7. 소스 드라이브의 원래 볼륨 그룹에서 가져온 이름을 사용하여 새 볼륨 그룹을 만듭니다.sudo vgcreate ubuntu-1704-base-vg /dev/sda2
  8. 이전 드라이브의 논리 볼륨과 일치하도록 새 드라이브에 논리 볼륨을 만듭니다. 제 경우에는 교환용 하나와 데이터용 하나가 있습니다. 보고된 "Current LE" 속성에서 각 논리적 범위에 할당된 크기를 가져온 sudo lvdisplay다음 이를 lvcreate 명령에 대한 입력으로 사용했습니다. 예를 들면 다음과 같습니다.
    • sudo lvcreate --extents 7296 --stripes 1 --name root ubuntu-1704-base-vg
    • sudo lvcreate --extents 255 --stripes 1 --name swap_1 ubuntu-1704-base-vg
  9. 기존 드라이브의 데이터를 새 드라이브에 복사합니다. 소스 드라이브의 부팅 파티션을 새 드라이브의 부팅 파티션에 복사한 다음 데이터 드라이브의 논리 볼륨을 대상 드라이브의 새 논리 볼륨에 복사하여 이 작업을 수행했습니다. 예를 들어:
    • sudo dd if=/dev/sdb1 of=/dev/sda1 bs=64M status=progress
    • sudo dd if=/dev/mapper/ubuntu--1704--base--vg--2-root of=/dev/mapper/ubuntu--1704--base--vg-root bs=64M status=progress

마지막으로 파일 시스템 검사를 실행하여 드라이브가 정상인지 확인합니다. 수정해야 할 오류가 있을 수 있지만, 이 작업을 수행한 후 복사된 드라이브에서 성공적으로 부팅할 수 있었고 내용은 예상한 대로였습니다. sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root

사용된 참고자료: https://blog.shadypixel.com/how-to-shrink-an-lvm-volume-safely/ https://docs.microsoft.com/en-us/azure/virtual-machines/linux/configure-lvm

답변2

내가 이해한다면 실제로 달성해야 할 것은 VM 이미지를 더 작은 공간을 가진 이미지에 복사하면서도 여전히 Hyper-V(따라서 VHDX 형식)에서 사용하는 것입니다.

이 경우 새로운 가상 머신이 필요하지 않다고 생각합니다.

VM 디스크 이미지는 고정 크기 또는 동적 크기로 생성할 수 있습니다. 고정 크기를 사용하는 경우 이미지 생성 시 전체 공간이 할당되며 VM 이미지는 실제로 최종 크기를 사용합니다. 동적 형식을 사용하는 경우 디스크 공간은 가상 머신의 실제 디스크 사용량에 따라 증가합니다.

따라서 실제로 어떤 형식이 사용되는지 먼저 확인해야 합니다. 이미지 파일은 50Gb를 노출할 수 있지만 실제로는 더 적게 사용할 수 있습니다(OS에서 지원하는 경우 스파스 파일로 인해 이 문제가 발생할 수 있음).

이미지가 고정 이미지인 경우 LVM이나 파티션 변경 없이 고정 이미지에서 새 동적 이미지를 생성하려면 변환기 도구(예: StarWind V2V Converter 또는 기타)를 찾아야 합니다.

참고: 먼저 Ubuntu VM의 각 파일 시스템에서 사용되지 않은 공간을 모두 지워야 할 수도 있습니다( dd if=/dev/zero of=/zerofile ; rm -f /zerofile ).

관련 정보