본문으로 바로가기

윈도우즈와의 상호 운용성 - WSL

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

Windows Subsystem for Linux 상호운용성

윈도우즈 명령프롬프트에서 리눅스 도구 실행

wsl.exe 명령어를 사용하여 윈도우즈 명령 프롬프트(CMD 또는 PowerShell)에서 리눅스 바이너리를 실행한다. 바이너리는 아래와 같이 호출된다.

  1. 현재 CMD 또는 PowerShell 프롬프트와 동일한 작업 디렉토리 사용
  2. WSL 기본 사용자(default user)로 실행
  3. 호출 프로세스 및 터미널과 동일한 윈도우즈 관리 권한을 가진다.

예를 들면,

C:\temp> wsl ls -la
<- contents of C:\temp ->

리눅스 명령에서wsl.exe는 WSL에서 실행되는 명령처럼 처리된다(sudo, piping, 파일 리다이렉션과 같은 것들).

예를 들면,

C:\temp> wsl sudo apt-get update
[sudo] password for username:
Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]

WSL 및 윈도우즈 명령을 섞은 예

C:\temp> wsl ls -la | findstr "foo"
-rwxrwxrwx 1 root root     14 Sep 27 14:26 foo.bat

C:\temp> dir | wsl grep foo
09/27/2016  02:26 PM                14 foo.bat

C:\temp> wsl ls -la > out.txt

wsl.exe에 전달 된 명령은 수정하지 않고 WSL 프로세스로 전달된다. 파일 경로는 WSL 형식으로 지정해야 한다. 예를 들면

C:\temp> wsl ls -la /proc/cpuinfo
-r--r--r-- 1 root root 0 Sep 28 11:28 /proc/cpuinfo

C:\temp> wsl ls -la "/mnt/c/Program Files"
<- contents of C:\Program Files ->

WSL에서 윈도우즈 도구 실행

WSL은 [binary name].exe를 사용하여 WSL 명령줄에서 윈도우즈 바이너리를 직접 호출할 수 있다. 윈도우즈 실행 파일을 보다 쉽게 실행하기 위해 윈도우즈 경로는 리눅스의 $PATH에 포함되어 있다.

이 방식으로 실행되는 응용 프로그램에는 다음과 같은 속성을 가지게 된다.

  • 작업 디렉토리(working directory)를 WSL 명령 프롬프트로 유지(예외는 아래에 설명되어 있다).
  • WSL 프로세스와 동일한 권한을 가짐
  • 활성 윈도우즈 사용자로 실행
  • CMD 프롬프트에서 직접 실행한 것처럼 윈도우즈 작업 관리자에 나타난다.
$ notepad.exe

WSL에서 실행되는 윈도우즈 실행파일은 원시 리눅스 실행 파일과 비슷하게 처리된다(piping, redirect, background 작업을 예상대로 수행할 수 있음). pipe 예제를 들어보면

$ ipconfig.exe | grep IPv4 | cut -d: -f2
172.21.240.1
10.159.21.24

윈도우즈 명령 및 WSL 명령을 섞어 사용한다면

$ ls -la | findstr.exe foo.txt

$ cmd.exe /c dir
<- contents of C:\ ->

윈도우즈 바이너리는 파일 확장명을 포함하고 파일 대소문자와 일치하며 실행 가능해야한다. 배치 스크립트를 포함한 비 실행 파일. dir과 같은 CMD 기본 명령은 cmd.exe /C 명령으로 실행할 수 있다.

$ cmd.exe /C dir
<- contents of C:\ ->

$ PING.EXE www.microsoft.com
Pinging e1863.dspb.akamaiedge.net [2600:1409:a:5a2::747] with 32 bytes of data:
Reply from 2600:1409:a:5a2::747: time=2ms

매개변수(parameter)는 수정되지 않은 윈도우즈 바이너리로 전달된다. 예를들어, 다음 명령은 notepad.exe에서 C:\temp\foo.txt를 연다.

$ notepad.exe "C:\temp\foo.txt"
$ notepad.exe C:\\temp\\foo.txt

WSL에서 윈도우즈 응용 프로그램과 함께 VoIF(/mnt/<x>에 없는 파일)에 있는 파일을 수정하는 것은 지원되지 않는다.

기본적으로, WSL은 윈도우즈 바이너리의 작업 디렉토리를 현재 WSL 디렉토리로 유지하려고 시도하지만 작업 디렉토리가 VoIFs인 경우 인스턴스 생성 디렉토리로 되돌아간다. 예를들면, wsl.exe는 처음에 C:\temp에서 시작되고 현재 WSL 디렉토리가 사용자의 홈으로 변경된다. 사용자의 홈 디렉토리에서 notepad.exe가 호출되면 WSL은 자동으로 C:\temp를 notepad.exe 작업 디렉토리로 되돌리게된다.

C:\temp> wsl
/mnt/c/temp/$ cd ~
~$ notepad.exe foo.txt
~$ ls | grep foo.txt
~$ exit

exit
C:\temp>dir | findstr foo.txt
09/27/2016  02:15 PM                14 foo.txt

윈도우즈와 WSL 간의 환경변수 공유

윈도우즈 인사이더 빌드 17063 이상에서 사용가능

17063 이전버전에는 WSL이 접근할 수 있는 윈도우즈 환경변수만 PATH(WSL 아래에서 Win32 실행파일을 시작할 수 있었음).

17063 버전부터는 WSL과 윈도우즈는 WSL에서 실행되는 윈도우즈 및 리눅스 배포판을 연결하기 위해 만들어진 특수 환경변수인 WSLENV를 공유한다.

WSLENV의 속성

  • 공유됨, 윈도우즈와 WSL 환경 모두에 존재한다.
  • 윈도우즈와 WSL간에 공유할 환경 변수목록이다.
  • 윈도우즈 및 WSL에서 잘 작동하도록 환경 변수를 형식화 할 수 있다.

WSLENV에는 환경변수 변환방법에 영향을 주는 네가지 플래그(flag)가 있다.

  • /p : WSL/리눅스 스타일 경로와 Win32 경로 사이의 경로를 변환한다.
  • /l : 환경변수가 경로 목록임을 나타낸다.
  • /u : Win32에서 WSL을 실행할 때만이 환경변수가 포함되어야 함을 나타낸다.
  • /w : 이 환경변수는 WSL에서 Win32를 실행할 때만 포함되어야 함을 나타낸다.

필요한 경우 플래그를 결합할 수 있다.

상호운용성(interop) 비활성화

사용자는 root로 다음 명령을 실행하여 단일 WSL 세션에 대한 윈도우즈 바이너리를 실행할 수 있는 기능을 비활성화 할 수 있다.

$ echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop

윈도우즈 바이너리를 다시 활성화하려면 모든 WSL 세션을 종료하고 bash.exe를 다시 실행하거나 root로 다음 명령을 실행하면 된다.

echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop

상호운용성(interop)을 비활성화하면 WSL 세션간에 유지되지 않는다(새 세션이 시작되면 상호운용성이 다시 활성화됨).

사용하는 버전이 Creators Update and Anniversary Update 버전이라면 위에서 설명한 것들과 다르게 작동하는 부분이 있을수 있다. Creators Update and Anniversary Update를 확인하도록 하자.