가상 디스크 할당된 용량 줄이기 (zerofree 를 이용한 최적화)

zerofree 를 통한 용량 최적화 작업 이미지 - Generated by Gemini
zerofree 를 통한 용량 최적화 작업 이미지 – Generated by Gemini

 

개요

최근 Windows Server OS 의 보안 패치를 하는 작업 도중, vhdx 파일이 실제 OS에 할당된 Disk 사용량 보다 심하게는 2배 이상 차이나는 문제를 확인했다. 한번씩 정리해야지 하는 행동을 하려 했으나 서버를 Down 시키는 작업은 사용자의 불편을 초래할 뿐더러, Standalone 으로 도는 서버 특성상 Downtime 의 지연은 사이트에 머무는 시간을 더욱 더 짧게 하며 SEO 에도 영향을 미칠 수 밖에 없다.

하지만 이 작업 자체는 디스크의 사용량을 최적화해야 나중에 Disk Full 로 인해 발생할 수 있는 장애를 최소화 하는데 목적을 지니고 있다.

 

이 작업은 zerofree 라고 하는 명령어로 리눅스에서 사용중인 빈 공간을 Metadata 대신 0으로 채워주는 작업을 통해 최적화 하는 작업을 진행할 것 이다.

작업하기 전에 앞서 이 작업은 서버를 Down 해야 되는 작업이 필요하므로 작업 전에 주의를 요한다.

 

 

이 이후의 작업은 한동안 바꾸지 않았던 자주 쓰지 않던 블로그의 메뉴를 정리하면서 최적화된 메뉴를 구상하는 작업을 진행할 것 이다.

 

다음 내용을 보고 용량을 최적화 해보자.

 

작업순서

vhdx 확인

작업 전 Disk 사용량
작업 전 Disk 사용량

 

우선, 작업하기 전의 vhdx 사용량은 다음과 같았다. 실제 서버에서 사용중인 용량은 2026.04.10 기준 약 89GB 를 사용 중인데 할당된 vhdx 는 156GB로 용량의 괴리감이 상당하다.

가장 근본적인 문제는 리눅스와 Windows 간의 용량 할당 및 섹터를 쓰고 있는 할당 방식의 차이인데, 표로 정리하자면 다음과 같다.

 

항목리눅스 OS (Guest)vhdx 파일 (Host)
관점F/S Index 중심물리적인 Block 점유 중심
삭제 시비어있음을 알리는 Metadata 마킹데이터는 들어있음
용량 변화실시간으로 감소자동으로 줄지않음

 

Guest OS 에서는 rm 으로 삭제를 진행한다면 해당 공간에 덮어씌워도 된다는 Metadata 처리를 하고 언젠가 덮어쓸 때 까지 해당 자리를 유지하도록 되어있다.

하지만 vhdx 는 이미 “늘어난 자리를 언젠가 쓰겠지” 하고 할당을 해놓고 축소를 하지 않기 때문에 사용할수록 늘어나는 구조가 반복된다.

 

이런 방식은 Guest OS 와 Host 간 작업을 수행해야 되는게 2가지가 된다.

 

  1. Guest OS 에서 zerofree 로 Metadata 마킹 영역을 /dev/null 이나 0 으로 덮어씌우기
  2. Host OS 에서 Optimize-VHD 를 통해 빈 공간을 최적화

 

Live CD 로 부팅 후 zerofree 수행

Live CD 부팅 후 zerofree 수행
Live CD 부팅 후 zerofree 수행

 

필자는 SystemRescue Live CD 를 통해 Disk 를 Mount 하고 해당 Disk 영역을 zerofree 하는 작업을 진행했다.

이미 부팅되어 사용중인 공간에 구동시키는 경우 처리를 할 수 없기 때문에 Downtime 이 있더라도 서버를 끄고 다른 Linux 로 부팅을 한 다음에 작업해야 된다.

다운로드는 위 링크를 참고하자.

 

위 첨부된 이미지는 Live CD 부팅 후 Disk 를 Mount 한 다음, zerofree 를 하는 작업을 캡쳐한 이미지다.

 

다음과 같이 Live CD 부팅 후 아래와 같이 명령어를 수행한다.

 

  1. mkdir /mnt/tmp # Mount 할 폴더 생성
  2. mount -o ro /dev/sda1 /mnt/tmp # /mnt/tmp 에 /dev/sda1 을 읽기전용으로 Mount. 단, /dev/sda1 는 파티션 정보 확인 후 별개 값 입력 필요
  3. zerofree /dev/sda1 # zerofree 명령어를 /dev/sda1 에 수행
  4. umount /mnt/tmp # /mnt/tmp 를 Mount 해제
  5. rmdir /mnt/tmp # 디렉토리 삭제

이후, shutdown -h now 를 입력하여 Live CD 를 끄고 Guest OS 는 끈 상태로 유지를 한다.

 

vhdx 최적화

Optimize-VHD 명령어로 vhdx 최적화
Optimize-VHD 명령어로 vhdx 최적화

 

이후 powershell 을 열고 다음과 같이 입력해 vhdx 파일을 최적화 한다.

 

Optimize-VHD -Path “vhdx 경로” -Mode Full # vhdx 를 전체 최적화

결과 확인

 

vhdx 최적화 후
vhdx 최적화 후

 

획기적일 정도로 용량이 줄어들지는 않지만 파편화된 섹터를 정리해준다는 느낌으로 정리를 한다고 생각하면 도움이 될 것으로 보인다.