---
layout: post
title: "자잘한 도움말 #9 비대해진 WSL 크기 줄이기"
description: WSL VHD 압축, WSL, WSL2, VHD, 압축, diskpart
date: 2023-07-05 23:46:00 +0900
categories: [Micro]
---

## TL;DR

- WSL의 저장 공간은 가상 디스크 형태로 제공된다.
- WSL 가상 디스크의 크기가 커져서 호스트 PC의 저장 공간이 부족하다면 다음 과정을 수행한다.  

1. 내 WSL 가상 디스크의 파일 시스템상 위치를 찾는다.  
   (윈도우 탐색기로 `%localappdata%\Packages` 에 들어가 `*.vhd`를 검색)
2. CMD를 관리자 권한으로 실행한다.
3. WSL을 종료한다.
4. 아래 명령어를 입력해 압축한다. 이때 경로엔 앞서 찾은 파일의 전체 경로를 입력한다.

```powershell
diskpart                            # diskpart 시작
select vdisk file="C:\…\ext4.vhdx"  # 앞서 찾은 경로
compact vdisk                       # 압축 시작
exit                                # diskpart 종료
```

## 이하 그리 중요하진 않은 내용들

오늘 주제는 꼭 개발 중에 발생하는 문제만은 아니다. WSL을 사용하면서 주기적으로 해주면 좋은 작업과 거기에 기반한 간단한 컴퓨터 지식에 대해 알아보고자 한다. 사실 나도 이 작업을 지금까지 여러 번 해왔는데, 할 때마다 자꾸 까먹어서 구글을 찾아가는지라 그냥 내 블로그에 적어놓자는 생각으로 글 주제를 정했다. 그래서 오랜만에 언급해 본다. 안 적으면 까먹는다.

### 구구절절

![저장장치](https://i.postimg.cc/RCDt8Fmc/storage.jpg)  
{: .center}

내 개발 장비는 Thinkpad X1 Carbon. 몇 세대인지는 기억이 안 난다. 2년 전에 구매했으니 9세대쯤이려나. 당시 연수생 신분에 주어진 기기 지원금 상한 아래 어느 정도 타협을 봤다. 성능에 대해 불만은 대체로 없지만 단 한 가지, **256GB**라는 부족한 저장 공간은 후회가 된다.

![현재상태](https://i.postimg.cc/k4jMhfV7/image.png)  
현재 상태, 그나마 한 번 정리해서 11GB
{: .center .rounded-edge-16}

지금까지 윈도우의 용량 부족 경고를 여러 번 받아왔다. 각종 프로그램, 문서, 개인 프로젝트들, 사이드로 진행하는 일 때문에 받는 데이터셋 등 여러 요인이 있었지만, 내 컴퓨터에서 가장 큰 공간을 차지하는 녀석은 바로 Ubuntu 20.04 on Windows, 지금도 약 80GB에 달하는 크기를 가지고 있다.

### 한지붕 두가족

![OS가 최소 이정도는 사용중](https://i.postimg.cc/Sx0nSs5Y/system-File.png)  
{: .center .rounded-edge-16}

WSL을 운용한다는 것은 내 윈도우 PC 안에 리눅스로 돌아가는 또 다른 가상 PC를 하나 더 마련하는 것으로 볼 수 있다. 아이디어는 구미가 당기는데, 물리적인 문제가 존재한다. PC 2개의 저장소 수요를 하나의 물리 디스크가 감당해야 한다는 것. 물론 결국 사용자는 1명이기에 용량이 극적으로 폭발하지는 않겠지만, 각 OS의 기본 구성 파일만 해도 그 크기가 작지 않다.

![파일탐색기](https://i.postimg.cc/3R85KqzV/image.png)  
(이것저것 바꾸다 보니 용량 변화가 더 생김)
{: .center .rounded-edge-16}

그런데 위처럼 파일 탐색기에서 드라이브 목록을 보면 불안한 붉은색 아래, 마치 내 컴퓨터에 177GB의 여유 공간이 더 있는 것처럼 나타난다. 사실 WSL의 용량이 중복으로 계산된 것. 왜 이런 일이 발생할까?

### 가상 디스크(Virtual Disk)

안드로이드가 전기양의 꿈을 꾸듯, 가상 머신은 가상 저장 장치를 사용한다. 가상 드라이브 혹은 가상 디스크(Virtual Drive/Virtual Disk)는 실제 저장 장치의 동작을 모방하는 소프트웨어를 뜻한다. 가상 디스크는 가상 머신의 파일 시스템 역할을 수행하게 되는데, 실제 저장 장치에서는 일반적인 파일의 형태로 존재하게 된다. 예를 들어 윈도우에선 [가상 하드 디스크(VHD)](https://ko.wikipedia.org/wiki/VHD_(%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7))라는 기술을 사용해 `.vhd` 혹은 `.vhdx`라는 단일 파일로 제공한다.

![VHD](https://i.postimg.cc/NFxrCtMN/image.png)  
{: .center .rounded-edge-16}

WSL도 물론 VM이라서 가상 디스크를 사용한다. 윈도우 탐색기로 `%localappdata%\Packages`에 들어가 `*.vhd`를 검색해 보자. `ext4.vhdx`라는 파일을 발견할 수 있을 것이다. 약 80GB, 이 파일 하나에 내 Ubuntu의 모든 파일이 들어있다.

### 가상 디스크 압축

파일을 효율적으로 다루는 방식엔 어떤 게 있을까. 파일 이동이 파일 복사보다 빠른 이유는 파일의 물리적 위치를 실제로 옮기는 것이 아니라 파일의 위치 정보만 바꾸면 되기 때문이다. 파일 삭제 명령도 비슷하게 실행할 수 있다. KB, MB 단위를 넘어서는 파일의 실제 데이터를 삭제하는 게 아니라 파일의 참조(Reference)만 삭제하면 해당 파일은 개념적으로 저장 장치에 존재하지 않는 것이 된다.

![공갈빵](https://i.postimg.cc/ydJNSS2X/image.png)  
{: .center .w-half}  

불필요한 임시 파일, 단편화된 파일, 삭제되었지만 디스크에는 아직 남아있는 파일 등. 가상 머신을 오래 사용할수록 이런 찌꺼기 데이터가 계속 쌓여 가상 디스크가 파일 시스템에서 실제보다 더 큰 공간을 차지하고 있다고 나타나게 된다. 따라서 우리는 가상 디스크를 주기적으로 압축해서 최적화해 줘야 하는 것이다.

윈도우에선 "저장 공간 센스" 같은 기능, "드라이브 조각 모음 및 최적화" 같은 도구를 제공해 주고 있지만 WSL의 가상 디스크는 해당하지 않는다. 가상 디스크를 압축하기 위해선 별도로 우리가 명령어를 실행해야 하는데, 이때 윈도우의 `diskpart`라는 유틸리티 프로그램을 사용한다. `diskpart`는 드라이브 파티션을 지정하기 위해 사용되는 도구인데 가상 디스크에 대한 기능 또한 지원해 준다. 그 절차를 하나씩 알아보자.

1. 내 WSL 가상 디스크의 파일 시스템상 위치를 찾는다.  
   (윈도우 탐색기로 `%localappdata%\Packages` 에 들어가 `*.vhd`를 검색)
2. CMD를 관리자 권한으로 실행한다.
3. WSL을 종료한다.
   ```powershell
   wsl --shutdown
   ```
4. `diskpart`를 실행한다. 이때 별도의 명령줄 인터페이스로 접속하게 된다.
   ```powershell
   diskpart
   ```
5. 앞서 찾아둔 경로를 사용해 가상 디스크를 선택한다.
   ```powershell
   select vdisk file="C:\…\ext4.vhdx"
   ```
6. 가상 디스크 압축 명령어를 실행한다. 조금 시간이 걸리니 웹 서핑을 하면서 기다리자.
   ```powershell
   compact vdisk
   ```
7. `exit` 명령어를 입력하면 `diskpart`를 종료할 수 있다. 종료 후 줄어든 파일 크기를 확인하고 다시 WSL을 실행하면 된다.

추가로 윈도우 서버 혹은 pro 버전을 사용해 Hyper-V를 사용 중이라면 `Optimize-VHD` 라는 명령어를 PowerShell에서 사용 가능하다고 한다. 나는 Home 버전 사용하는 일반 사용자라 다른 나라 이야기.

## 내가 배운 것

- 가상 머신은 가상 디스크라는 것을 사용한다.
- 윈도우 pro 버전에는 다른 방법도 존재하더라.
