WSL의 시작
WSL의 시작

WSL이 나온 지도 꽤 오랜 시간이 지났다. 하지만 사실 그동안은 쓸 만한 앱이라고 느끼지 못했다. 무엇이라고 불러야 할지도 애매했다. 작년에는 노트북에 설치했다가 바로 지워 버렸다. 전체 시스템이 무거워지는 느낌과 원인을 알 수 없는 여러 오류 때문이었다.

처음 Microsoft Store에서 Ubuntu를 보았을 때는 Cygwin이나 Minix와는 완전히 다른 느낌이었다. “이제 로컬에서 개발하고 테스트한 다음 서버에 적용하면 되겠구나”라고 기뻐했지만 채 5분도 지나지 않아 삭제했다. 욕할 마음도 들지 않았다.

다시 WSL을 떠올리다

그러다 며칠 전 Windows 10에서 머신러닝 프로그램을 개발하면서 GPU 연산 환경을 다시 고민하게 됐다. PyTorch의 CNN 모델은 CPU에서도 실행할 수 있지만 학습 규모에 따라 매우 느릴 수 있다. NVIDIA의 Windows용 CUDA 지원도 있지만 Linux 중심으로 제공되는 NCCL 같은 도구와 여러 머신러닝 개발 환경을 함께 사용하려면 제약이 생긴다.

대안을 생각하다가 Microsoft Store의 Ubuntu가 떠올랐다. LTS가 장기 지원 버전이라는 의미를 잘 알기에 당연히 Ubuntu LTS를 선택했다. CUDA 도구를 설치하고 NCCL을 사용할 수 있는 환경까지 구성했다. 예상보다 별다른 문제 없이 설치가 끝났다. 이 의미를 이해하는 분들이 많을 것이다.

우리는 어느 날 갑자기 시간을 건너뛴 것이 아니다. WINE을 단순히 와인이라고만 읽지 않던 사람들, 가상머신이 무엇인지 고민하던 사람들, Windows에 Docker를 올리겠다고 수없이 시행착오를 겪었던 세월을 지나 지금의 WSL을 만난 것이다.

프로그램을 하다 보면 근본적으로 해결되지 않은 채 남은 문제와 개발만 끝내고 빠져나온 프로젝트가 많다는 것을 알게 된다. 크로스 플랫폼과 사용자가 원하는 포팅 작업을 두고 “간단하다”고 말했지만 실제로는 결코 간단하지 않았다.

서론이 길었다. 그만큼 감동했다는 이야기다.

개발 환경을 WSL로 옮기는 이유

현재 Windows 환경에서 개발하던 여러 프로젝트를 WSL로 옮기거나 이전을 검토하고 있다. 그 이유를 설명하고, 아직 WSL에서 어렵거나 불가능한 문제도 함께 고민하고 싶어 이 글을 쓴다.

WSL1과 WSL2는 무엇이 다르기에 5분 만에 지웠던 옛날의 WSL을 다시 보고 이렇게 흥분하게 됐을까?

WSL1은 Linux 시스템 호출을 Windows가 이해할 수 있는 형태로 변환하는 호환 계층에 가깝다. 반면 WSL2는 경량 유틸리티 가상머신 안에서 실제 Linux 커널을 실행한다. 이 차이 덕분에 WSL2는 시스템 호출 호환성과 컨테이너, 파일시스템 기능에서 훨씬 실제 Linux에 가까워졌다.

이제 로컬에서 Linux 프로그램을 개발하고 Git이나 SVN에 커밋한 뒤 원격 환경에서 빌드와 배포를 이어 갈 수 있다. 물론 자원에 전혀 구애받지 않는 것은 아니다. WSL2도 메모리, CPU, 디스크와 GPU 자원을 사용하고 필요하면 .wslconfig로 제한해야 한다. 그래도 Windows와 Linux를 오가던 과거에 비하면 훨씬 일관된 개발 환경을 만들 수 있다.

나는 오랫동안 여러 솔루션 회사를 다니며 어려운 개발과 유지보수 환경 때문에 주말과 휴가, 때로는 명절까지 반납해야 했다. 그래서 WSL2가 제공하는 환경이 더 크게 다가온다.

빠른 시작과 실제 Linux 커널

WSL2는 실제 Linux 커널을 가지고 있다. 명령 프롬프트에서 다음 명령을 실행하면 설치된 배포판과 기본 배포판을 확인할 수 있다.

wsl --list --verbose

wsl 명령을 실행하면 전통적인 리눅스 부팅 메시지를 길게 보여 주지 않고 매우 빠르게 셸이 열린다. 그러나 WSL2가 아예 부팅하지 않는 것은 아니다. Windows가 관리하는 경량 가상머신과 Linux 커널이 백그라운드에서 시작되며, 이미 실행 중이라면 거의 즉시 셸이 열린다.

배포판 안에서 apt update와 apt upgrade를 실행하면 Ubuntu 사용자 공간의 패키지가 갱신된다. WSL2의 Microsoft 제공 커널과 WSL 구성 요소는 일반적으로 Windows Update 또는 다음 명령으로 관리한다.

wsl --update

“실제 Linux 커널을 사용한다”는 설명은 과장이 아니었다. 다만 모든 것이 완벽하다는 뜻도 아니다. 네트워크, 파일시스템 성능, GPU 지원, systemd, USB 장치와 기업 보안 정책처럼 환경에 따라 추가 설정이 필요한 부분이 남아 있다.

이 감동을 잠시 진정한 다음 다음 글에서는 WSL을 더 자세히 살펴보려 한다. 한 가지 아쉬운 점은 WSL에 아직 필요한 것이 많다는 사실이다. 바로 그 이야기를 해 보고 싶다.