복수의 WSL 사용하기 (feat. Windows & WSL)
문제 : WSL2와 Windows의 file system
Windows에 WSL(Windows Subsystem for Linux)이 생겨난 뒤로 코딩 환경이 크게 개선되었다. 현재는 일반 GUI 작업은 윈도우 측에서 수행하고, 코딩이나 개발 관련된 작업은 WSL 측에서 수행한다. WSL에 대한 세부적인 내용은 WSL에 대한 공식 문서를 참조하자.
그러나 다음과 같은 현실적인 문제가 있다.
- SSH, Git과 같이 윈도우와 WSL 양쪽 모두에서 사용해야 하는 경우는 부득이 양쪽 모두에 설치할 수 밖에 없다.
- WSL에는 기능 제한이 있다.
- WSL1(WSL version1)의 경우, kernel 접근이 제한되므로 docker 등을 사용할 수 없다.
- WSL2(WSL version2)의 경우, kernel까지 완전히 접근 가능하여 사실상 Linux 그대로라고 할 수 있다. 그러나 윈도우 file system이 아닌 linux file system을 사용한다. 때문에 WSL2에서 윈도우 파일 시스템에 접근하거나 그 반대의 경우 속도가 느려진다. 사실상 작업을 하기 어렵다. 따라서 Microsoft에서는 윈도우 관련 파일은 윈도우 file system 안에서, WSL 관련 파일은 WSL 안에 있는 linux file system 안에서 사용할 것을 권장하고 있다.
나는 보통 윈도우 환경에서 VS Code(Visual Studio Code)를 실행시키고, VS Code 안에서 WSL에 접근한 다음, 코딩을 하거나 개발 작업을 수행한다. VS Code는 윈도우에서 동작하지만, 개발 자체는 WSL에서 작업하는 것이다. VS Code에서는 이미 이런 방식을 상정하고 기능을 제공하고 있다. 구체적인 방법은 공식 홈페이지의 글 “Developing in WSL“를 참고하자.
문제는 여기서 발생한다. 나의 경우 주요 작업 파일들을 윈도우 파일 시스템에 만들어 놓고, WSL에서 여기에 접근하여 작업을 하는 방식을 택하고 있다. 그 이유는 다음과 같다.
- GUI 파일 탐색기를 지원한는 윈도우 쪽에서 파일을 다루는 것이 CLI 기반의 WSL에서 파일을 다루는 것보다 더 편리하다.
- 파일은 윈도우 파일 시스템에 두면 윈도우와 WSL에서 모두 쉽게 접근할 수 있지만, WSL쪽에 두면 Windows에서 접근하기에 직관적이지 않다.
- 가장 중요한 이유이다. 주요 작업 파일은 안전을 위해 OS가 설치되어 있지 않은 별도의 물리 드라이브에 두고 백업을 설정해 둔다. 하지만 WSL 쪽에 작업 파일을 나누어 두면
- 파일을 Windows 측에 두었는지 WSL 측에 두었는지 찾아야 할 때가 있다.
- 또 외부로 백업이 어렵고
- Windows OS에 문제가 생겼을 때 WSL Linux file system에 있던 파일에 접근하거나 이를 되살리기 어려워진다.
그래서 나의 경우 다음과 같이 운용하고 있다.
- 작업 파일 위치 : Windows 측 (e.g. Windows File System
D:\Projects
) - 개발 도구 실행 : Windows 측 (e.g. VS Code in WSL )
- 개발 관련 라이브러리 사용 및 실행 : WSL 측 (e.g. python, git, nodejs … )
현재 Microsoft에서는 WSL2 사용을 권장하고 있다. 하지만 위와 같은 나의 상황 때문에 file system 사이의 접근이 느린 WSL2를 전적으로 사용하기 어렵다.
방법: 복수의 WSL 설치
이 문제를 다음과 같이 해결해 보았다.
- 윈도우에 복수의 WSL distro를 설치한다. 즉, WSL1 기반의 Ubuntu(이하 Ubuntu-WSL1)와 WSL2 기반의 Debian(이하 Debian-WSL2)를 각각 설치한다.
- Ubuntu-WSL1을 기본으로 사용하고,
- docker와 같이 kernel을 이용해야 할 부분만 Debian-WSL2에 설치하여 사용한다.
이를 정리하면 다음과 같다.
- 작업 파일 위치 : Windows 측 (e.g. Windows File System
D:\Projects
) - 개발 도구 실행 : Windows 측 (e.g. VS Code in WSL )
- 개발 관련 라이브러리 사용 및 실행 : WSL1 측 (e.g. python, git, nodejs … )
- linux kernel이 필요한 라이브러리 사용 및 실행 : WSL2 측 (e.g. docker … )
이제 구체적인 설치 방법을 살펴보자.
WSL 설치에 대해서는 공식 문서에 잘 설명되어 있으므로 명령어 중심으로 정리하겠다. Windows Powershell에서 작업하는 것인지, WSL shell에서 작업하는 것인지 유념하자. Windows Powershell은 관리자 권한으로 실행시켜서 명령을 수행해야 한다.
1st and 2nd WSL 설치
복수의 WSL을 설치하기 위해서는 다음과 같은 과정이 필요하다. 서로 다른 distro를 설치하는 것이 관리하기 쉽다.
# Windows Powershell
# install WSLs
## 옵션: 설치 가능한 distro의 정보를 알아보자.
wsl --list --online
## 1st WSL 설치 (Ubuntu-24.04)
wsl --install Ubuntu-24.04 --name Ubuntu2404-WSL2
## 2nd WSL 설치 (Debian)
wsl --install Debian --name Debian-WSL2
# Windows Powershell
# 추가 설정
## 1st WSL을 WSL version 1로 수정
wsl --set-version Ubuntu2404-WSL1 1
## (optional) 1st WSL을 기본 distro 변경
wsl --set-default Ubuntu2404-WSL1
wsl.exe
에서 자주 쓰는 명령어는 다음과 같다.
# Windows Powershell
# 설치 가능한 WSL distro 확인
wsl --list --online
# local에 설치된 WSL 확인
wsl --list -v
# WSL 실행
wsl -d <WSL name>
# WSL 종료
wsl -t <WSL name>
# 모든 WSL 종료
wsl --shutdown
# wsl 사용법
wsl --help
Tip
link folders
나의 주요 작업 폴더가 윈도우 기준 D:Working
라고 해보자. WSL1에서 이곳에 ~/Working
으로 접근하고 싶다면 어떻게 해야 할까?
다음과 같이 심볼릭 링크를 걸어주면 된다.
# Ubuntu2404-WSL1
ln -s /mnt/d/Working /home/<wsl username>/Working
Windows와 app 설정 공유
다음 글을 참고하자.
Root 권한 사용 불가
만약 WSL에서 sudo
권한을 쓰려고 할 때 “user is not in the sudoers file.”이라는 메시지와 함께 root 권한에 접근할 수 없다면? 현재 user에서 sudo 권한이 없다는 의미이다. 다음과 같이 해결한다.
# Windows Powershell
# WSL에 root 권한으로 로그인
# wsl -l -v
wsl -d <WSL name> -u root
# WSL Bash Shell / # as root
# 'sudo'를 쓰기 위해 기본 user를 sudo group에 넣기
usermod -a -G sudo <wsl username>