WSL: Windows Subsystem Linux
WSL은 Linux용 Windows 하위시스템이라고 번역되겠다. 이름부터 뭔가 가슴이 웅장해진다. 문서를 읽어보니 생각만해도 눈물이 난다. 가상머신을 이용하지 않고도 Windows에서 Linux 명령어나 실행파일을 이용할 수 있단다.
WSL1
초창기 WSL1은 Linux 커널을 직접 사용하진 않고 윈도우 NT 커널 내부의 ‘Pico Provider’를 사용하는데, NT API 콜과 Linux 시스템 콜 간 변환을 해주는 일종의 에뮬레이터 같은 역할을 한다. ELF 실행파일 역시 NT Process가 아닌 독립된 Pico Process container에서 실행되는 것이다. 이 때문에 WSL가 모든 리눅스 시스템 콜을 처리하기는 어렵다는 한계가 있단다. 특이한 부분은 ext와 ntfs의 사용을 병행하는게 어렵다고 판단했는지, 윈도우 파일시스템을 마운트하기 위한 DriveFS, 그리고 WSL에서 완전한 리눅스 파일시스템을 구현하기 위한 VolFS라는 파일시스템 형식을 써서 해결했다고 한다. 그래서 리눅스에서는 리눅스 파일시스템과 윈도우 파일시스템을 모두 접근할 수 있지만, 윈도우에서는 리눅스 파일 시스템 접근이 불가능 했단다.
WSL2
그리고 WSL2가 나왔는데…
Hyper-V 를 통해 Linux 커널을 직접 탑재하였다! Hypervisor 마이크로 커널 위에 NT 커널과 Linux 커널이 병렬로 올라와 실행된단다. 덕분에 WSL와 다르게 모든 시스템콜이 완벽히 호환되고 성능도 상당히 개선되었단다.
눈여겨볼 점은 WSL 리눅스의 루트파일시스템이 ext4 가상하드디스크로 마운트 된다는 것이다. 마이크로소프트 스토어에서 받은 WSL 리눅스 배포판 유니버셜앱의 데이터 경로에 ext4.vhdx가 위치하며 이를 마운트하면 되겠다. “\\wsl”로 접근도 가능해 네트워크 드라이브로 설정해놓고 사용가능 하겠다.
이제 DriveFS, VolFS를 쓰지 않고 ext와 ntfs를 직접 사용하다보니 대놓고 OS파일시스템간 성능은 떨어졌다고 나와있다. : WSL 1과 WSL 2 비교
뭐 VM ware나 Virtual Box를 안 쓴다 뿐이지 결국 Host PC의 자원을 사용하고 있기때문에 native보다 성능이 떨어지긴 한단다만 이것만 해도 감지덕지다. 안그래도 공간 부족한 랩탑에 없는 공간 쪼개 파티션 분리해서 울머겨자먹기로 쓰다가 완전 호환되는 WSL를 쓴다니 너무 기쁘다.
아직 GUI는 공식적으로 지원하지 않지만 gnome, kde, xfce 같은 GUI환경 설치가 가능하며 이렇게 vnc를 통해 GUI환경을 쓰기도 한단다.
근데 향후 GUI를 공식적으로 지원할 예정이라 해서 그냥 기다려 볼까 한다.
1. WSL 설치 및 활성화
MSDN문서에서 설치과정이 잘 나와 있다. 먼저 WSL를 설치하기 위한 요구사항과, WSL2를 사용할경우 추가 요구사항이 있음을 확인하여야 한다.
Windows Insider 프로그램에 참여중이면
wsl --install 이란 명령어로 간단히 설치할 수 있지만, 그렇지 않다면 몇가지 기능을 먼저 활성화 해야한다. 아래와 같이 파워쉘에 입력하여 WSL을 활성화 시킨다.
(PowerShell)> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 그리고 WSL2부터는 가상화 머신 기능을 사용하므로,
(PowerShell)> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 명령을 통해 VirtualMachine 플랫폼 기능을 활성화 시킨다. 이후, 아래 패키지를 통해 리눅스커널 업데이트를 한다.
Link: WSL2 Linux kernel update package for x64 machines
그 다음, 아래 명령을 통해 WSL 버전의 기본 값을 2로 설정해준다. (리눅스 배포판 설치 전에 2로 설정해주어 2를 다운 받을수 있도록.)
(PowerShell)> wsl --set-default-version 2 이제 거의 다 끝났다. [Microsoft Store](https://aka.ms/wslstore)에 들어가 원하는 리눅스 배포판을 설치하면 된다. 링크를 통해 들어가지 않더라도 스토어에서 wsl만 검색하더라도 여러 배포판들을 찾을 수 있다.
설치 후 해당 배포판의 콘솔을 켜면 수분간의 압축해제 및 설치를 거친후 새 username과 password를 설정하면 설치가 완료된다!
2. WSL와 Windows의 연결 살펴보기
lesstif에 잘 소개되어 있어 참고하였다.
앞서
이제 DriveFS, VolFS를 쓰지 않고 ext와 ntfs를 직접 사용하다보니 대놓고 OS파일시스템간 성능은 떨어졌다고 나와있다. : WSL 1과 WSL 2 비교
라고 언급했듯, microsoft는 프로젝트 경로를 윈도우 파일시스템에 두고 작업하는 것을 권장하지 않는다. 빠른 성능을 위해 WSL 리눅스 파일시스템 안에 프로젝트를 저장하기를 권장한다. 윈도우즈에 있는 필요한 파일에 WSL에서 직접 접근해 mv로 옮겨올 수도 있겠지만, 윈도우에서도 WSL파일시스템에 접근할 수 있다.
\\wsl$
\\wsl$\Ubuntu
첫번째 경로로 접근하면 설치한 각 배포판들의 루트파일시스템이 네트워크 폴더 형태로 연결되어 있다. 필자는 두번째 경로와 같은 각 배포판의 루트파일 시스템 경로를 네트워크 드라이브로 마운트 시켜서 편리하게 사용하고 있다.
wsl을 잘 설치하였고 wsl 해당 배포판의 콘솔도 잘 작동함을 확인했음에도 불구하고 해당경로의 접근이 불가능하다면 WSL이 실행되지 않아서이다. 먼저 콘솔을 클릭해 인스턴스를 기동시키면 위 경로가 유효해진다.
3. VS Code에서 사용하기
이 역시 MSDN문서에 잘 나와있다.
우선 Visual Studio를 위한 원격개발 확장팩이 필요하다. Microsoft Store: Remote Development Extension pack 이 확장팩은 WSL뿐 아니라 다른 원격개발환경도 지원한다.
이후 아래와 같이 wsl 명령줄에 code .
를 입력하여 wsl원격환경에 접속한 VS Code를 실행시킬 수 있다.
또는, 위 gif의 마지막 부분에 나오듯 왼쪽하단에 초록색 버튼이 보이는데, 이 원격환경 버튼을 누르거나, 또는 ctrl+shift+P
를 누른 후, REMOTE-WSL을 검색하면 아래와 같이 Remote-WSL에 접근할 수 있다.
4. WSL에서 개발환경 구성하기
4-1. 빌드도구들
$ sudo apt install build-essential
를 통해 몇몇 빌드도구들을 설치할 수 있다. 배포판마다 구성은 조금씩 다를텐데 Ubuntu 20.10의 경우. dpkg-dev, gcc, g++, libc6-dev, make 등 빌드도구와 라이브러리를 포함하고 있다.
git도 뭐 그냥 설치하면 되겠지만 역시 MSDN문서가 깔끔하게 잘 되어 있다.
VS Code 설정은 여기서 이미 다뤘다.