Windows11 WSL2 소개

Windows11에 포함된 WSL2를 간단히 소개한다.

Windows11 설치

2021년 10월 5일에 Windows11이 출시되었다.
Windows10에서 무료로 업그레이드할 수 있으므로 집에 있는 데스크탑과 노트북에서 각각 업그레이드와 클린 설치를 해 보았다. BIOS에서 TPM과 secure boot만 enable 시키니, 둘 다 어려움없이 금방 설치가 완료되었다.

Windows11 기본 포함

Windows11에는 Windows Terminal이 기본으로 포함되어 있다.

Windows11에서는 탐색기에서 마우스 우클릭하여 Windows 터미널에서 열기 또는 Open in Terminal을 선택하면 바로 해당 디렉토리에서 Windows Terminal이 열린다. 만약에 cmd 실행시에도 cmd.exe 대신에 Windows Terminal로 열고 싶으면, Windows Terminal의 설정에서 “시작” -> “기본 터미널 응용 프로그램” 선택을 Windows 콘솔 호스트에서 Windows Terminal로 변경하면 된다.

그런데 앱 패키지 관리자로 많이 쓰이는 winget은 여전히 디폴트로 포함되어 있지는 않아서, Microsoft 스토어를 통하여 설치해야 한다. 또한 WSL도 기본으로 포함되어 있지는 않은 상태이므로, 기존 방법처럼 설치하면 된다.


또 Windows11에서 재미있는 것을 발견했는데, 우리말 음성을 인식하여 한글로 바꾸주는 (Speech-to-Text) 기능이 있었다. 받아쓸 프로그램의 윈도우를 선택한 후, Windows + H 키를 누르면 아래와 같은 팝업이 뜨면서 마이크로 인식한 우리말 음성을 바로 선택한 윈도우에서 텍스트로 출력해 준다.


테스트 해 보니, 의외로 속도도 빠르고 품질도 꽤나 좋은 편이었다. 😲

WSL 사전 설치 준비

  1. Powershell 관리자 모드에서 아래와 같이 실행하여 WSL과 “가상 머신 플랫폼” 옵션 기능을 사용하도록 설정한다.
    PS C:\> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    PS C:\> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    

    이후 시스템을 재부팅한다.

  2. Linux 커널 업데이트 패키지 페이지에서 WSL2 Linux 커널 업데이트 패키지를 다운로드한 후, 설치한다. 이로써 사전 설치 준비는 완료되었다.

WSL 설치

Microsoft 스토어에서 설치하려는 WSL 배포판을 검색하여 설치하면 된다.
참고로 Windows11에 포함된 WSL은 새로 추가된 --install 옵션을 지원한다. 관리자 권한의 consle에서 이 옵션을 사용하여 실행시키면, WSL에 필요한 모든 컴포넌트들이 자동으로 설치된다. (정말 편해졌다. 😊)

C:\>wsl --install

결과로 아래 출력과 같이 모든 작업이 자동으로 완료된다.

설치 중: 가상 머신 플랫폼
가상 머신 플랫폼이() 설치되었습니다.
설치 중: Linux용 Windows 하위 시스템
Linux용 Windows 하위 시스템이() 설치되었습니다.
다운로드 중: WSL 커널
설치 중: WSL 커널
WSL 커널이() 설치되었습니다.
다운로드 중: GUI 앱 지원
설치 중: GUI 앱 지원
GUI 앱 지원이() 설치되었습니다.
다운로드 중: Ubuntu
요청한 작업이 잘 실행되었습니다. 시스템을 다시 시작하면 변경 사항이 적용됩니다.

WSL 업데이트

Windows11에 포함된 WSL은 새로 추가된 --update 옵션을 사용하여 WSL을 업데이트시킬 수 있다. 관리자 권한의 consle에서 아래와 같이 실행하면 WSL이 업데이트된다.

C:\>wsl --update

또한 새로 추가된 --version 옵션을 사용하여 아래와 같이 설치된 WSL의 버전도 확인할 수 있다.

C:\>wsl --version

WSL Linux 배포판 설치

아래와 같이 실행하면 사용 가능한 모든 배포판 정보가 출력된다.

C:\>wsl --list --online

현재 시점에서는 결과로 아래와 같이 나왔다.

다음은 설치할 수 있는 유효한 배포 목록입니다.
'wsl --install -d <배포>'를 사용하여 설치하세요.

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

아래와 같이 해당 Linux 배포판을 설치할 수 있다.

C:\>wsl --install --distribution <배포판이름>

물론 위와 같이 콘솔에서 설치하는 방법 보다는 Microsoft Store에서 Linux로 검색해서 나오는 배포판을 선택하여 설치할 수 있고, 보통은 이게 더 편리한 방법이다.


만약에 Microsoft Store에 온라인으로 접속이 되지 않는 환경이면, 배포판 다운로드 페이지에서 원하는 배포판을 다운로드하여 설치할 수도 있다.


또한 Microsoft Store에 없는 배포판을 설치할 수도 있다. GitHub에서 이런 배포판 프로젝들을 찾아볼 수 있었는데 예를 들어, 아래 배포판 프로젝트 등이 있다.

WSL Linux 배포판 상태

현재 설치된 Linux 배포판 상태는 아래와 같이 얻을 수 있다.

C:\>wsl -l -v

WSL Linux 실행

Linux 배포판은 아래와 같이 실행시킬 수 있다.

C:\>wsl -d <배포판이름>

만약 배포판이 1개만 설치되어 있는 상태이면 아래와 같이 간단히 실행시킬 수 있다.

C:\>wsl

추가로 시작시 자동으로 특정 디렉토리로 옮기려면 아래와 같이 --cd 옵션으로 지정하면 된다. (예를 들어, home 디렉토리로 지정하고 싶으면 ~로 지정하면 됨)

C:\>wsl --cd <Directory>

WSL 드라이브

Windows11에서는 디폴트로 탐색기에 설치된 WSL 배포판의 드라이브가 아래 예와 같이 표시되므로 탐색기에서도 WSL 디렉토리에 쉽게 접근할 수 있다.

WSL GUI

Windows11의 WSL에서는 디폴트로 Linux GUI 앱을 지원한다. 단순히 WSL을 실행한 후, GUI 프로그램을 설치해서 실행하기만 하면 된다. GUI 실행 속도도 빠르다. 😍

Windows PATH 제거하기

WSL은 디폴트로 Linux PATH에 Windows PATH 경로를 추가한다. 이는 탐색기(explorer.exe), VS Code(code.exe) 등과 같이 Windows 프로그램을 경로에 추가시켜서 전체 경로없이도 실행시켜 주기 위한 것인데, 간혹 이것 때문에 Linux에서 문제가 발생하는 경우도 있다. (예를 들어 PATH에서 Program Files와 같은 경로는 중간에 공백 문자가 들어가는데, 이 경우에는 양쪽을 ""로 감싸줘야하는데 이게 없어서임)
이에 대한 간단한 해결책으로 Windows PATH를 포함시키지 않게 하면 된다. 이를 위해서 WSL에서 /etc/wsl.conf 파일을 아래와 같이 작성하면 된다.

[interop]
appendWindowsPath = false

이제 아래와 같이 배포판을 shutdown 시킨다.

C:\>wsl --shutdown

이후 WSL을 다시 시작시켜서 PATH를 확인해 보면 Windows PATH는 추가되지 않았음을 확인할 수 있다.

그런데 이 경우에는 Windows PATH 전체가 추가되지 않았으므로, 탐색기나 VS Code 등을 실행하기 위해서는 전체 경로로 실행시켜야 하므로 불편하다. 그래서 나는 주로 ~/.bashrc 파일에서 아래 예와 같이 alias와 PATH를 추가하여 사용한다.

alias code='/mnt/c/Program\ Files/Microsoft\ VS\ Code/bin/code'
export PATH=$PATH:"/mnt/c/Windows"

snap 패키지 설치시 에러

그런데 snap으로 패키지 설치시에 아래와 같은 에러가 발생하면서 설치가 되는 않는 경우가 있었다.

error: cannot communicate with server: Post http://localhost/v2/snaps/code: dial unix /run/snapd.socket: connect: no such file or directory

구글링 한 결과, https://github.com/microsoft/WSL/issues/5126 내용을 참고하여 아래와 같이 실행한 후에, 다시 시도해 보니 패키지가 잘 설치되었다.

$ sudo apt update
$ sudo apt install -yqq daemonize dbus-user-session fontconfig
$ sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
$ exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

네트워크가 동작하는 않는 경우

잘 사용하던 WSL 배포판에서 갑자기 apt update가 안 되고, ping도 안 되는 등 네트워크가 동작하지 않는 문제가 발생하였다. 이 경우는 Windows 네트워크 구성에 변경이 발생하면서 생기는 문제로 보였는데, WSL을 재시작해서는 문제가 해결되지 않고, Windows를 재시작하거나, 아래와 같이 네트워크를 초기화하면 다시 WSL 배포판에서 네트워크가 동작하였다.

Windows 설정 -> 네트워크  인터넷 -> 네트워크 초기화 -> Windows 재시작

WSL VHD 크기 줄이기

WSL 배포판에서 파일들을 삭제해도 사용하는 VHD(Virtual Hard Drive)의 크기는 줄어들지 않고 커지기만 한다. 따라서 필요시 아래와 같이 수동으로 크기를 줄어줘야 한다.

  1. 실행 중인 WSL 인스턴스를 종료시킨다.
    C:\>wsl --shutdown
    
  2. 대상 배포판 VHD의 전체 경로를 찾는다. 탐색기에서 %localappdata%\Packages\ 경로에 들어가서 해당 VHD 파일을 찾으면 된다. (*.vhd로 검색하면 나옴, 나 같은 경우에는 이 디렉토리 밑에 CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx 파일이 있었음)
  3. 커맨드 창에서 diskpart 명령을 실행하면 별도의 콘솔 창이 뜨는데, 여기에서 아래와 같이 실행하면 된다.
    DISKPART> select vdisk file="타겟 VHD 파일의 전체 경로"
    DISKPART> compact vdisk
    DISKPART> exit
    

💡 참고로 위 방법 이외에도 WslCompact 툴을 이용할 수도 있다. PowerShell에서 아래와 같이 실행하면 설치된다.

PS C:\> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\> iwr -useb https://raw.githubusercontent.com/okibcn/wslcompact/main/setup | iex

아래와 같이 실행하면 도움말이 출력된다.

PS C:> wslcompact -h

아래와 같이 실행하면 설치된 WSL 배포판의 정보, 현재 크기, compact 시 예상 크기가 출력된다.

PS C:> wslcompact

이제 아래 예와 같이 -c 옵션을 주어 원하는 배포판을 지정하면, 해당 배포판이 compact 된다.

PS C:\> wslcompact -c Ubuntu-20.04

WSL VHD 최대 크기 늘이기

WSL VHD의 최대 크기는 256GB로, 만약 이 이상의 크기를 사용하려면, 아래와 같이 늘려주어야 한다.

  1. 위에서 VHD 크기 줄이기와 마찬가지로 VHD를 select 한 후에, 아래와 같이 실행하면 된다.
    DISKPART> expand vdisk maximum=<MB단위크기>
    
  2. 참고로 최대 크기가 제대로 반영되었는지 확인은 아래와 같이 할 수 있다.
    DISKPART> detail vdisk
    

카테고리:

업데이트: