본문 바로가기

디스크와 파티션

[DiskPart] VHD 가상 디스크의 용량 최적화하기 - Compact

동적 확장 형식 VHD 의 문제와 Compact 명령의 이해

* 이 내용은 Fixed 고정 크기 형식에서는 적용되지 않는 내용입니다.

VHD 가상 디스크의 Expandable 동적 확장 형식은 가상 디스크에 파일을 저장한 만큼(사용한 만큼) VHD 파일의 용량이 점차 늘어나는 방식입니다. 그렇다면 가상 디스크에 저장된 파일을 삭제하면 그만큼 VHD 파일의 크기가 줄어들까요? 아쉽게도 그렇지는 않습니다. VHD 가상 디스크에 포함된 파일을 삭제하여도 한 번 늘어난 VHD 파일의 크기는 다시 줄어들지 않습니다. 이게 문제라면 문제일 수 있죠.

그래서 현재 VHD 에 실제로 저장된 데이터의 크기 만큼 VHD 파일의 용량을 최적화해 줄 필요가 있으며 이것을 담당하는 명령이 바로 Compact 명령입니다. [DiskPart 에서는 이러한 작업을 압축이라고 표현하는데 우리가 흔히 아는 ZIP 이나 RAR 와 같은 압축과는 다른 의미입니다.]

Select Vdisk File="D:\Example.vhd"
Compact Vdisk

이 때 D:\Example.vhd 는 Expandable 형식이어야 합니다. 만약 Fixed 형식이라면 Compact 명령은 거부됩니다. 또한 해당 VHD 파일은 반드시 시스템에서 분리되어 있거나 읽기 전용 상태로 연결되어 있어야 합니다.

간단하죠? 명령에선 이것 외에 더 설명드릴게 없습니다.

알아도 살아가는데 별로 도움이 안 되는 지식

1. Compact 명령은 동적 확장 형식의 VHD 가상 디스크 안에 포함된 실제 데이터의 크기 만큼 VHD 파일의 용량을 최적화 합니다.

2. Create Vdisk Soucre 를 통해 새로운 VHD 가상 디스크 파일을 생성하면 Source 로 지정된 원본 VHD 에 포함된 실제 데이터를 모두 가져옵니다.

만약 D:\Example.vhd 라는 Expandable 형식의 VHD 파일이 있다면

create vdisk file="D:\Copy.vhd" source="D:\Example.vhd" type=expandable

select vdisk file="D:\Example.vhd"
compact vdisk

이렇게 Source 에서 데이터를 가져온 Copy.vhd 파일과 Compact 를 통해 최적화한 Example.vhd 파일의 크기는 정확하게 일치합니다. 그냥 그렇다는 이야기입니다. 별 도움이 되는 내용은 아닙니다.





Compact 명령의 결과가 뜻대로 이루어지지 않는 이유

작업을 알아보기 전 먼저 Compact 명령이 작동하는 방식에 대해서 이야기를 드리도록 하겠습니다. 그래야 왜 그러는지 왜 그런 작업이 필요한지 이해하시기 편하실테니까요. 그럼 한 가지 질문을 생각해보도록 하죠.

"Expandable 형식의 VHD 가상 디스크에서 실제 데이터가 아닌 비어 있는 데이터들은 무엇일까요?"

그것은 바로 0 으로 기록된 섹터들입니다. 이제 아래의 내용을 보시죠.

A. 디스크에서 0 으로만 기록된 공간(섹터)는 아무런 내용도 없는 비어 있음을 의미합니다. 즉, 내용이 없는 무(無)의 상태를 의미합니다. (하지만 0 도 데이터이기 때문에 데이터의 관점에서는 무(無)가 아닙니다.)

B. 가상 디스크는 최초에 생성될 때 비어 있는 공간을 어떻게 처리하는지에 따라(최초에 생성될 때는 모든 공간이 비어 있는 상태이죠.) Fixed 형식과 Expandable 형식으로 나누어집니다.

Fixed 형식은 모든 비어 있는 공간을 비어 있음을 의미하는 0 으로 가득 채웁니다. 0 또한 데이터이고 이것이 가득채워져 있기 때문에 VHD 파일의 크기가 가상 디스크의 최대 크기로 생성되는 겁니다. [0 은 비어 있음을 의미하는 데이터]

Expandable 형식은 비어 있는 공간은 그냥 아예 없는 상태로 둡니다. 즉, 해당 공간을 비어 있음을 의미하는 0 이라는 무(無)의 데이터로 채우지 않고, 그냥 아무 것도 없는 공(空)의 상태 그대로 두는 것이죠. 그렇기에 막 생성된 Expandable 형식의 VHD 파일은 VHD 자신에 대한 데이터들 외에는 아무 것도 없기 때문에 초기 VHD 파일의 크기가 매우 작은 것입니다. 이후 데이터를 저장하면 공(空)으로 존재하던 빈 공간에 실제로 데이터를 기록하고 그에 맞춰 점차 크기가 늘어나는 방식이죠.

C. Expandable 형식의 가상 디스크에서 0 으로만 기록되어 있는 섹터는 비어 있음에도 불구하고 VHD 파일의 크기만 늘리는 쓸데없는 공간입니다. 이러한 공간들은 파일이 저장되고 삭제되는 과정 속에서 만들어 집니다. 해당 공간들은 Expandable 형식 입장에선 원래 아무런 데이터도 존재하지 않는 공(空)의 상태로 되돌아가야 할 공간들이죠.

즉, Compact 는 Expandable 형식의 가상 디스크에서 0 으로만 기록된 즉, 비어 있음을 의미하는 공간들을 원래대로 데이터 자체를 없애고 없는 상태로 되돌림으로써 VHD 파일의 용량을 실제 기록된 데이터의 크기에 맞게 축소해주는 작업인 것입니다. 또한 이러한 이유로 비어 있는 공간을 0 으로 가득 채우는 Fixed 형식에서는 작업 자체를 지원하지 않는 것이구요. 간단하죠?


그런데 실제로 Compact 작업을 하다보면 우리가 원하는대로 결과가 잘 나오지를 않습니다. 간단한 예를 들어보죠. 먼저 Expandable 형식의 VHD 가상 디스크 하나를 준비합니다. 그런 후 해당 가상 디스크에 파일을 저장하고 이후 해당 파일들을 모두 삭제하도록 하죠. 파일들의 삭제는 그냥 간단하게 빠른 포맷을 하였습니다. 그런 후 해당 가상 디스크를 시스템에서 분리하고 Compact 를 통해 최적화하였습니다.








어떤가요? 원하는만큼 VHD 파일의 크기가 최적화되었나요? 아니죠? 분명 빠른 포맷을 통해 모든 파일을 삭제한 후 최적화하였으니 그만큼 VHD 파일의 용량이 줄어들어야 할텐데 그렇질 않았죠? 왜 그럴까요? 그것은 아래의 글들을 읽어보시면 이해가 되실 겁니다.

파일의 완전 삭제란 - 제로필과 DoD 5220.22-M 와이핑
빠른 포맷과 일반 포맷의 차이점 - 실제 포맷 결과 비교


즉, 파일을 삭제하였지만(빠른 포맷도 동일) 실제 가상 디스크에는 해당 파일에 대한 데이터들이 고스란히 남아 있는 상태이고, 이는 가상 디스크(Compact) 입장에선 비어 있는 것이 아닌 것이죠. 그래서 위와 같이 현재 VHD 가상 디스크에 남아 있는 파일들의 크기에 맞게 VHD 파일의 크기가 제대로 최적화되지 않는 것입니다.

그래서 Compact 최적화 작업의 효과를 제대로 얻기 위해선 이와 같은 삭제된 쓰레기 데이터들을 모두 정상적으로 비어 있음을 의미하는 0 으로 기록해주어야 합니다. 프로그램 중에는 디스크에서 실제로 비어 있어야 할 공간들을(파일이 삭제된 공간들을) 모두 0 으로 재기록해주는 작업을 진행할 수 있는 프로그램들이 존재하며 이러한 작업을 제로필(Zerofill) 이라고 부릅니다.

그래서 Compact 최적화 작업을 하기 전 먼저 제로필 작업을 진행해주는 것이 좋습니다.




SDelete 제로필 작업과 Compact 최적화 작업

이러한 제로필 작업에 가장 널리 애용되는 것이 SDelete.exe 라는 보안 삭제 도구입니다. 해당 도구는 무료로 제공되며 드라이브에서 사용되지 않는 공간만을 제로필하는 작업이 가능합니다. [실제로 SDelete.exe 에서 공간 제로필 작업은 가상 디스크를 최적화하는 작업에 유용하게 사용할 수 있다고 설명되어 있습니다.]




파일은 단일 실행 파일로 이루어져 있으며 압축을 푼 후 SDelete.exe 파일을 어느 경로에서나 바로 사용하실 수 있게 C:\Windows\System32 폴더에 넣어두시면 좋습니다. [참고로 최초 실행시 사용권 계약에 동의하셔야 합니다.]


아래는 실제로 이러한 SDelete 프로그램을 활용하여 제로필 후 VHD 파일을 최적화하는 예제입니다. [해당 VHD 파일은 아직 시스템에 연결되어 있지 않다는 가정하에 작업, 드라이브 문자 할당은 알아서 적절히!]

diskpart
select vdisk file="D:\Test\Example.vhd"
attach vdisk
select partition=1
assign letter=g
exit

sdelete -c g:

diskpart
select vdisk file="D:\Test\Example.vhd"
detach vdisk
compact vdisk
exit



작업을 마친 후 해당 VHD 파일의 크기를 살펴본 모습입니다. 제로필 최적화 작업을 진행하기 전과는 확연히 다른 결과를 보여주죠? 이것이 바로 Expandable 동적 확장 형식 VHD 가상 디스크 파일의 제로필 최적화 작업의 효과입니다.

만약 윈도우를 설치하여 부팅에 사용 중인 가상 디스크라면 용량이 어느 정도 나가는 프로그램을 제거한 후에는 이렇게 제로필 최적화 작업을 해주면 좋겠죠. 그 외에도 뭐 생각나실 때 한 번씩 해주시면 좋고요. 참고로 VARS 에는 이 작업이 VHD 원본 최적화라는 이름으로 포함되어 있습니다. ^^


참고로 SDelete.exe 를 통해 특정 드라이브의 빈 공간을 제로필 하는 방법에는 두 가지가 있습니다. 예를 들어 G: 드라이브의 빈 공간을 제로필 한다면 아래와 같이 -c 또는 -z 매개 변수를 주고 드라이브를 지정해주는 방법이 있고,

sdelete -c g:

sdelete -z g:


또는 먼저 해당 드라이브로 경로를 이동한 후 마찬가지로 -c 또는 -z 매개 변수를 통해 제로필 하는 방법이 있습니다.

g:
sdelete -z



-c 와 -z 는 사실상 차이가 없다고 보셔도 되니 아무 걸로나 작업하셔도 상관은 없습니다. 하지만 SDelete(1.6) 자체에서 가상 디스크의 최적화에 추천하는 것은 -z 스위치입니다. 이상입니다. ^^