'리눅스용 윈도우 하위 시스템(WSL, Windows Subsystem for Linux)'은 그동안 제공되었던 윈도우 운영체제에 포함된 하위 시스템이다. 마이크로소프트는 호스트 운영체제에서 분리된 애플리케이션이 독립적으로 실행될 수 있도록 격리된 하위 시스템들을 개발했는데, 그중에서도 WSL은 여러 해에 걸쳐 개발한 보다 개선된 제품이다.
WSL은 본래, 개발자가 안드로이드 코드를 재사용하여 휴대폰용 윈도우 애플리케이션을 빌드하거나 윈도우에서 기본 안드로이드 애플리케이션을 실행할 수 있게 했던 유니버설 윈도우 플랫폼 브리지 도구 키트인 '프로젝트 아스토리아'에서 비롯되었다.
이는 안드로이드 애플리케이션을 최소한으로 변경하여 에뮬레이션된 환경에서 실행하면서, 마이크로소프트 플랫폼 API에 접근할 수 있도록 하기 위한 기술이었다. 그러나 2016년 2월 25일, 마이크로소프트는 ‘프로젝트 아스토리아’가 중단될 것이라고 발표했다. 이러한 에뮬레이터가 네이티브 안드로이드나 네이티브 오브젝티브 C 기술과 중복될 것이라는 반론이 있었기 때문이다.
추후 ‘프로젝트 아스토리아’와 ‘프로젝트 드로우브리지’로 알려진 다른 연구 프로젝트의 성과와 기술을 통해 WSL 버전 1이라는 호환성 서비스가 만들어진다. 그리고 2016년에 WSL 1이라고도 하는 WSL의 초기 버전이 출시됐다.
(참고로 프로젝트 아스토리아는 취소되었으나, WSL을 개발하는 과정을 거쳐, 2022년에 출시되는 새 버전의 윈도우 11에서는 Windows Subsystem for Android가 다시 정식 출시될 예정이라고 한다.)
WSL은 사용자가 완전한 리눅스 가상 머신(VM)을 실행하지 않고도 기본적으로 리눅스 명령 줄 도구, 유틸리티, 그리고 리눅스에서 사용하던 ELF64 바이너리를 그대로 윈도우에서 실행할 수 있도록 하는 새로운 윈도우 운영체제 호환성 계층이다.
WSL은 개발자를 위한 도구로 개발되었지만, 시스템 관리자뿐 아니라 사이버 보안 분야에서도 매우 널리 사용되고 있다.
WSL은 단순히 윈도우에서 리눅스 bash 셸만 제공하는 것이 아니다. 셸을 제공하는 것을 넘어, 실제로 리눅스 운영체제와 똑같이 보이고 동작하는 환경을 실행하는 완전한 호환성 계층이다.
WSL을 통해 윈도우 사용자는 grep, sed, awk같이 널리 쓰이는 무료 명령 줄 소프트웨어는 물론, 마이크로소프트 스토어에서 무료로 다운로드할 수 있는 리눅스 배포판의 다른 ELF64 바이너리들을 실행할 수 있다. 즉, 시그윈과 같은 서드 파티의 POSIX 호환 환경을 사용하지 않고도 윈도우 운영체제에서 리눅스와 유사한 사용자 경험(UX)으로 bash, vim, emacs 같은 리눅스 도구를 사용할 수 있다.
마이크로소프트는 WSL의 초기 버전(버전 1) 또는 wsl.exe로 운영체제 연구의 경계를 넓혀 왔다. 이제 더 이상 운영체제나 윈도우 또는 리눅스 사용자에 편향성을 지니지 않는다. 기본적으로 최종 사용자가 문제를 해결하고 기본 플랫폼에 관계없이 애플리케이션을 만들 수 있는 최상의 도구를 제공하는 것에 초점을 맞춘 것이다.
내가 윈도우 서버의 시스템 관리자 또는 윈도우 개발자라고 생각해보자. 인터넷에서 웹 서버 또는 무언가를 설정하기 위해 몇 가지 가이드 문서를 살펴보고 있었다. 그런데 갑자기 문서에 셸 명령이라고 하면서 달러 기호($) 모양의 프롬프트가 나타나면, 다음과 같은 생각을 하게 되지 않을까?
“이런! 이런 건 본 적도 없는데? 윈도우에서는 안 되는 기능이잖아. 이 문서를 따라 하려면 가상 머신을 만들고, 가상 환경에서 리눅스를 설치해야 하잖아. 귀찮아! 안 할래.”
이 상황이 WSL의 등장 배경이다. 개발자와 시스템 관리자는 윈도우에서 빠르게 배시와 같은 리눅스 바이너리를 실행하고, 원활한 기능을 제공할 수 있는 하위 시스템이 필요했다. 이러한 하위 시스템이 있다면 간단한 작업 하나를 하려고 리눅스 운영체제를 가상 머신에 설치 및 설정하는 번거로운 과정을 거치지 않아도 되기 때문이다.
[WSL 1의 아키텍처]
WSL의 장점은 다음과 같이 정리할 수 있다.
: 가상 머신은 그동안 우리가 유용하게 잘 활용해온 기술이고 믿을 만한 기술이다. 하지만 메모리, CPU와 함께 제공되는 스토리지 측면에서 리소스 오버헤드가 작지 않다. 반면 WSL에서는 호스트 운영체제에 주는 리소스 부담을 매우 최소화할 수 있다. 간단한 리눅스 명령어 몇 가지를 실행해보기 위해서는 WSL에 들어있는 bash 셸이면 충분하다. 굳이 가상 머신을 생성할 필요가 없다.
: 윈도우 운영체제에서 리눅스 바이너리를 실행하면 강력한 리눅스 애플리케이션과 도구를 사용할 수 있게 만들어준다. 따라서 윈도우 사용자가 리눅스 기능을 활용할 수 있는 완전히 새로운 기회를 얻게 된다.
: 개발자와 시스템 관리자는 모두 WSL을 활용하여 닷넷 코어(.NET Core)와 같은 크로스 플랫폼 개발 도구를 활용할 수 있다. 즉, 리눅스 가상 머신을 실행하지 않고도 윈도우와 WSL에서 프로젝트를 쉽게 테스트할 수 있다.
: 기본 플랫폼에 관계없이 가장 좋은 도구를 사용할 수 있다. 리눅스에 Nginx 웹 서버를 배포하는 것이 편하다면, 윈도우 운영체제 안의 리눅스 하위 시스템에서 Nginx를 실행할 수 있다.
: WSL은 단순한 통합이 아니다. 리눅스 개발자에게 원활한 경험을 제공한다. 리눅스 개발자에게 원활한 경험을 제공하기 때문에 개발자는 마치 리눅스 운영체제에서 작업하는 것처럼 느낀다. 하지만 실제로는 윈도우 운영체제가 제공하는 변환 계층을 통해 네이티브 리눅스 바이너리가 윈도우 운영체제에서 작동하고 있는 것이다.
: WSL은 하위 시스템이므로 WSL에서 실행되는 애플리케이션은 실제로 호스트 운영체제의 다른 애플리케이션을 손상시킬 수 없도록 안전하게 격리된 컨테이너에서 실행된다.
WSL 2는 WSL의 최신 버전으로, 커뮤니티의 많은 요청을 받고 또 수용하여, 다음 두 가지의 주된 목표를 달성하기 위하여 개발되었다.
: 입출력 성능이 향상되면 파일 읽기와 쓰기 속도가 빨라진다. 입출력 속도는 파일 읽기 작업을 얼마나 많이 하는가에 따라 전적으로 좌우된다. git clone, npm install, apt update 또는 apt upgrade 같은 작업은 WSL 1에 비해 WSL 2에서 약 2~3배 정도 더 빨라졌고, 리눅스와 유닉스 시스템에서 널이 쓰이는 압축된 타르볼 파일(tarball file)을 푸는 것은 약 20배 이상 빨라졌다.
: WSL 1에서 실행되는 리눅스 바이너리가 만들어내는 모든 시스템 호출(파일 접근, 메모리 요청, 프로세스 생성 등)은 각각 윈도우 운영체제의 시스템 호출로 번역되어 호출된다. 이를 통해 번역 계층을 만들어냈지만, 그 자체로 성능상의 한계가 있을 뿐 아니라 모든 리눅스 시스템 호출을 윈도우 시스템 호출로 변환하는 것도 불가능했다. 또한 리눅스 커널의 변경 사항을 이 변환 계층에 모두 구현하고 조정해야 했다.
그런 이유로 마이크로소프트는 WSL 2가 시스템 호출 호환성을 완벽하게 지원하고, 커널 업데이트를 쉽게 제공할 수 있도록 자체적으로 관리하는 리눅스 커널을 포함하기로 결정했다. 이를 통해 도커나 그 외의 고급 기능을 사용하고 기존에 지원되지 않았던 더 많은 애플리케이션을 WSL 2에서 원활하게 실행될 수 있도록 만든 것이다.
더불어 리눅스 커널의 포크 버전을 직접 유지 관리하고 있다. 즉, 리눅스 커널에 대한 모든 업데이트는 윈도우 운영체제의 업데이트 주기에 맞추지 않고, 좀 더 신속하게 업데이트 및 게시하여 최종 사용자에게 배포할 수 있다. 커널에 반영되는 모든 개선 사항과 보안 수정 사항은 윈도우 업데이트를 통해 제공된다.
전통적인 VM | WSL 2 경량 유틸리티 VM |
게스트 운영체제는 호스트 운영체제와 격리되어 있다. | 게스트 운영체제는 호스트 운영체제와 긴밀하게 연동된다. |
부팅 시간이 오래 걸린다. | 부팅 시간이 거의 들지 않으며, 1초 안에 부팅이 끝난다. |
메모리 소비량이 많다. | 메모리 소비량이 적다. |
VM을 만들고 관리해야 한다. | VM을 자동으로 설정할 수 있고 필요할 때만 실행할 수 있다. |
[기존 VM과 WSL에서 사용하는 경량 유틸리티 비교 VM]
이러한 목표를 염두에 두고 WSL 1 사용자가 큰 차이를 느끼지 않게 하면서, 일관성이 있는 사용자 환경을 유지하는 것도 중요했다.
WSL 1은 사용자에게 ELF64 리눅스 바이너리를 WSL에서 구동할 수 있도록 해주었지만, WSL 2는 리눅스 바이너리들이 윈도우 운영체제 및 시스템 하드웨어와 어떻게 상호작용할 것인지 그 방법에 변화를 주었다. 마이크로소프트는 WSL 2에서 리눅스 커널을 윈도우 안에 포함시켜, 더 고도화된 가상화 기술을 사용하도록 만들었다.
이제 완전한 커널을 사용할 수 있으므로 WSL 2에서는 ELF32 바이너리나 리눅스 커널에서 제공하던 다른 모든 기능도 그대로 지원하고 있다.
WSL 2를 사용하기 전 충족해야 하는 두 가지 조건이 있다. 첫째, WSL 2는 윈도우 10 버전 1903 이상으로 업그레이드해야 사용할 수 있다. 둘째, ‘Windows 참가자 프로그램’에 참여하고 Fast 또는 Slow 링(더 안정적인 업데이트를 제공함)을 선택하여 WSL 2와 함께 제공되는 윈도우 빌드의 미리 보기 릴리스를 받아야 한다.
이미 윈도우 10 버전 1903 또는 그 이상의 버전을 실행 중이라면 두 번째 조건은 무시해도 된다. (현재, Fast 링은 Dev 채널, Slow 링은 Beta 채널로 이름이 변경되었다.)
WSL 2는 윈도우 10 버전 2004의 일부가 되었으며, 1903 버전부터는 업데이트를 통해 사용할 수 있도록 추가 배포되었다. 이것은 운영체제 이미지에 리눅스의 기능을 포함하는 방법 대신, 윈도우 업데이트를 통해 설치 환경을 간소화하여 리눅스 커널의 서비스 모델을 개선하기 위한 마이크로소프트의 새로운 전략이다.
즉 소프트웨어, 패치, 드라이버와 마찬가지로 모든 리눅스 커널 업데이트가 윈도우 업데이트를 통해 시스템에 잘 적용될 수 있도록 제공된다. 최신 버전의 리눅스 커널을 받기 원한다면, 윈도우 업데이트 화면에서 [업데이트 확인] 버튼을 클릭하고 이 업데이트를 설치하기만 하면 된다.
WSL 1과 WSL 2 두 버전은 나란히 실행할 수 있도록 설계되었다. 즉, 두 버전의 리눅스 환경을 나란히 실행할 수 있으며 필요할 때마다 배포판의 실행 환경을 업그레이드하거나 다운그레이드할 수 있다.
이 글은 <처음 만나는 WSL> 도서 내용 일부를 편집하여 작성되었습니다. 설치 방법부터 다양한 활용까지 WSL을 쉽고, 간편하고, 빠르게 익히는 방법은 하기 도서에서 만나보실 수 있습니다.
최신 콘텐츠