[WSL] WSL1과 WSL2 환경 분리하기

목차

  1. 다시 한 번 WSL의 중요성
  2. WSL1과 WSL2 분리하기
  3. NTFS와 WSL의 연동
  4. 현재 진입한 WSL의 버전을 쉽게 알아 보는 방법


다시 한 번 WSL의 중요성

Microsoft는 Windows10을 발표하며 회사의 여러 가지 전략을 수정하였는데, 그 중 하나로 Windows10에서 Linux를 지원하는 방법이었다. Linux와 Mac의 개발환경을 Windows10에서도 거의 비슷하게 가져갈 수 있다는 점은 분명히 강력한 장점이다.

특히 Visual Studio가 Windows Kernel에 특화된 기능들 몇 개가 있어 MacOS에서 정상적으로 작동하지 않기 때문에 VS로 개발해야 하는 개발자들에게는 특히나 희소식일거다. 또한, WSL을 사용하면 Windows 사용자가 Linux용 실행 파일을 실행하기 위해 가상 환경을 설치/운영할 필요가 없고, 또 반대로 Linux용 실행 파일을 윈도우 환경에서 구동하기 위해 복잡하고 어려운 설치/포팅 환경을 제공하지 않아도 된다.


WSL1과 WSL2 분리하기

필자는 개인적인 취향(?)으로 WSL1과 WSL2를 모두 사용하고 있다. WSL1을 사용하다가 WSL2로 넘어왔는데 어떤 문제가 있었기 때문이다.

WSL1과 WSL2의 차이 중 아키텍터 부분에 대한 이야기는 「WSL은 무엇인가?」에서 아키텍처 관점의 내용을 살짝 다루었으니 참고하시기 바란다. 이런 차이가 나타나는 이유는 WSL1은 가상화에 의존하지 않고 시스템 콜 번역을 위한 드라이버를 배치하여 Linux를 Windows10에 올려 사용하려 했으며, NTFS를 Linux용으로 확장해서 Linux 파일 시스템을 직접적으로 연결했었다. 그러나 WSL2는 조금 더 가상화 기술을 도입하여 보다 안정적으로 시스템을 운영할 수 있게 되었다.

Microsoft의 「WSL1과 WSL2 비교」 페이지에 보면 아래와 같은 표가 있다.

WSL1과 WSL2에 대한 공식 비교표

이 표에 따르면 WSL1에서는 가상 환경이 아닌 실제 Linux Driver를 제공하려 했었고, 관리VM을 사용하지 않았다. 그 결과 전체 Linux System Call을 사용할 수 없어 전체 Linux 기능을 사용할 수는 없었다. WSL2에서는 이를 가상환경으로 변경하여 전체 Linux 커널을 사용할 수 있도록 변경하였으며, 그 결과 전체 Linux System Call을 사용할 수 있게 되었다. 그러나 가상 환경을 거쳐 Bash shell 명령을 번역하는 구조로 되어 있어 Windows 시스템의 파일과 Linux 시스템의 파일간 연결은 약간 느려진다.

실제로 필자는 2종류의 JAM(JavaScript, APIs, Markup) Stack을 사용하고 있는데, 본 블로그를 생성하는 Hexo와 다른 블로그의 Jekyll이다. WSL2로 변경하고 난 뒤 JAM Stack으로 Static file genreate 명령 실행 시 약간 끊어진다는 느낌을 받게 되는데, 이 과정이 최소 하루에 한 번씩은 있다보니 그냥 WSL1을 사용하는게 정신건강에 이롭겠다는 생각이 들었다.

몸이 아플 땐 의사 보단 퇴사 - feat. 미미 시스터즈

(의사도 보지 않고 싶고, 퇴사도 하지 못하는) 개인의 취미 생활의 정신건강 보존을 위해 WSL1과 WSL2를 분리하기로 했다. 인터넷을 검색해서 아래의 진행 방식을 만들었다. 아래를 이용하여 WSL을 복사하여 WSL1에서 Hexo를 사용하고, WSL2에서 Docker를 사용하여 여러 시스템들 개발 시 사용하고 있으며, 회사와 개인 컴퓨터 총 3개에서 WSL1와 WSL2 환경을 완전히 분리해서 사용하고 있다. 그리고 지금 이 글을 쓰는 순간까지 몇 달 동안 이게 문제를 일으킨 경우는 한 번도 없다.


WSL1과 WSL2를 분리하기

  1. 필자의 경우 wsl -l 실행 시 아래와 같이 Ubuntu 1개가 표시된다.
    (docker는 WSL2용 docker를 표시하는 부분이므로 일단 이번 글에서는 무시하자.)

WSL List 보기

  1. 아래의 명령을 실행하면 현재 사용중인 Default WSL을 파일로 저장할 수 있다.
    1
    wsl.exe --export Ubuntu $env:USERPROFILE\UbuntuWSL1.tar
  2. 다음 사용자 폴더 내에 UbuntuWSL2라는 폴더를 새로 생성하자.
    (사용자 폴더 = c:\Users\사용자 로그인명)

tar 압축 파일과 새로 생성한 빈 폴더를 확인

  1. tar 압축 파일과 폴더를 생성했음을 확인 후 아래의 명령을 실행한다.
    1
    wsl.exe --import UbuntuWSL2 $env:USERPROFILE\UbuntuWSL2 $env:USERPROFILE\UbuntuWSL1.tar --version 2

위 명령어의 사용 설명은 아래와 같다.

1
wsl.exe --import [WSL에서 보일 목록 이름] $env:USERPROFILE\[폴더 위치] $env:USERPROFILE\[압축파일 위치] --version 2

  • –import는 WSL의 명령어로 WSL 이미지를 불러오는 데에 사용한다.
  • $env는 윈도우 사용자 폴더를 의미한다.
  • USERPROFILE은 해당 윈도우에 로그인해 있는 사용자의 프로필 아이디를 의미한다.
  • –version 2는 새로 생성하는 이미지를 WSL2로 설정하라는 의미이다. –version 1로 하면 WSL1으로 생성한다.

  1. 명령이 실행되면 default WSL 이미지를 복제한 UbuntuWSL2라는 WSL 이미지가 생성되어 있어야 한다. 이를 확인해 본다.
    1
    2
    wsl --list --verbose
    wsl -l -v

위 1~5번까지의 실행 결과는 아래와 같다.

tar 압축 파일과 새로 생성한 빈 폴더를 확인

  1. 새로 생성한 UbuntuWSL2를 「기본 WSL」로 설정하자.
    「기본 WSL」이란, Windows Terminal을 실행 후 PowerShell에서 ‘wsl’만 입력 했을 때 들어가지는 이미지를 말한다.
    1
    wsl --set-default UbuntuWSL2

그 후 wsl -l -v 해서 WSL의 세부 목록을 확인하면,

  • UbuntuWSL2가 Version 2로 되어 있고, * 표시로 Default 표시된다.
  • Ubuntu는 Version 1으로 되어 있고 * 표시가 없다.

tar 압축 파일과 새로 생성한 빈 폴더를 확인

  1. 원래 Ubuntu의 WSL version을 1로 설정한다.

필자의 경우와 다르게 default WSL의 버전이 2로 설정되어 있었던 경우, WSL1으로 변경하여 사용할 수 있다.

1
wsl --set-version Ubuntu 1

위와 같이 조치하고 나면 WSL1과 WSL2를 동시에 사용할 수 있다.
① Windows Terminal을 이용하여 ‘wsl’을 입력하면 UbuntuWSL2가 실행되고,
② Windows10에서 Ubuntu 앱을 실행하면 WSL1이 실행된다.

단, 이렇게 분리한 경우 환경이 2개가 생기는 것이므로 시스템 update 및 upgrade도 각각 따로 관리해줘야 한다.

  1. 작업 끝났으면 tar 파일은 삭제해도 된다. (혹은 향후 필요에 의해 별도 WSL을 추가할 경우를 위해 보존해도 된다.)

NTFS와 WSL의 연동

  1. WSL에서 드라이브 마운트

윈도우즈에서 사용하는 파일 시스템은 NTFS(New Technology File System)라는 이름으로 불린다. WSL이 등장하기 전에는 Windows의 파일 시스템인 NTFS는 Linux 계열의 파일 시스템과 기본적으로 호환되지 않았다. 그래서 Linux와 Windows의 파일을 상호 공유하기 위해서는 별도의 호환 모듈, 프로그램을 설치해서 사용해야 했다.

WSL에서는 Linux Bash Shell에서 「/mnt/드라이브문자/경로」의 방식으로 접근할 수 있다. 예를 들면 아래와 같다.

1
/mnt/c/workspace/projectname

이를 쉽게 생각하면, 원래 사용자의 Windows10 시스템에 있는 파일을 Linux 시스템을 이용하여 접속할 수 있다는 의미이다. 윈도우에 환경을 설정하기엔 너무 거추장스럽고, 그렇다고 Linux VM을 쓰기엔 불편하고, 그렇다고 Docker에 올리기에도 애매했던 걸 해결해줄 수 있다. (적어도 필자에게는 그런 느낌이었다.)


  1. Windows Explorer에서 파일 보기

Windows의 File Explorer에서 네트워크 드라이브를 보면 WSL이 들어와 있다. WSL을 분리한 경우 분리한 모든 WSL이 나타난다.

네트워크 드라이브에서 Home 연결

물론 WSL1과 WSL2를 분리한 경우, 두 시스템의 home 디렉토리 내용은 완전히 다를 수 있다.


현재 진입한 WSL의 버전을 쉽게 알아 보는 방법

WSL을 분리해서 사용하다보면 WSL 진입 후 한참 사용하다가 보면 현재 사용하고 있는 버전이 WSL1인지 WSL2인지 헷갈릴 때가 있다. 갑자기 이거 때문에 exit 하고 다시 들어오기도 껄쩍지근하다. 간단히 알아 보려면 Linux Bash Shell에서 Docker를 실행하면 된다. WSL1에서는 docker가 실행되지 않는다.

WSL1에서는 Docker가 지원되지 않는다.

WSL2에서는 Docker가 실행된다.

WSL2에서는 Docker가 지원된다.

그래서 Docker 실행 여부로 현재 사용 중인 WSL이 1인지, 2인지 쉽게 알 수 있다.

하지만 귀찮지만 가장 가시적으로 알아 볼 수 있는 방법은 Windows Terminal의 ‘탭이름 변경’이다.

PowerShell 탭 이름 변경


참고 자료