::: IT인터넷 :::

WSL의 우분투 OS 경로 변경

곰탱이푸우 2022. 4. 25. 08:20
윈도우 10에서 지원하기 시작한 WSL (Windows Subsystem for Linux)은 상당히 편리하다.
WSL 자체도 결국 윈도우 OS에서 가상 환경으로 동작하는 리눅스이다.
VMware와 VirtualBox 없이 윈도우와 리눅스를 조합하여 사용하는 것은 아직도 어색하다.
그렇다고 해도 WSL 자체가 MS의 엄청난 결단인 것을 부정할 수는 없다.
 
그러나 기존에는 HyperV 가상 환경 기술의 충돌로 인해 Docker와 VMware를 동시에 사용할 수 없었다.
Docker를 사용하려면 HyperV를 켜야 하는데, VMware는 자체 가상화 기술 사용을 위해 HyperV를 꺼야 했다.
결국 둘 중 하나를 포기하거나, VMware 내부에서 Docker를 사용해야 했는데 2021년에 아래와 같이 해결되었다.
  • 윈도우는 Professional 버전 이상, 2021년 5월까지 업데이트 이후 적용
  • VMware는 Workstation 15.5.5 이상 적용
 
위의 조건을 만족하면 다중 HyperV를 사용할 수 있기 때문에 Docker와 VMware를 동시에 사용할 수 있다.
윈도우 운영체제의 WSL을 활성화하고 Docker를 설치하는 방법은 다음 포스팅을 참고한다.
 

WSL과 C드라이브

정상적으로 WSL과 Docker를 사용할 수 있다면 다행이지만, 사실 다루지 않은 문제가 두 가지 있다.
이번 포스팅을 작성하는 목적이기도 하다.
  • WSL을 구성하는 가상 환경의 기본 경로가 C드라이브이다.
  • C드라이브의 용량이 작으면 Docker 이미지 저장에 한계가 있다.
 
개인적으로 윈도우가 설치 된 C드라이브는 256GB이며, 데이터를 저장하는 D드라이브는 1TB이다.
WSL 뿐 아니라 Docker 이미지도 1TB의 D드라이브를 활용하는 것이 훨씬 효율적이다.
 
대부분의 Docker 이미지는 최적화 되어 있기 때문에 용량이 크지 않다.
그렇지 못한 경우도 있고, HDP Sandbox와 같이 여러 플랫폼이 섞여 있는 경우 용량이 상당히 크다.
HDP Sandbox의 이미지는 22~25GB 정도 되는데 256GB의 C드라이브에는 상당한 부담이 된다.
 
HDP Sandbox 설치는 다음 포스팅을 참고한다.

WSL 기본 경로 변경

WSL의 기본 경로

WSL의 기본 경로는 다음과 같다. WSL에서 우분투 20.04 LTS 버전을 사용한다고 가정한다.
C:\Users\사용자명\AppData\Local\Packages
  \CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalCache
  \ext4.vhdx
 
WSL 2에서는 vhdx라는 확장명의 가상 디스크가 생성되고, 해당 파일 내부에 리눅스 파일 시스템이 동작하는 형태로 되어 있다.
WSL 1에서는 전체 경로가 마운트 되어, 윈도우 OS에서 리눅스의 폴더 구조를 볼 수 있었다.
 
이제 vhdx 파일을 D드라이브로 옮기면 된다.

 

 

기본 경로 바꾸기

단순히 vhdx 파일만 D드라이브로 옮기면 좋겠지만, WSL을 활성화하면서 우분투 OS를 마이크로소프트 스토어에서 설치했다.
즉, 윈도우 App 형태로 설치한 것이며 다른 의존성이 존재할 수 있으므로, 파일을 다른 경로로 옮기고 나서 부가적인 설정들을 변경해야 한다.
 
이러한 작업들을 모두 체크해서 진행하긴 어렵고, GitHub에 스크립트 파일을 제공하는 프로젝트가 있다.
아래와 같이 쉘 (sh) 파일, 배치 (bat) 파일, 파워쉘 스크립트 (ps1) 파일을 제공하는데 배치 파일을 사용한다.

 

move-wsl.bat 파일을 다운로드하거나, 전체 파일을 다운로드하고 압축을 해제한다.
그리고 사전에 아래 내용을 확인한다. WSL 버전이 2인 것을 확인한다.
> wsl -l -v
  NAME            STATE          VERSION
* Ubuntu-20.04    Running        2

> wsl -t Ubuntu-20.04
> wsl -l -v
  NAME            STATE          VERSION
* Ubuntu-20.04    Stopped        2
 
WSL이 1개만 있으면 --shutdown 옵션을 써도 되지만, 2개 이상인 경우 다른 이미지까지 모두 종료된다.
따라서 --shutdown 옵션 보다는 -t 옵션으로 종료할 리눅스를 지정하는 것을 권장한다.
 
이제 아래 명령을 사용해서 vhdx 파일을 옮긴다.
> move-wsl.bat Ubuntu-20.04 d:\WSL2\Ubuntu-20.04
 
해당 명령을 실행하면 스크립트가 동작하면서 파일 이동이 진행된다.
기존 이미지를 Export하고 파일 위치를 옮긴 이후 다시 Import 하는 과정이므로 시간이 조금 걸리는 편이다.
 
위의 내용은 아래 블로그를 참고하여 진행하였다.
 

WSL 2로 변환

실행이 완료되고 wsl을 실행해서 dockerd 데몬을 실행해보면 iptable not found 오류가 발생한다.
 
처음엔 Docker 데몬과 WSL의 iptable 설정 오류인 줄 알고 트러블슈팅을 진행했지만 해결되지 않았다.
혹시나 싶어 vhdx 파일을 옮긴 경로를 확인하니, vhdx 파일은 없고 아래와 같은 폴더가 확인되었다.
 
이렇게 확인 되는 경우 WSL 1 상태를 의미한다. 작업할 때 미처 WSL 2로 변환하지 못했을 가능성도 있다.
아니면 해당 스크립트가 동작하면 WSL 2의 vhdx 파일도 WSL 1 형태로 Import 하고 끝났을 수도 있다.
 
중요한 건 WSL 1 상태의 우분투 이미지를 WSL 2로 변환하는 것이다.
(나중에 알게 된 사실이지만, WSL 1에서는 iptable을 지원하지 않아 Docker 데몬이 실행되지 않는다.)
 
해결 방법은 진짜 간단하다. 아래 명령만 실행하면 된다.
> wsl --set-version Ubuntu-20.04 2
 
Ubuntu-20.04 이미지의 WSL 버전을 2로 변환한다는 명령어이다.
다음과 같이 변환이 진행된다.
 

변환 결과 확인

다시 vhdx 파일을 옮긴 경로를 확인해 보면 아래와 같이 vhdx 파일을 확인할 수 있다.
 
sudo dockerd를 실행하면 오류 메시지 없이 정상 실행된다.
 
Docker 이미지 다운로드도 잘 된다.

 

아래 명령으로 확인해보면 우분투의 기본 파티션 크기는 변하지 않았다.

 

 
256GB의 C드라이브에 WSL을 설치하면서 기본 파티션 용량이 설정되었기 때문이다.
현재 가상 이미지를 D드라이브로 옮겼기 때문에, WSL 내부에서 작업을 수행하면 D드라이브의 용량이 줄어든다.
 
약 32.5GB에 달하는 HDP Sandbox 이미지를 pull 하고 사용된 공간을 확인해보면 다음과 같다.
 
/의 크기가 32GB 늘었고, /mnt/c는 2GB 줄고, /mnt/d가 34GB 늘어난 것을 확인할 수 있다.
이동한 vhdx 파일에 정상적으로 적용되는 것으로 확인된다.