devAlice
← Windows

WSL2 튜닝 — 메모리·systemd·DNS·I/O 한 번에 잡기

WSL2를 설치한 다음 가장 자주 막히는 7가지 — .wslconfig·systemd·DNS·디스크 압축·VS Code 통합·네트워크.

Windows 11 초기 셋업에서 WSL2를 설치했다면 두 번째 단계는 튜닝이다. 기본값 그대로 쓰면 메모리 폭주·DNS 단절·디스크 비대화·systemd 부재 같은 문제가 누적된다. 이 가이드는 7가지 튜닝을 한 번에 정리한다 — 한 번 적용하면 매일 누리는 차이가 크다.

대상: Windows 11 (22H2 이상) + WSL2 + Ubuntu (또는 다른 systemd 기반 배포판).

TL;DR

튜닝파일효과
1. .wslconfig%USERPROFILE%\.wslconfig (Windows)메모리/CPU/스왑 한도 + GUI · 미러 네트워크
2. wsl.conf systemd/etc/wsl.conf (WSL 내)systemd 활성화 → snap·docker·systemctl 정상
3. DNS 안정화/etc/wsl.conf + /etc/resolv.conf회사 VPN·재부팅 후 DNS 끊김 방지
4. I/O 성능작업 위치 선택Windows 경로(/mnt/c/...) 대신 WSL 네이티브(/home/...) 사용
5. 디스크 압축export/import늘어난 vhdx 다시 축소 (수십 GB 회수 가능)
6. VS Code Remote-WSL확장 1개WSL의 파일을 네이티브 속도로 편집
7. 미러 네트워킹.wslconfig networkingMode=mirroredVPN·회사망 친화 (Win11 22H2+)

사전 조건

  • Windows 11 22H2 이상 (일부 기능은 23H2+ 권장)
  • WSL2 설치됨 + Ubuntu (또는 systemd 기반 배포) 1개 이상
    • 미설치: 관리자 PowerShell에서 wsl --install
  • 관리자 권한 (.wslconfig는 사용자 폴더라 일반권한 OK, wsl --shutdown은 관리자 권장)

1. .wslconfig — 메모리·CPU·스왑 한도

기본값으로는 WSL이 Windows RAM의 절반까지 점유 가능 → 큰 Node 빌드 시 Windows 본체가 스왑에 빠진다. 명시적으로 한도를 둔다.

1.1 템플릿 다운로드

.wslconfig
# PowerShell
Invoke-WebRequest -Uri https://devalice.jaceclub.com/assets/windows/wsl-tuning/wslconfig-template.txt -OutFile $env:USERPROFILE\.wslconfig
Get-FileHash $env:USERPROFILE\.wslconfig -Algorithm SHA256
# 기대값: bfbdaf7ae486916d8aa4e792f9845416e1b6b6ea535f84e1bbcca2be9accb3c4

1.2 핵심 설정

# %USERPROFILE%\.wslconfig
[wsl2]
memory=8GB             # 호스트 RAM의 50~75%
swap=4GB               # 디스크 스왑 (0 = 비활성)
localhostForwarding=true
guiApplications=true   # Linux GUI 앱 (Win11 기본 활성)
# processors=8         # 명시적 코어 제한 (선택)

1.3 적용

wsl --shutdown   # 모든 WSL 인스턴스 종료
wsl              # 재시작 시 .wslconfig 자동 반영

1.4 확인

WSL 안에서:

free -h          # 메모리 한도 = 8GB 확인
nproc            # CPU 개수
swapon --show    # 스왑 활성 여부

RAM이 16GB인 머신은 memory=10GB 정도가 적정. 32GB 머신은 memory=16GB 권장.

2. systemd 활성화 — /etc/wsl.conf

WSL2 기본 init은 systemd가 아니라 자체 init. Ubuntu 22.04+ 등 systemd 의존 패키지(docker, snap, postgresql 서비스 등)가 정상 동작하지 않는다.

2.1 활성화

# WSL 안에서 (sudo 필요)
sudo nano /etc/wsl.conf

내용:

[boot]
systemd=true
 
[user]
default=me          # 기본 사용자 (선택)

저장 후:

# Windows PowerShell
wsl --shutdown
wsl

2.2 확인

ps -p 1            # PID 1이 systemd면 성공
systemctl status   # systemd 상태 표시되면 OK

이제 sudo systemctl start docker 같은 명령이 정상 동작.

활성화 후 부팅 시간이 1~3초 늘어남. 대신 서비스 매니저·로그 통합·tab completion 등 ergonomics 큰 폭 개선.

3. DNS 안정화

WSL2의 기본 DNS는 Windows의 NAT 인터페이스를 거치는데, VPN 연결/해제, 재부팅 후 종종 끊긴다. 증상: curl github.com 은 되지만 apt update 가 안 되거나 그 반대.

3.1 옵션 A — 자동 DNS 비활성화 + 고정 DNS

sudo nano /etc/wsl.conf

추가:

[network]
generateResolvConf=false

저장 → wsl --shutdown 후 재시작.

이제 WSL이 /etc/resolv.conf를 건드리지 않음. 수동 작성:

sudo nano /etc/resolv.conf
nameserver 1.1.1.1
nameserver 8.8.8.8

회사망/VPN 사용 시: 사내 DNS 추가 (회사 IT에서 안내받은 IP).

3.2 옵션 B — 미러 네트워킹 (Win11 22H2+, 권장)

3.1 대신 7장 미러 네트워킹으로 가면 DNS도 Windows 호스트와 동일 → 자동 해결. 회사 VPN 환경에서 가장 안정.

4. I/O 성능 — 어디서 작업할 것인가

가장 자주 놓치는 부분. WSL2의 파일시스템 성능 차이:

작업 위치경로 예시빌드 속도 (npm install 기준)
WSL 네이티브/home/me/project✅ 빠름 (Linux ext4)
Windows mount/mnt/c/Users/me/project❌ 5~10배 느림 (9p 프로토콜)

원칙: WSL 안의 작업은 WSL 디스크 안에서. Windows 본체에서 같은 파일을 자주 봐야 한다면 VS Code Remote-WSL(6장) 또는 Syncthing(Mac↔Win 파일 동기화 참고)으로 양쪽 사본 유지.

4.1 좋은 패턴

# WSL 안
mkdir -p ~/work
cd ~/work
git clone git@github.com:org/repo.git
cd repo
npm install              # 빠름

4.2 피할 패턴

# 윈도우에서 클론하고 WSL에서 빌드
cd /mnt/c/Users/me/Documents/project   # cross-mount
npm install                             # 느림 (수십 분)

4.3 cross-mount가 필요한 경우

  • Windows 도구로도 같은 폴더를 직접 열어야 하는 경우 (Photoshop 등 — 드물다)
  • Windows 본체에서 IDE 사용 — 이건 VS Code Remote-WSL로 해결 가능

5. 디스크 사이즈 관리 — vhdx 압축

WSL의 가상 디스크 .vhdx는 한 번 커지면 자동으로 줄지 않는다. 30GB 빌드 캐시를 만들고 지워도 파일은 30GB로 남는다.

5.1 현재 사이즈 확인

# PowerShell
Get-ChildItem -Path "$env:LOCALAPPDATA\Packages" -Recurse -Filter "ext4.vhdx" | ForEach-Object {
  "{0,-60} {1:N2} GB" -f $_.Directory.Name, ($_.Length / 1GB)
}

5.2 옵션 A — Sparse VHD (Win11 22H2+)

.wslconfig에 (이미 1.2 템플릿에 주석으로 포함):

[experimental]
sparseVhd=true

wsl --shutdown 후 자동 활성. 사용 안 하는 공간이 점진적으로 회수됨.

5.3 옵션 B — 수동 압축 (diskpart)

WSL을 종료한 상태에서:

wsl --shutdown
 
diskpart
# diskpart>
select vdisk file="C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_*\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

수십 GB 단위로 회수 가능. 시간이 오래 걸리니 야간 작업 권장.

5.4 옵션 C — Export/Import (가장 깨끗)

WSL 인스턴스를 통째로 백업 후 재생성. 새 vhdx는 사이즈가 최적화됨.

wsl --shutdown
wsl --export Ubuntu C:\backup\ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu C:\WSL\Ubuntu C:\backup\ubuntu.tar

옵션 C는 가장 효과적이지만 인스턴스 ID·인스톨 메타가 새로 생성된다. systemd 옵션·기본 사용자 등 재설정 필요. 이주 시점에 함께 진행 권장.

6. VS Code Remote-WSL

WSL의 파일을 Windows VS Code에서 네이티브 속도로 편집. cross-mount 문제 해결의 표준 답.

6.1 설치

Windows VS Code 확장 마켓에서:

  • Remote - WSL (ms-vscode-remote.remote-wsl)

또는 명령줄:

code --install-extension ms-vscode-remote.remote-wsl

6.2 사용

WSL 안에서:

cd ~/work/repo
code .

→ Windows VS Code가 열리고 좌측 하단에 WSL: Ubuntu 표시. 파일 시스템·터미널·확장 모두 WSL 안에서 동작.

또는 Windows VS Code의 Command Palette → WSL: Connect to WSL → 폴더 선택.

6.3 권장 확장 (WSL 안 자동 설치)

WSL Remote에 첫 연결 시 일부 확장은 "WSL 쪽에 설치하시겠습니까?" 묻는다. 다음은 WSL 쪽 설치 권장:

  • ESLint / Prettier
  • Python / Pylance
  • Go / Rust-Analyzer
  • Docker

7. 미러 네트워킹 (Win11 22H2+)

3장의 DNS 안정화를 더 우아하게 해결. WSL이 Windows 네트워크 인터페이스를 그대로 미러링 → VPN·회사망·DNS·localhost 모두 호스트와 동일.

7.1 활성화

.wslconfig에:

[wsl2]
networkingMode=mirrored
 
[experimental]
dnsTunneling=true
autoProxy=true

wsl --shutdown 후 재시작.

7.2 효과

  • VPN 연결 시 WSL도 자동으로 VPN 경유 (별도 설정 불요)
  • 회사 프록시 Windows의 IE/Edge 프록시 자동 반영
  • localhost Windows ↔ WSL 양방향 자동 연결 (localhostForwarding 불필요)
  • DNS Windows의 DNS 그대로 → 가장 안정

7.3 주의

  • Docker Desktop과 충돌하는 경우가 있음 (특정 빌드) — 문제 시 비활성화 후 확인
  • 일부 컨테이너 네트워크 시나리오에서 동작 차이 — 깊은 컨테이너 networking 작업 시 검증 필요

검증 방법

다음 5종 통과:

  1. WSL 안 free -h → 메모리 한도가 .wslconfig 값(예: 8.0Gi)
  2. ps -p 1systemd (실행 파일 이름)
  3. curl -sS https://www.google.com -o /dev/null && echo OK → OK (DNS·네트워크)
  4. cd ~ && touch test.txt && ls vs cd /mnt/c/Users/$USER && touch test.txt && ls — 두 경로 모두 정상 동작 (속도 차이만)
  5. VS Code → code . → 좌측 하단 WSL: Ubuntu 표시 확인

트러블슈팅

.wslconfig 변경이 반영 안 됨

  • wsl --shutdown 빠뜨림. 모든 WSL 인스턴스가 완전히 종료된 후 재시작해야 함.
  • 파일 위치 확인: %USERPROFILE%\.wslconfig (사용자 홈)이지 %LOCALAPPDATA%나 다른 곳 아님.
  • 파일 확장자가 .wslconfig (점 시작, 다른 확장자 없음).

systemd 활성화 후 부팅 실패

  • /etc/wsl.conf 문법 오류 흔함. [boot] 섹션 헤더 빠뜨림 등.
  • 복구: PowerShell에서 wsl -u root -d Ubuntu 로 root 진입 후 /etc/wsl.conf 수정.

apt update 가 DNS 에러

  • 3.1 옵션 A로 /etc/resolv.conf 수동 작성. 또는 7장 미러 네트워킹으로 전환.
  • VPN 사용 중이라면 회사 DNS 추가 필요.

npm install이 끔찍하게 느림

  • 4장 — /mnt/c/... cross-mount에서 작업 중. ~/work로 이동해서 작업.

VS Code Remote-WSL이 연결 실패

  • code 명령이 PATH에 없는 경우. Windows에서 VS Code를 한 번 열고 Command Palette → Shell Command: Install 'code' command in PATH.
  • WSL 안에서 code -v 동작 확인.

Mirrored networking 후 Docker Desktop 깨짐

  • Docker Desktop이 networkingMode=NAT 기반으로 동작하던 경우. Docker Desktop의 WSL 통합 설정을 확인하거나, 본 옵션을 비활성화 후 Docker 사용.

vhdx 사이즈가 안 줄어듦 (5장)

  • diskpart의 compact vdisk는 디스크 fragmentation에 따라 효과가 제한적. 옵션 C(export/import)가 가장 깨끗.

참고

변경 이력

  • 2026-05-12: 첫 작성. 7개 튜닝 + .wslconfig 템플릿 자산 + 검증 5종 + 트러블슈팅 7종.

댓글