[WSL] WSL은 무엇인가?

WSL은 무엇인가? - WSL2 개요와 필자의 소회

일반 사용자들은 WSL이 뭔가 싶기도 할 거다. WSL은 Windows Sub-system for Linux의 약자이다. 한글로는 ‘윈도우의 하위 시스템으로 리눅스 사용’ 정도로 표기할 수 있겠다.

WSL을 사용하면 기존의 VM(Virtual Machine)을 실행하며 발생하는 CPU와 Memory의 문제나 복잡한 네트워크 설정 없이도 Windows10 혹은 Windows Server 환경에서 Linux를 사용할 수 있다. WSL은 Windows에서 GNU/Linux 계열의 실행 파일 표준인 ELF(Executable and Linkable Format) binary 파일들을 실행할 수 있게 해 준다. 즉, Windows 운영 체제에서 Linux 실행파일들을 함께 사용할 수 있도록 호환성을 추가하는 아키텍처라 할 수 있다.

지난 번 글에서 필자의 OS 경험담에서 살짝 언급한 바와 같이 Microsoft는 2020년 5월 Windows10의 업데이트에서 WSL(Windows Subsystem for Linux)의 2번째 버전을 발표하였다. WSL의 첫 번 째 버전은 고급 개발자들용으로만 공개되었던 점에 비해 이번에는 범용 개발에 쓰일 수 있도록 발표되었다는 점이 조금 다르다.

Windows Sub-System for Linux

Microsoft의 Windows는 오랫동안 전 세계 일반 사용자들의 운영체제로 오랫동안 사랑 받아 왔다. 컴퓨터를 잘 알지 못해도 쉽게 사용할 수 있는 사용자 환경은 컴퓨터 사용자의 저변을 넓히는데 일조해왔다.

1990년 즈음 Microsoft가 Windows3 버전을 공개해 필자가 처음 이 기술을 접했을 때는 MS-DOS라는 운영체제 위에서 작동되었다. 그리고, 이 MS-DOS라는 운영체제는 Unix의 한 게열이다. (Unix가 무엇인가에 대해서는 인터넷 검색을 바란다.) MS-DOS는 그 발전 과정에서 실행-파일(binary)의 실행 방식, 파일 시스템 관리 등 또 다른 Unix 시스템의 파생 운영체제인 Linux와 다른 별개의 사용환경을 제공해서 상호 호환성이 낮았다.

그 외 자세한 내용은 MS-DOS의 기능과 역사에 대해서는 무척 잘 정리된 블로그를 찾았으므로 링크의 내용을 참고하자.

과거, 네트워크가 발전하지 못하여 사용자의 PC에서 작동하던 프로그램이 강세이던 시절에는 윈도우가 강세였다. 이후 모바일의 시대가 되고 네트워크 기술이 고도화되면서 분산환경이 당연시 되었다. 특히 서버 환경이 중요해진 시대에는 값비싼 윈도우 서버로 서비스를 운영하는 것은 무리였고, 무료이거나 혹은 무료에 가까운 Linux 운영체제로 서비스를 운영해야만 한다. 서비스를 운영하는 쪽의 환경이 그렇다면 당연히 그 쪽의 개발 도구들이 발전하는 것이고, 수 많은 웹서비스를 제공하는 WAS(Web Application Server)와 Framework들은 Linux에서 작동하고 있다.

대부분의 컴퓨터 사용자들은 업무를 수행하거나 게임을 플레이하기 위해 사용하고 있으며, 여전히 게임은 클라이언트 기반이기 때문에 윈도우 게임 시장은 모바일 그리고 콘솔시장과 더불어 꽤나 크다.

One Earth Rising - 2019 Global Game Market

서비스를 이용만 하는 사용자와 서비스를 제작하는 개발자는 따로 공존할 수 밖에 없다. 자본주의 산업 체계에서 수요와 공급은 동일 선상에서 이루어지기 매우 어렵기 때문이다. 그리고 그렇다보니 2021년에는 서비스를 사용하는 일반 사용자와 개발자 간의 이해의 깊이 차이는 점점 벌어지고 있고, 이는 그냥 학교에서 코딩 수업한다고 메워질 건 아니라 생각이 든다.

실제 예로, 필자는 2021년 현재 Low Coding 도구의 Product Manager이자, Programmer이자, 교육 컨설팅 등 여러 직무를 수행하고 있다. Low Coding 도구의 주요 타겟층은 ‘소프트웨어는 어느 정도 알지만 개발은 못 하는 사람’들을 위주로 하는데, 그런 고객들에게 소프트웨어와 네트워크 관련 설명을 할 때마다 ‘PC에서 작동하는 클라이언트와 네트워크에서 작동하는 서비스의 차이’에 대해 일반 사람들도 알아듣기 쉽게 설명해야 하는 중대한 미션을 짊어지곤한다. 아무리 경험이 많아도 ‘소프트웨어를 사용만 해 본 사람’과 ‘소프트웨어를 만들어본 사람’의 이해 차이가 너무 극단적으로 벌어지고 있다고 느껴진다.

WSL2는 어쩌면 그런 어려운 웹-어플리케이션으로의 진입 장벽을 조금 더 낮춰주는 역할이 되지 않을까 싶다. Shell 기반으로 작동하는 프로그램들은 내부의 기술을 어느 정도 이해하는 사람들은 금방 알아차릴 수 있으나, 내부 동작을 이해하지 못하는 사람들은 소위 ‘외워 쓴다’ 정도의 수준 이상으로 발전하기 어렵다. 그런 의미에서 WSL 기술력의 등장과 GUI를 제공하는 Docker 지원 등은 일반 사용자들에게 서버 서비스의 작동 방식을 조금 더 쉽게 접할 수 있도록 해주지 않을까 (하고 필자는) 기대해 본다.


WSL이 뭐가 그리 좋은가?

“WSL이 뭐가 그리 좋은가?”라고 누군가 필자에게 묻는다면 당연히 “Windows10에서 Linux 파일들이 잘 작동해서요~”가 답이 되겠다.

Microsoft에서 발표한 WSL은 Windows 운영체제에서 경량화된 가상화 기술을 사용하여 Linux 운영 체제를 구동할 수 있도록 해 주는 기술이다. 커널(Kernel)이라 부르는 Windows의 내부 시스템 기술을 이용하여 Linux을 구동시킬 수 있으며, 경량화 되었기 때문에 심지어 Windows10 Home Edition에서도 작동한다. 과거에 VM을 사용하기 위한 여러가지 기술 제약이 있었던 점을 떠올리면 이런 경량화 기술은 (프로그래머 입장에서는) 대단한 발전이라 말할 수 있다.

아마 위 질문에 대한 정상적인 답변은 「WSL은 윈도우 10에서 Linux의 ELF 64를 실행할 수 있는 덕분에 속도는 Virtual Machine 보다 훨씬 빠르고, 재부팅을 해야 할 필요가 없다. 또한 WSL을 사용할 Windows 컴퓨터의 CPU와 Memory 속도만 확보하면 되며, 별도의 서버를 구성하기 위해 비싼 HW 가격을 고려하거나, 속도가 느린 시스템을 사용하느라 고통 받을 필요가 없다.」 정도로 하면 될 듯 하다.

조금 더 기술적으로 들어가자면… WSL의 개념은 기본적으로 최근의 Cloud 개념들과 비슷하여 가까우며, 과거 방식의 VM(Virtual Machine) 개념과는 살짝 거리가 멀다. 가상화(Virtualization)이라는 개념은 같으나, 과거 VM 방식대로 운영체제 하나를 통째로 복사해서 작동시키는 방식이 아니라, 필요한 부분만 별도로 실행시키는 방식을 사용하고 있다. 이를 「경량화(Light-Weight)」 방식이라고 표현한다. 이런 경량화 기술이 나오기 전에는 Linux 등 다른 운영체제를 사용하기 위해 Windows 위에서 VM(Virtual Machinge)을 설치하여 사용하거나, Linux 전용 노트북을 구입하거나, Boot 영역을 해킹해서 2개 이상의 운영체제를 사용하곤 했다. 혹은 Macintosh를 사용하는 경우도 많았고, 한국의 유명 포털 사이트들은 (사내 보안 문제 등으로) 사내 업무 시스템이 모두 Macintosh 기준으로 되어 있는 경우도 있다.

사실 필자를 비롯한 일반적인 경력 좀 있는 개발자들에겐 이게 상관 없다. 일상 업무를 수행하다 보면 개발 환경에 따라 운영체제를 다양하게 사용할 수 밖에 없기 때문에 대부분의 소프트웨어 개발자들은 특정 운영체제에 고립되어 있지 않다. 소프트웨어 개발에 참여하는 사람들은 Windows든 MacOS든 Linux의 어떤 종류든, 다양하게 사용할 수 밖에 없기 때문에 프로젝트 사정상, 회사 사정상 운영 체제를 다시 변경할 이유가 있더라도 1~2주 정도만 사용하면 금방 익숙해진다. 필자의 경우, 실제로도 업무용은 Windows, 취미 생활을 위한 운영 체제는 MacOS를 사용하고 있기도 하다. 그렇지만 소프트웨어 개발에 익숙하지 않은 대부분의 일반 사람들은 Windows 외 다른 운영 체제를 잘 이해하지 못한다. 그러니, 「Windows에서 작동하는 Linux 시스템이라는 점」만 해도 WSL은 훌륭한 개념이라 할 수 있겠다. 그러니 Windows 사용자라면 이제 그만 Linux에 대한 거부감을 떨쳐버리고 순순히 WSL을 사용하시면 되겠다.

필자는 본 블로그를 JAM Stack - Hexo를 구성해서 사용하고 있는데, Windows에서 작업 시 Hexo의 폴더는 윈도우 내의 Directory에 존재하지만, 그 모든 환경 설정 및 구동은 WSL에서 Bash Shell에서 작업한다. 개발 작업이 끝나고 WSL을 종료하면 Hexo의 모든 개발 환경은 메모리에서 사라져버리므로 깔끔하고 마음 편하게 다음 작업으로 넘어갈 수 있다. 기존에를 서버 환경을 설정하면 지저분하게 프로세스가 남아 컴퓨터 사용에 방해되던 불편함이 싹~ 사라져 버려 개발환경 설정/관리 시 WSL과 Docker만 고려하면 되어서 몸과 마음이 너무나도 평안하고 상쾌하다.


WSL Architecture

본 블로그의 WSL와 Docker 관련 내용들 대부분은 WSL2를 사용함을 가정하여 설명되어 있다. 그러니 그 이야기를 진행하기 전에 WSL1은 대체 뭘까를 한 번 짚어보려 한다.

아참, 미리 말해둬야 겠다. 누군가 “굳이 WSL1을 따로 알아야 하는가?” 라고 질문한다면, 당연히 답은 “절대 No” 이다. 정확히는 “굳이?” 정도일 듯 하다.

이후 WSL Architecture에서 설명할 내용은 필자처럼 뭔가 원초적인 내용을 이해하지 못하면 살짝 짜증이 올라오며 알아 내야면 속이 시원하고, 소화가 잘되며, 꿀잠을 자는 사람들을 위한 내용일 뿐이다. 몰라도 사용하는데 전혀 상관이 없는 내용이다.

자, WSL2, 여기에서 숫자 「2」는 두 번째 버전이라는 의미이다. 첫 번째 버전은 완전 Core한 Windows 소프트웨어 개발자들의 관심을 잠깐 받은 후 널리 알려지지 않고 휙~ 지나간 느낌이 있지만, WSL1은 WSL2와 다르게 NTFS(윈도우 파일 시스템) 호환성을 높이 지원한다. 관련한 이야기는 나중에 다른 글에서 다시 다루려 한다.

일단, 필자 같은 집착꾼이 아니라면 딱히 관심 가지지 않을 구조에 대해 한 번 짚어 본다.

WSL1과 WSL2의 아키텍처 비교

위 그림을 보면 WSL1과 WSL2의 대략적인 차이를 볼 수 있다.

WSL1에서는 Windows에서 Linux 시스템을 WSL이 Emulating하여 처리하는 방식이었다. 모든 사용자의 명령은 Windows NT Kernel이 WSL을 통해 Linux-compatible kernel interface와 통신 후 Linux interface는 다시 결과를 WSL을 통해 윈도우 시스템 명령으로 번역해서 돌려준 후 사용자들에게 결과를 보여주는 방식이었다. 이 때문에 WSL1에서는 모든 Linux의 명령을 처리하는 데에 한계가 존재했으며, 실행되는 명령들도 처리 속도가 느렸다. 즉, 이 경우에는 실제 Linux를 사용한다기 보다 Linux를 가상화하여 결과를 보여주는 방식이었고, 동시에 Linux Kernel에 특화된 명령들은 WSL1에서는 실행할 수 없었다.

그에 비해 WSL2에는 실제 Linux Kernel이 탑재되어 있다. 이 의미인 즉, Windows10 내에서 모든 Linux의 시스템 명령을 처리할 수 있게 되었다는 의미이다. 위 그림을 보면 Windows 사용자가 「경량화된 Linux VM 도구(Light-Weight Linux Utility Virtual Machine」에 명령 신호를 보내면, 이 Linux VM 내부에 EFL 64 Linux Binary를 구동하기 위한 아키텍처를 가지고 있어 Linux UserMode에서 Linux Kernel로 신호를 보내 작동하도록 되어 있다. 같은 Hyper-V를 이용하더라도 Windows UserMode와 Linux UserMode를 병렬로 사용할 수 있기 때문에 인터페이스의 이슈가 줄어들고 처리 속도가 향상된다.

WSL2는 기본적으로 WSL1의 단점들을 개선하는 측면에서 발전이 있었다.

추가로, 실제 개발 환경을 꾸려 사용하는 프로그래머의 입장에서 WSL1과 WSL2의 가장 큰 차이 2개는 ① Linux 시스템 명령의 실행 속도, 그리고 ② Docker의 지원이다.

가상 시스템 속도의 향상은 WSL1에서의 WSL NE-Linux 가상화와 달리, WSL2에서는 Windows UserMode에서 WSL을 호출하여 직접 Linux Bash Shell에서 UserMode를 활용할 수 있게 되었고, 탑재된 Linux Kernel을 병렬로 사용할 수 있어서 가능했다. 이런 아키텍쳐 변화는 Windows에서 Hpyer-V를 활용하여 Linux 시스템을 가상화할 때 CPU와 Memory 등 리소스 사용을 적게 하는 장점도 있다. 리소스 사용량이 적어지니 속도는 당연히 개선된다.

Windows Docker는 과거부터 존재했었지만 속도가 느리고 무거운 단점이 있었으며, Docker는 Windows 기반으로 설계된 애플리케이션이 아니다보니 추가로 설정해야 하는 내용들이 많아 붎현했다. WSL2에서 Docker를 정식 지원함으로 인해 속도가 개선되고 훨씬 편리하게 사용할 수 있게 되었다. WSL2와 Docker에 관련한 이야기는 이후 Docker에 대한 개요 설명 시 진행할까 한다.

WSL2에도 단점은 있는데 WSL1에서는 Windows와 Linux간 Interface 역할을 직접 하기 때문에 NTFS(NT File System) 내의 파일을 Linux에서 빠르게 mount하고 사용이 가능했지만, WSL2에서는 Hyper-V를 통해 파일 시스템의 내용을 공유하게 되므로 SSD를 사용해도 Linux의 mount 및 활용 속도가 느려진다. (그래서 필자는 WSL1과 WSL2를 동시에 사용한다.) 또한, WSL2 사용 시에는 해당 컴퓨터에서 ‘VM Ware’나 ‘Virtual Box’를 함께 사용할 수 없다. 이런 가상화 프로그램들은 Hyper-V 가상화 아키텍처를 사용하기 때문에 WSL2와 동시 사용할 수 없다.

아무튼, 우리는 2021년 현재 WSL2를 사용하면 된다는 게 결론이다.


참고 자료


그림 출처