
특히 Windows 게스트의 경우 KVM 가상 디스크 이미지를 축소하는 방법에 대해 웹을 검색하는 데 많은 시간을 보냈습니다.
내가 찾은 것은 VM 여유 공간을 초기화하고 가상 디스크 조각 모음(Windows에서)을 실행한 다음 qemu-img convert -c ...
( -c
압축 플래그)을 실행하는 것뿐입니다.
가상 드라이브 크기가 100GB인 Windows 7 VM이 있습니다. 처음에 이 VDD는 호스트 스토리지에 40GB를 소비했습니다. 일단 초기화되면 VDD는 호스트에서 실제 100GB를 먹습니다. 그리고 qemu-img -c ...
내가 예상했던 것과 전혀 다른 91GB를 생성합니다.
Modernie 웹사이트에서는 10GB 미만의 W7 VM을 다운로드할 수 있는데, 이것이 어떻게 가능합니까? VM 이미지를 "실제로" 압축하는 방법이 있습니까?
@dyasny 덕분에 virt-sparsity
. W7 VM 디스크를 정리하고 최대 절전 모드를 비활성화하여 VDD가 20GB만 소비합니다. 디스크 성능을 다시 저하시키고 다시 실행했습니다 sdelete -z
. 플래그를 virt-sparsity
사용하여 실행하면 --compress
80GB의 가상 드라이브가 제공됩니다. 내가 기대했던 것과는 거리가 멀다.
EDIT-2016-02-16: 여기에서 논의된 VM을 축소하는 방법은 매우 효율적이지만 큰 단점이 있기 때문에 이 질문을 "새로 고침"합니다. 즉, 모든 VM 스냅샷을 삭제합니다. 스냅샷을 보존하면서 VM을 축소하는 방법을 아는 사람이 있으면 자유롭게 공유해 주세요!
답변1
Windows 게스트 OS를 축소하려면 게스트 내부의 파티션을 축소하고, VM을 종료하고, 원하는 크기의 더 작은 새 디스크를 만들고, 이전 디스크의 데이터를 더 작은 새 디스크로 복사하고, 디스크 이름을 바꾸고 재부팅해야 합니다. VM.
이는 간단하지만 부적절하게 수행하면 데이터와 머리카락이 손실될 수 있습니다.
다음은 QCOW2 형식을 사용하여 35GB로 축소하려는 Windows Server 2012 게스트 100GB의 KVM에 대한 단계입니다.
중요한: 이 방법에는가상 머신 수정 없음정의. 대신에 필요한 것은디스크 이미지 조작.
게스트에 대한 가정:
- 게스트는 Windows Server 2012입니다.
- QCOW2 형식의 100GB 디스크 이미지
- 두 개의 파티션:
- 350MB의 부팅
- 99.6GB C: 사용 공간이 20GB인 드라이브
- C:를 99.6GB에서 34GB로 축소하고 싶습니다.
호스트에 대한 가정:
- 우분투 16 LTS 서버
- KVM(libvirt)
- 250GB 드라이브
- /var/lib/libvirt/images에 있는 가상 이미지
1단계: Windows 게스트 준비, 메인 C: 파티션 축소
이 단계에서는 Windows에서 직접 Windows 파티션을 줄입니다. 이 단계가 끝나면 결과 디스크 이미지는 부팅 파티션, C: 드라이브(축소) 및 삭제할 남은 사용되지 않은 공간(새 디스크에 복사하지 않음)의 합이 됩니다.
- Windows 게스트에 로그인
- 시작 메뉴 검색 기능을 사용하여 "컴퓨터 관리" 유틸리티를 엽니다.
- 왼쪽에서 "저장소->디스크 관리"를 클릭하세요.스토리지 디스크 관리 스크린샷
- 새 화면에서 C: 파티션을 마우스 오른쪽 버튼으로 클릭하고 "볼륨 축소…"를 클릭하면 대화 상자가 나타나기까지 약간의 시간이 걸립니다. 인내심을 가지십시오.
"Shrink C:" 대화 상자 창이 나타나면 "축소할 공간 크기"에 "축소 후 총 크기(MB)" 값이 원하는 35GB에 가까워지도록 공간 크기를 입력합니다. 그런 다음 "축소"를 클릭하십시오.
메모: 새 공간이 너무 작으면 오류 메시지가 나타날 수 있습니다. 이 경우 오류가 사라지고 축소가 발생할 때까지 “축소할 공간 크기”를 1GB씩 줄여야 합니다. 실제로 우리는 10GB의 여유 공간을 유지하는 것을 선호합니다.
C: 파티션을 34GB로 축소할 수 있다고 가정해 보겠습니다.
완료되면 명령 프롬프트를 열고 다음을 입력하여 VM을 종료합니다.
shutdown /s /t 0
- Windows 게스트가 준비되었습니다.
2단계: VM 호스트의 디스크 축소
이 절차는 실제 축소는 아니지만 대신 원래 디스크에서 두 개의 파티션을 복사하고 사용되지 않은 공간을 건너뛰는 새 디스크(최종 크기)를 만들 것입니다.
목표는 전체 크기 = 부팅 파티션 + C: 파티션인 디스크를 만드는 것입니다. 또한 마지막 단계에서 처리할 것이기 때문에 걱정하지 않아도 되는 약간의 남은 공간(수학이 완벽하지 않은 경우)이 남게 됩니다.
- 리눅스 호스트에 로그인
- 슈퍼유저로 전환:
sudo su
- 가상 이미지가 저장된 위치로 이동합니다.
cd /var/lib/libvirt/images
- 파일을 나열하십시오.
ls -l
- 게스트 이미지를 찾으세요(다른 곳에서 이에 대한 튜토리얼이 많이 있음). Windows 게스트 이미지가 "windows.qcow2"라고 가정해 보겠습니다.
우리는 백업을 만듭니다:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(대형 디스크의 경우 시간이 오래 걸리므로 커피를 마시십시오.)
누락되었을 수 있는 guestfs 패키지를 설치하십시오.
apt-get install libguestfs-tools
좋습니다. 다음을 사용하여 Windows 이미지를 탐색하여 Windows 디스크를 다시 확인해 보겠습니다
virt-filesystems
.virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
이는 다음을 출력합니다.
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda device - 100G -
/dev/sda1
350MB의 Windows 부팅 파티션이 있고 현재/dev/sda2
34GB의 C: 파티션이 있으며 총 디스크 이미지가/dev/sda/
100G이므로 다듬을 수 있는 공간이 많이 남아 있습니다.따라서 중요한 단계는 다음과 같습니다. 계산을 하십시오. 34G + 350M이 35G에 적합하므로 35GB의 이미지를 생성하겠습니다. 수학이 완벽하지 않은 이상 필연적으로 약간의 공간이 남게 될 것입니다. 그러나 걱정하지 마십시오. 아래에서 다루겠습니다.
newdisk.qcow2
총 크기가 35GB인 새로운 가상 QCOW2 디스크를 생성해 보겠습니다 .qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
출력은 다음과 같습니다.
Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
기존 디스크를 새로 할당된 디스크에 복사하여 디스크 크기를 조정해 보겠습니다. 이것은 정말 굉장한 부분입니다. 대부분의 다른 가이드에서는 매우 복잡한 내용을 보여줍니다. 이 작업은 간단히 다음 명령으로 수행되며 그 후에 커피를 더 마시러 가야 합니다. 시간이 좀 걸릴 것 같습니다.
virt-resize windows.qcow2 newdisk.qcow2`
이는 다음을 출력합니다.
[ 0.0] Examining windows.qcow2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:-- ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be left alone. There is a surplus of 439.8M. An extra partition will be created for the surplus. ********** [ 8.8] Setting up initial partition table on newdisk.qcow2 [ 9.9] Copying /dev/sda1 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 [ 15.1] Copying /dev/sda2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
도구가 잉여 공간을 발견했습니다... 수학에 대한 설명을 기억해 보십시오... 따라서 이를 취소하고 디스크를 다시 생성하거나 여기에서 수행한 대로 계속 진행하여
sda2
3단계에서 수행한 것처럼 파티션을 확장할 수 있습니다.일단 완료되었습니다. 결과 이미지를 검사합니다.
virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
이는 다음을 출력합니다.
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda3 partition 83 439.8M /dev/sda /dev/sda device - 35G -
/dev/sda3
남은 공간에 대한 유형이 linux 유형인지 확인하십시오 . 수학을 정확하게 하지 않았다면 남은 공간은 괜찮습니다. 우리는 아래에서 Windows 게스트의 추가 파티션을 다룰 것입니다. 지금은 그냥 무시하세요.디스크 이미지를 교체합니다.
mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
VM을 시작합니다.
3단계: Window Guest에서 디스크 작업 마무리
이 단계에서는 Windows가 제대로 부팅되는지 확인하고 C 파티션을 추가 공간으로 확장하겠습니다.
Windows 게스트로 로그인
시작 메뉴 검색 기능을 사용하여 "컴퓨터 관리" 유틸리티를 엽니다.
왼쪽에서 "저장소->디스크 관리"를 클릭하세요.
boot, C: 및 작은 439MB 파티션(맨 오른쪽)의 3개 파티션이 표시됩니다.3개의 파티션을 보여주는 컴퓨터 관리 스크린샷
마우스 오른쪽 버튼을 클릭하고 볼륨 삭제를 통해 Linux 파티션을 삭제합니다. (메시지가 나타나면 예를 클릭하세요)
C: 파티션을 마우스 오른쪽 버튼으로 클릭하고 "확장"을 클릭한 다음 대화 상자에서 다음 및 확인을 클릭합니다. 마지막 파티션의 양만큼만 확장을 제공해야 합니다. 완료되면 C: 크기를 조정하고 두 개의 파티션만 남습니다.
그게 다야. 귀하의 Windows 게스트는 현재 35GB 정도만 사용하고 있습니다. 모든 오버헤드 등으로 인해 실제 디스크 이미지는 더 클 수 있습니다(38GB에 가까울 수 있음).
모든 것이 제대로 작동하는지 확인하고 이미지 백업을 삭제하거나 오프라인으로 저장소로 이동하세요.
답변2
마침내 VM 공간을 실제로 축소할 수 있었습니다. 처음에는 W7 VM이 호스트 스토리지에서 107GB를 소비했습니다. 가상 HDD 크기는 100GB이며 현재 VM은 가상 스토리지 중 18GB만 사용합니다.
내가 한 일은 다음과 같습니다.
- 가상 드라이브 정리(임시 파일 제거 등)
- "완전 최적화" 기능을 갖춘 오픈 소스 UltraDefrag 소프트웨어로 조각 모음
- 달리다
sdelete -c c:
- 달리다
sdelete -z c:
- 달리다
qemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2
이런 식으로 qcow2 파일은 107GB에서...7GB로 축소되었습니다!
답변3
를 실행하면 qemu-img -c
이미지가 압축되므로 일부 공간은 줄일 수 있지만 실제로 성능이 저하될 수 있습니다. 디스크에서 0의 중복을 제거하려면 qemu-img convert
기본적으로 이미지를 한 형식에서 다른 형식으로 변환하려는 것처럼(src 및 dst 형식이 동일한 경우에도) 실행해야 합니다.
이 프로세스는 변환된 새 이미지를 작성하고 0을 제거하여 드라이브에서 0으로 지정된 공간의 중복을 효과적으로 제거합니다.
virt-sparsify
또 다른 옵션은 물론 단순히 사용하는 것입니다 .
답변4
virt-sparsify
Xenial 및 Bionic에서는 패키지의 유틸리티libguestfs-도구작동해야합니다. 참고 사항:
- 게스트 내부 와 같은 도구를 미리 실행할 필요는 없습니다.
sdelete
(그러나 아프지는 않습니다) - 플래그를 사용하면 파일을 복사하지 않고도 공간을 확보할 수
--in-place
있습니다. (디스크 이미지가 이미 드라이브의 남은 여유 공간보다 큰 경우 유용합니다!) - 이 도구는 qcow2 및 원시 형식 이미지를 지원합니다.