본문으로 바로가기

WSL(Windows Subsystem for Linux ) 소개

category 윈도우즈/WSL 2018. 2. 19. 11:00

MS는 개발자들의 발걸음을 되돌리기 위한 노력의 일환으로 Windows Subsytem for Linux(WSL)를 발표하였습니다. 맥과 리눅스의 개발환경의 편의성을 고려했다는 것은 그것들에 익숙해져있는 개발자들에게는 희소식이 아닐수 없습니다. 아래의 내용에선 WSL의 간단한 소개와 유의사항에 대하여 알아봅니다.

Windows Subsystem for Linux 소개

WSL 소개

윈도우즈 10과 윈도우즈 서버군에 새롭게 포함된 WSL은 윈도우즈에서 리눅스 명령을 cmd, powershell 등을 통해 직접 실행할 수 있는 새로운 기능이다. 다시말하면 리눅스용으로 제공되는 각종 프로그램과 편리한 도구들을 윈도우용으로 포팅하거나 윈도우용 버전을 구할 필요가 없어지는 것이다. 특히나 IT쪽 개발자들은 윈도우에서 개발을 진행하면서 각종 가상머신과 에뮬레이터를 통해 불필요한 자원을 소모해가며 대체해오던 많은 것들을 실제 리눅스에서 개발하듯 윈도우에서 리눅스를 넘나들수 있게 된 것이다.

WSL에 대한 깊숙한 정보는 Windows Subsystem for Linux Overview를 읽어보도록 하자.

개발자 중점

WSL의 개발목적이 그러하듯 주로 개발자들이 사용하기위한 도구로써의 기능을 갖추고 있다. 특히 웹개발자 및 오픈소스 프로젝트에서 작업하는 사람들에게 중점이 맞추어져 있는데 Bash, 일반적인 Linux 명령어(sed, awk, etc)와 많은 Linux-first 도구들(Ruby, Pyton, etc)을 윈도우에서 사용하고자 하는 사람들에게 유용하다.

MS는 웹서버 및 가상머신, 컨테이너(Docker)등의 기능까진 지원하지 않을 작정이었나 본데 웹서버는 지금도 구현가능하고 지원하는 방향으로 선회했는지 정식버전에는 지원사항에 포함되었다. 가상머신은 Hyper-V와 Docker 같은 컨테이너도 MS 자체적으로 개발진행중이기에 포함되긴 힘들듯 싶다.

필자와 같은 웹개발자를 위한 최상의 구현방식은 아래와 비슷하지 않을까 싶다.

  • 윈도우에서 작동하는 편집기(SublimeText, phpStorm등)를 설치하고 프로젝트를 담아둘 폴더를 만든다.
  • WSL에서 프로젝트 폴더를 마운트한다.
  • 기본적인 로컬서버 혹은 PHP를 WSL에 환경에 구성한다.
  • 각종 개발툴들 Composer, node.js, Git등을 WSL에 설치한다.
  • 추가적인 테스트서버는 윈도우에서 Docker 컨테이너를 이용한다.
  • Hyper-V를 이용한 가상머신으로 IE8, IE9, IE10 등의 테스트를 진행한다.
  • WSL은 구동시키지 않으면 작동하지 않기에 많은 개발자툴들을 설치해도 윈도우상에서는 깨끗이 관리되는 장점을 가지게 된다. 또한 각종 리눅스 패키지들이 꼬여도 간단히 설치한 리눅스 배포판의 앱을 초기화 시킴으로써 재설치의 고단함도 날려버릴 수 있다.

윈도우와 WSL간의 변경사항 추적

윈도우에서 리눅스의 파일의 경로를 추적해 열어보거나 수정하는 것은 금지하고 있다. 가능이 하더라도 시스템상에 문제를 주기에 MS는 만류하고 있다.

반대로 리눅스에서 윈도우의 파일을 마운트하고 생성,수정,삭제하는 모든 행동들은 윈도우와 문제없이 서로 호환이 되고 실시간으로 변경점들이 반영된다. 즉, 여러 리눅스도구들을 WSL에 설치하고 작업중인 프로젝트에 반영하고 그것들을 윈도우상의 편집기등에서 업데이트되어 작업을 진행할수 있다는 것이다.

어디까지 가능한가?

리눅스에서 제공하는 모든 것이 가능하진 않지만 점차 지원을 확대하고 있다(처음엔 단순한 Bash 툴을 사용하는 것에서 많은 요구로 더 확장해가는 MS의 의외의 행보).

  • 레포지토리의 이용이 가능하기에 apt-get과 같은 패키지 관리자들을 통해 여러 도구들을 다운로드 및 설치하여 사용가능하다.
  • TUI의 대표적인 편집기인 vim, emacs, tmux 등을 사용 가능하다.
  • Javascript/node.js, Ruby, Python, C/C++, C# & F#, Rust, Go, 등의 개발언어들을 지원한다.
  • GUI의 호환을 정식으로 보장하지 않은체 배포하였으나 GUI를 구현하는 X윈도우서버의 추가(Xming)로 구현이 가능하다.
  • sshd, MySQL, Apache, lighttpd 등의 웹서버 구축에 필요한 것들도 지원한다.
  • 리눅스 콘솔에서 윈도우즈용 프로그램을 실행할 수 있다.
  • 윈도우즈에서 리눅스 프로그램을 실행할 수 있다.

불가능한 것

  • Docker와 같은 컨테이너류와 가상화 기술은 지원하지 않을것으로 보인다. WSL 조차도 실시간 상호 연동가능한 가벼운 가상머신정도로 생각할 수 있겠다(Docker 기술과 가장 유사하다).
  • 커널 드라이브, 커널 컴파일 및 업데이트는 불가능하다.
  • 그 밖의 OpenGL, SDL등의 멀티미디어 기능이 불가능하다.
  • 윈도우즈상에서 WSL상의 리눅스파일들에 대한 수정, 삭제를 금하고 있다. 이는 아래에서 좀 더 자세히 다룬다.

윈도우즈 응용 프로그램과 도구들로 리눅스 파일을 수정하지 말것

아래의 내용은 Do not change Linux files using Windows apps and tools이 원문이다.

어떤 경우에도 윈도우즈 응용 프로그램, 도구, 스크립트, 콘솔등을 사용하여 Linux 파일을 작성 및 수정하지 마십시오!

일부 윈도우즈 도구를 사용하여 파일을 열면 열려있는 파일 혹은 폴더를 읽기잠금으로 설정하여 파일 내용 혹은 메타 데이터를 업데이트하지 못하게하여 파일 및 폴더가 손상될 수 있다.

출처: https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/

윈도우즈에서 리눅스파일을 생성/변경하면 리눅스 환경이 손상되어 배포판을 제거하고 다시 설치해야 할 수 있습니다!

리눅스파일은 %localappdata%\lxss 아래에 있는 파일 및 폴더이며, 이 곳에 리눅스 파일 시스템(배포판과 사용자파일)이 저장되어있다.

OS들은 서로 다른 메타데이터(사용권한, 소유권, 생성,수정시간정보등)를 포함하고 있으며 윈도우즈 또한 리눅스의 이런 메타 데이터 정보를 알수가 없다. WSL을 실행하지 않는 대다수의 윈도우즈 사용자에게 불필요한 오버헤드를 줄이기 위해 윈도우즈도 자동적으로 메타데이터를 갱신하지 않는다.

리눅스 파일시스템 루트 아래의 모든 파일에 대해 리눅스 파일 메타데이터를 작성/업데이트하고 각 파일의 NTFS 확장 특성에 리눅스 메타데이터를 저장하는 것은 WSL의 임무이다. WSL은 또한 윈도우즈 파일시스템의 대부분의 파일에 대해 의사(pseudo) 메타데이터를 종합한다.

문제는 윈도우즈 애플리케이션 및 도구들을 이용해서 열거나, 생성하거나 수정한다면 이 행위에 대한 메타데이터는 윈도우용으로 작성되어 지고, 어떠한 리눅스 파일 메타데이터를 포함하지 않기 때문에 리눅스는 파일이 비어있거나 존재하지 않거나 메타 데이터가 있을수도 있지만 메타데이터가 파일의 세부정보를 반영하지 못해 파일 내용이 손상되게 되는 것이다. 이외에도 윈도우즈에서도 문제점이 있고...(중략).

윈도우즈와 WSL의 상호연동작업시

윈도우즈에서 해당 파일을 저장 및 작업하고 Bash(리눅스)에서 /mnt/드라이브문자/경로와 같은 방식으로 접근하도록하자(예. /mnt/c/dev/project).

Bash에서 윈도우즈 파일 시스템에 있는 파일에 접근하면 WSL은 NT 파일 시스템 동작, 사용권한등을 존중하며 이런식으로 시스템간 복사나 이동없이 동일한 파일에 접근할 수 있다.