wsl --install로 배포판을 설치하면 디스크 이미지(ext4.vhdx)가 C:\Users\<사용자>\AppData\Local\... 아래에 만들어진다. 개발 도구와 Docker 이미지를 쌓다 보면 이 파일이 수십 GB로 불어나 C: 드라이브를 압박한다. 이 글에서는 처음부터 다른 드라이브에 설치하는 --location, 설치된 배포판을 옮기는 --manage --move, 버전과 상관없이 쓸 수 있는 --export/--import 세 가지 방법을 정리한다. 모두 WSL 3.0.3, Windows 11 환경에서 테스트 배포판으로 실행했다.
PS C:\> wsl --version
WSL 버전: 3.0.3.0
커널 버전: 6.18.54.1-1
...
현재 배포판 위치 확인
배포판별 설치 경로는 레지스트리 HKCU\...\Lxss의 BasePath에 있다. 스토어 앱으로 설치한 예전 배포판은 Packages 아래, 최근 wsl --install로 설치한 배포판은 AppData\Local\wsl 아래에 있다.
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss |
ForEach-Object { Get-ItemProperty $_.PSPath } |
Select DistributionName, BasePathDistributionName BasePath
---------------- --------
Ubuntu-24.04 C:\Users\junor\AppData\Local\wsl\{870feef2-e909-4fda-9ccc-f135ac0decff}
Ubuntu C:\Users\junor\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState
| 방법 | 명령 | 언제 쓰나 | 이번 테스트 |
|---|---|---|---|
| 설치할 때 위치 지정 | wsl –install <배포판> –location <경로> | 새로 설치 | 성공 |
| 설치 후 이동 | wsl –manage <배포판> –move <경로> | 이미 쓰던 배포판, WSL 2.3 이상 | wsl –shutdown 필요(아래 참고) |
| 내보내기 후 가져오기 | wsl –export → wsl –import | 구버전 WSL, 백업·다른 PC로 복제 | 성공 |
설치할 때 경로 지정 (–location)
--name으로 이름을 따로 주면 같은 배포판을 여러 개 둘 수 있다. --no-launch는 설치 직후 사용자 생성 화면을 띄우지 않는다.
PS C:\> wsl --install Ubuntu-24.04 --name Ubuntu-Test --location D:\WSL\Ubuntu-Test --no-launch
다운로드 중: Ubuntu 24.04 LTS
설치 중: Ubuntu 24.04 LTS
배포가 설치되었습니다. 'wsl.exe -d Ubuntu-Test'을(를) 통해 시작할 수 있습니다.
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2
Ubuntu-Test Stopped 2
Ubuntu Stopped 2
지정한 폴더에 ext4.vhdx(설치 직후 약 1.4GB)와 shortcut.ico가 생긴다.
--no-launch로 설치하면 일반 사용자가 없어 root로 시작한다. 사용자를 만들고 기본 사용자로 지정한다.
PS C:\> wsl -d Ubuntu-Test -- whoami
root
PS C:\> wsl -d Ubuntu-Test -u root -- bash -c "useradd -m -s /bin/bash -G sudo dev && echo ok"
ok
PS C:\> wsl --manage Ubuntu-Test --set-default-user dev
작업을 완료했습니다.
PS C:\> wsl -d Ubuntu-Test -- bash -c "whoami; df -h / | tail -1"
dev
/dev/sde 1007G 1.3G 955G 1% /
레지스트리에도 D: 경로와 기본 사용자 UID가 기록된다. 비밀번호는 wsl -d Ubuntu-Test -u root passwd dev로 따로 설정한다.
DistributionName : Ubuntu-Test
BasePath : D:\WSL\Ubuntu-Test
DefaultUid : 1000
설치된 배포판 옮기기 (–manage –move)
실행 중인 배포판은 옮길 수 없다. 오류 메시지가 해결 방법으로 wsl --shutdown을 알려준다.
PS C:\> wsl --manage Ubuntu-Test --move E:\WSL\Ubuntu-Test
VHD가 현재 사용 중이므로 작업을 완료할 수 없습니다. WSL을 강제로 사용 중지하려면: wsl.exe --shutdown
오류 코드: Wsl/Service/MoveDistro/WSL_E_DISTRO_NOT_STOPPED
--terminate로 해당 배포판만 멈추면 상태는 Stopped가 되지만, 다른 배포판이 돌고 있으면 공유 VM이 VHDX를 계속 붙잡고 있어 여전히 실패한다.
PS C:\> wsl --terminate Ubuntu-Test
작업을 완료했습니다.
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2
Ubuntu-Test Stopped 2
Ubuntu Stopped 2
PS C:\> wsl --manage Ubuntu-Test --move E:\WSL\Ubuntu-Test
다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다.
오류 코드: Wsl/Service/MoveDistro/ERROR_SHARING_VIOLATION
2분을 기다려도 VM 안에서 해당 디스크(sde)가 분리되지 않았고, --unregister를 한 뒤에야 사라졌다. 따라서 이동은 모든 WSL 창과 VS Code 원격 세션을 닫고 PowerShell에서 아래 순서로 한다.
wsl --shutdown
wsl --manage Ubuntu-Test --move E:\WSL\Ubuntu-Test이 PC는 WSL 안에서 작업 세션을 돌리고 있어 --shutdown을 할 수 없었고, 이동 자체의 결과는 확인하지 못했다.
내보내기와 가져오기 (–export / –import)
이동 기능이 없는 구버전이나 다른 PC로 옮길 때 쓰는 고전적인 방법이다. 이동 후 확인용 파일을 하나 만들어 두고 tar로 내보냈다.
PS C:\> wsl -d Ubuntu-Test -- bash -c "echo moved-data > ~/marker.txt; cat ~/marker.txt"
moved-data
PS C:\> wsl --terminate Ubuntu-Test
PS C:\> wsl --export Ubuntu-Test D:\WSLtest\ubuntu-test.tar
작업을 완료했습니다.
1.2GB짜리 tar가 만들어지는 데 약 11분이 걸렸다.
가져올 때는 새 이름과 설치 경로를 준다. 가져오기는 1분 정도 걸렸고 E:에 1.4GB VHDX가 생겼다.
PS C:\> wsl --import Ubuntu-Test2 E:\WSL\Ubuntu-Test2 D:\WSLtest\ubuntu-test.tar
작업을 완료했습니다.
PS C:\> wsl -d Ubuntu-Test2 -- bash -c "whoami; cat /home/dev/marker.txt"
root
moved-data
데이터는 그대로지만 기본 사용자는 tar가 아니라 레지스트리에 저장되므로 root로 돌아갔다. 배포판 안의 /etc/wsl.conf에 적어 두면 다시 가져와도 유지된다.
PS C:\> wsl -d Ubuntu-Test2 -u root -- bash -c "printf '[user]\ndefault=dev\n' >> /etc/wsl.conf; cat /etc/wsl.conf"
[boot]
systemd=true
[user]
default=dev
PS C:\> wsl --terminate Ubuntu-Test2
PS C:\> wsl -d Ubuntu-Test2 -- whoami
dev
같은 이름으로 옮기려면 내보낸 뒤 원본을 --unregister하고 원래 이름으로 import한다. 원본 VHDX가 삭제되므로 tar가 제대로 만들어졌는지 확인한 다음에 지운다.
wsl --export Ubuntu-24.04 D:\backup\ubuntu-2404.tar
wsl --unregister Ubuntu-24.04
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu-24.04 D:\backup\ubuntu-2404.tar
wsl --manage Ubuntu-24.04 --set-default-user <사용자명>rootfs tar만 있으면 스토어에 없는 배포판도 원하는 경로에 바로 만들 수 있다. 3.5MB짜리 Alpine minirootfs는 2초 만에 들어갔고 VHDX는 76MB였다.
PS C:\> wsl --import Alpine D:\WSLtest\Alpine D:\WSLtest\alpine-minirootfs-3.22.2-x86_64.tar.gz
작업을 완료했습니다.
PS C:\> wsl -d Alpine -- cat /etc/alpine-release
3.22.2
테스트 배포판 정리
--unregister는 배포판과 VHDX를 함께 지운다. 되돌릴 수 없으므로 이름을 반드시 확인한다.
PS C:\> wsl --unregister Ubuntu-Test
작업을 완료했습니다.
PS C:\> wsl --unregister Ubuntu-Test2
작업을 완료했습니다.
PS C:\> wsl --unregister Alpine
작업을 완료했습니다.
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2
Ubuntu Stopped 2
주의사항
| 증상 | 원인 | 조치 |
|---|---|---|
| –move가 WSL_E_DISTRO_NOT_STOPPED | 배포판 실행 중 | wsl –shutdown 후 재시도 |
| –terminate 후에도 ERROR_SHARING_VIOLATION | 다른 배포판이 돌고 있어 VM이 VHDX를 놓지 않음 | 모든 WSL 세션을 닫고 wsl –shutdown |
| –export –format vhd도 ERROR_SHARING_VIOLATION | 같은 이유(VHDX 직접 복사) | wsl –shutdown 후 실행하거나 tar 형식 사용 |
| import 후 root로 로그인됨 | 기본 사용자는 레지스트리에 저장되어 tar에 안 들어감 | wsl –manage –set-default-user 또는 /etc/wsl.conf [user] default= |
| export가 오래 걸림 | 파일 단위로 tar 생성(이번 테스트 1.2GB에 약 11분) | 시간 여유를 두고 실행, 이동만 목적이면 –manage –move |
| –unregister 후 복구 불가 | VHDX까지 삭제 | 먼저 export 백업, 이름 재확인 |
| 압축 폴더(NTFS 압축)에 VHDX를 두면 실패 | WSL2 VHDX는 압축·암호화 폴더 미지원 | 일반 폴더 사용 |
마무리
새로 설치한다면 wsl --install --location이 가장 간단하다. 이미 쓰던 배포판은 wsl --shutdown 뒤 --manage --move로 옮기고, 구버전이거나 백업까지 남기고 싶다면 --export/--import를 쓴다. 이 경우 /etc/wsl.conf에 기본 사용자를 적어 두면 root로 로그인되는 문제를 피할 수 있다.