Fullmoon System

WSL2 용량 줄이기: ext4.vhdx 압축 전 백업부터 검증까지

AI Editter

WSL2에서 큰 파일을 지웠는데 C 드라이브의 여유 공간이 그대로라면, 삭제가 실패한 것인지 가상 디스크가 줄지 않은 것인지 구분해야 합니다. Linux가 보는 파일시스템 사용량과 Windows가 보관하는 ext4.vhdx 파일 크기는 서로 다릅니다. Linux 안의 정리 → 백업 → WSL 종료 → 가상 디스크 압축 → 두 곳의 용량 재확인 순서로 접근하면 원인을 놓치지 않습니다.

이 절차는 Windows의 일반 WSL2 배포판을 대상으로 합니다. Docker Desktop이 관리하는 가상 디스크나 다른 VM 디스크는 제품의 관리 절차를 따라야 합니다. 경로가 불확실한 VHDX를 이름만 보고 선택하지 마세요.

df의 1TB와 ext4.vhdx 100GB는 다른 숫자다

확인 위치 무엇을 뜻하나 정리 후 볼 값
Linux의 df -h / 가상 파일시스템의 전체·사용 공간 Used 감소
Windows의 VHDX 속성 가상 디스크 파일의 크기·디스크 할당 크기 실제 디스크 차지량 감소
Windows C 드라이브 호스트 파일시스템의 남은 공간 사용 가능 공간 증가

동적 가상 디스크는 내부 데이터가 늘면 커지지만 파일 삭제만으로 자동 축소되지 않을 수 있습니다. sparse 설정 등 환경에 따라 반환 방식도 다릅니다. Microsoft의 WSL 디스크 설명과 compact vdisk 문서가 두 용량을 구분하는 기준입니다.

1. 배포판과 데이터 위치를 먼저 확정한다

PowerShell에서 버전과 배포판 이름을 확인합니다. Ubuntu라는 이름을 쓰지 않는다면 이후 명령도 실제 이름으로 바꾸세요.

wsl --version
wsl --list --verbose
wsl -d Ubuntu -- df -h /

가상 디스크 위치는 설치 방식에 따라 다릅니다. 다음 읽기 전용 조회에서 DistributionName과 BasePath를 대조할 수 있습니다. 이 정보가 없는 설치나 다른 VHD 이름을 사용하는 환경에서는 공식 디스크 위치 안내와 실제 파일을 추가 확인합니다.

Get-ChildItem 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss' |
  Get-ItemProperty |
  Select-Object DistributionName, BasePath

BasePath에서 선택한 배포판의 ext4.vhdx가 맞는지 확인하고 원래 크기를 기록합니다. 레지스트리를 수정할 필요는 없습니다.

2. Linux 내부에서 무엇을 지울지 결정한다

sudo du -xhd1 / 2>/dev/null
du -hd1 ~ 2>/dev/null
df -h /

홈 디렉터리의 오래된 빌드 산출물, 다운로드, 패키지 캐시를 구분합니다. Docker 데이터가 크다면 이미지·로그·볼륨을 따로 조사해야 합니다. du가 작고 df만 크면 삭제된 파일을 프로세스가 열고 있는 경우도 살펴보세요. 재시작이 필요한 서비스를 확인하지 않고 작업 중인 세션을 종료하면 안 됩니다.

정리 후 파일시스템의 빈 영역을 알리는 sudo fstrim -v /을 실행할 수 있습니다. 결과가 곧 Windows에서 회수한 용량을 뜻하지는 않습니다. 지원되지 않는다는 오류가 나오면 파일시스템과 WSL 버전을 확인하고, 인터넷의 대용량 zero-fill 명령으로 남은 디스크를 채우지 마세요.

3. 백업 공간을 확보하고 복구 경로를 만든다

데이터베이스나 개발 서버를 정상 종료하고, 프로젝트 변경 사항을 저장합니다. D 드라이브 등 충분한 별도 공간에 내보낼 디렉터리를 만든 뒤 실행합니다.

wsl --shutdown
wsl --export Ubuntu D:\WSL-Backup\ubuntu-before-compact.tar

명령 종료 코드와 백업 파일 크기를 확인합니다. 중요한 환경이라면 wsl --import로 다른 이름·다른 경로에 복원해 파일이 열리는지 검사하세요. 내보내기·가져오기 방식은 WSL 기본 명령 문서에서 확인할 수 있습니다. 백업 파일 하나가 생겼다는 사실만으로 복원 가능성을 확신하지 않는 것이 좋습니다.

4. 사용 중이 아닌 VHDX만 압축한다

Docker Desktop, VS Code의 WSL 연결, Linux 터미널 등 WSL을 다시 켤 수 있는 프로그램을 종료합니다. 다시 wsl --shutdown을 실행하고 배포판이 중지 상태인지 확인하세요. 관리자 권한 터미널에서 diskpart를 연 뒤 아래를 한 줄씩 입력합니다. 경로는 앞에서 확인한 실제 VHDX로 교체합니다.

select vdisk file="D:\WSL\Ubuntu\ext4.vhdx"
detail vdisk
compact vdisk
exit

detail vdisk에서 선택한 파일이 맞는지 확인한 다음에만 compact를 실행합니다. 이 명령은 분리되었거나 읽기 전용으로 연결된 동적 VHD에 적용됩니다. “사용 중” 오류가 나면 강제 분리나 파일 삭제로 우회하지 말고 다시 실행시킨 프로그램부터 찾습니다. 이 작업에 clean, format, wsl --unregister는 필요하지 않습니다. unregister는 배포판 데이터를 제거하는 명령입니다.

줄어든 숫자와 실행 상태를 함께 확인한다

완료 후 Windows의 파일 크기·디스크 할당 크기와 드라이브 여유 공간을 비교합니다. WSL을 시작해 df -h /, 주요 파일, 개발 서버를 확인하세요. 압축은 Linux가 현재 사용하는 데이터를 더 작게 만드는 기능이 아니므로 결과가 기대보다 작을 수 있습니다. sparse 여부와 파일 배치도 영향을 줍니다. 공간이 계속 부족하면 반복 압축보다 데이터 보존 정책이나 배포판 이동을 검토하는 편이 낫습니다.

Docker 내부 사용량이 큰 경우에는 Docker 로그·캐시·볼륨별 용량 점검을 먼저 진행한 다음 VHDX 압축으로 넘어가세요.