- Published on
WSL 에 대해서
- Authors
- Name
- 길재훈
이는
효율성이 배가되는 WSL2 가이드북을 보고 정리한 내용이다.
WSL 을 알아보도록하자
Ubuntu 에서 다시 Window 로 넘어오게 되었다. Window 는 GUI 가 매우 뛰어나지만 CLI 가 불편하다.
CLI 의 편리함은 단연 Linux 가 훨씬 편한듯하다. (Linux 환경을 먼저 접해서 그렇겠지만.. )
그런데 Window 에서 Linux 를 사용할 수 있게 WSL 이라는 굉장한 것을 제공한다고 한다. Window Terminal 쓰면서 불편해하지말고 WSL 로 바로 이사갈 준비를 해야겠다.
적어도 맥북을 새로 살때까지는
WSL로 버텨야 한다!!
WSL 이 탄생한 이유
WSL 이란 윈도우에서 리눅스를 실행할수 있도록 만들어진 서비스이다.
이는 윈도우 환경과 리눅스 환경을 모두 통합시킬수 있으며, 심지어 윈도우에서 실행중인
프로세스를 호출하여 리눅스에서 처리 가능하기도 하다.
미친기술이야...
Window Service For Linux(WSL) 이름만 들어도 왜 만들어졌는지 이해가 간다. 이렇게 Window 와 Linux 간의 통합은 굉장한 일이며, 사용안할 이유가 없다.
무엇보다
Window CLI가 너무 불편해..
WSL1
WSL 2 가 있다면 WSL1 도 있겠네?
WSL2 이전의 기존의 WSL 은 변환계층을 만들어 처리한것이라고 한다.Window binary 는 바로 윈도우 커널에서 처리 가능하지만,
우리가 알고 있는 Linux 는 Window 커널 에서 실행 불가능하다.
즉 중간에서 Linux 명령을 Window 커널 에서 이해할 수 있는 명령으로 바꾸어 주어야 한다.
이러한역할을 한것이 바로 WSL 이다.
하지만, 이러한 과정에서 성능상의 Overhead 및 처리 방법의 차이점이 생기게 되어
리눅스 애플리케이션이 제대로 동작하지 않는등의 몇가지 문제가 발생하게 된다.
이를 해결하기 위해 내놓은 방법이 바로 WSL2 이다.
WSL2
WSL2 는 기존의 WSL1 과는 다르게 설계된다.
Window Binary 를 처리할때는 Window 커널 을 사용하고,Linux Binary 를 처리할때는 Linux 커널 을 사용한다.
기존의 WSL 을 통해 Window 커널 이 이해할수 있도록 변환해주는것과는 전혀 다른 구조이다.
그리고 이렇게 처리된 명령어를 Hypervisor 가 받게하여, 컴퓨터 하드웨어를 제어
하도록 만든 구조이다.
이는 마치, VM 을 2개 돌리는 것과 같은 효과이다. 즉, Window VM 과 Linux VM 을 같이 사용하며, Window Binary 와 Linux Binary 를
파이핑 시켜 전송가능한 구조로 만들었다.
이를 통해 Linux 와 Window 간의 차이점을 통한 문제를 해결하였으며,Lightweight utility virtual machine 을 사용하여 속도는 더빨라지고
메모리 역시 덜 차지하는 효과를 얻게 되었다고 한다.
WSL Commend
> wsl --list
// 설치된 배포판의 전체 목록
> wsl --list --all
// 설치 중이거나 설치된 배포판의 전체 목록
> wsl --list --running
// 현재 실행중인 배포판 목록
> wsl --list --verbose
// 설치된 배포판의 자세한 내용을 보여주는 목록
> wsl --list --quiet
// 설치된 배포판의 이름만 보여주는 목록
> wsl --set-version [distribution] [wsl version]
// wsl 특정 배포판을 원하는 wsl 버전으로 set
> wsl --set-version [wsl version]
// wsl 모든 배포판을 원하는 wsl 버전으로 set
Window CLI상에서WSL 배포된 Linux명령어 실행
> wsl ls ~
> wsl cat ~/index.txt
-d || --distribution를 통해특정 배포판에 명령실행
> wsl -d [특정 배포한] [명령어]
-u || --user를 통해배포판의사용자를 지정하여 실행
> wsl -u [사용자] [명령어]
wsl종료
> wsl --terminate [배포판]
// 특정 배포판 종료
> wsl --shutdown
// `WSL` 에서 실행중인 모든 배포판 종료
wsl.conf
wsl.conf 파일은 /etc/wsl.conf 에 존재한다.
파일 설정이후, 배포판에 적용하기 위해서는 해당 배포한을 재실행해야 한다.
wsl.conf 는 대표적으로 automount, network, interop, user 인 총 4가지 섹션을 지원한다.wsl.conf 의 대략적인 생김새는 다음의 구조로 이루어진다
[section1]
key = value
[section2]
key = value
automount section
WSL 이 배포판내에서 윈도우 드라이브를 마운트하는 방법을 제어하는 옵션을 제공
밑은 WSL 고급 설정 구성 에서 가져온 내용이다.
| key | value | default | description |
|---|---|---|---|
| enabled | boolean | true | true 는 고정드라이브(예: C:\ 및 D:\)가 /mnt 에서 DrvF 로 자동으로탑재되도록 한다. false 는 드라이브가 자동으로 탑재 되지 않음을 의미하지만,수동으로 fstab 을 통해 탑재가능하다. |
| mountFsTab | boolean | true | true 는 WSL 시작시 /etc/fstab/ 을 통해 처리되도록 설정한다. /etc/fstab는 SMB(Service Message Block) 공유와 같은 다른 파일 시스템을 선언할 수 있는 파일이다. 따라서 시작 시 이러한 파일 시스템을 WSL에 자동으로 탑재할 수 있다. |
| root | string | /mnt/ | 고정 드라이브가 자동으로 탑재될 디렉터리를 설정한다. 기본적으로 /mnt/ 로 설정되어 있으므로 Window 파일 시스템 C Drive 는 /mnt/c/ 에 탑재된다./mnt/ 를 /windir/ 로 변경하면 고정 C Drive 가 /windir/c/ 에 탑재될것이다. |
| option | uid, gid 등과 같이 쉽표로 구분된 값 목록 아래 자동 탑제 옵션 참조 | 빈문자열 | 자동 탑제 옵션값은 아래의 나열되어 있으며, 기본 DrvFs 탑재 옵션 문자열에 추가된다. DrivFs 별 옵션만 지정할 수 있다. |
drvfs(Drive File System)란?window에서 사용되는 가상 파일 시스템 드라이버이다.
이 드라이버는WSL이나Docker같은 애플리케이션에서 사용된다.
자동 탑제 옵션
| key | description | default |
|---|---|---|
| uid | 모든 파일의 소유자에게 사용되는 사용자 ID | WSL 배포판의 기본 사용자ID(처음 시작할 때 기본값은 1000으로 설정) |
| gid | 모든 파일의 소유자에게 사용되는 그룹 ID | WSL 배포판의 기본 그룹ID(처음 설치할때 기본값은 1000으로 설정) |
| umask | 모든 파일 및 디렉터리에서 제외할 권한의 8진수 마스크 | 000 |
| fmask | 모든 파일에서 제외할 권한의 8진수 마스크 | 000 |
| dmask | 모든 디렉터리에서 제외할 권한의 8진수 마스크 | 000 |
| metadata | Linux 시스템 권한을 지원하기 위해 메타데이터가 Windows 파일에 추가되는지 여부 | disabled |
| case | 대/소문자를 구분하는 디렉터리로 취급되는 디렉터리와 WSL 로 만든 새디렉터리에 플래그가 설정되는지 여부를 결정한다. 옵션에 대한 자세한 설명은 대/소문자 구분을 참조하라고 한다. 옵션에는 off, dir 또는 force 가 포함된다. | off |
network section
섹션 레이블: [network]
| key | value | default | description |
|---|---|---|---|
| generateHosts | boolean | true | true는 WSL 에서 /etc/hosts 를 생성하도록 설정한다.hosts 파일에는 IP 주소에 해당하는 호스트 이름의 정적 맵이 포함된다. |
| generateResolvConf | boolean | true | true 는 WSL 에서 /etc/resolve.conf 를 생성하도록 설정한다.resolve.conf 는 지정한 호스트 이름을 해당 IP 주소로 호가인할 수 있는 DNS 목록이 포함된다. |
| hostname | 문자열 | window 호스트 이름 | WSL 배포에 사용할 호스트 이름을 설정한다. |
Interop section
섹션 레이블: [interop]
| key | value | default | description |
|---|---|---|---|
| enabled | boolean | true | 이 키를 설정하면 WSL 에서 Window process 시작을 지원하는지 여부가 결정된다. |
| appendWindowsPath | boolean | true | 이키를 설정하면 WSL 에서 Window 경로 요소를 $PATH 환경 변수에 추가할지 여부가 결정된다. |
user section
섹션 레이블: [user]
| key | value | default | description |
|---|---|---|---|
| default | String | 처음 실행시 만들어진 초기 사용자 이름 | 이 키를 설정하면 WSL 세션을 처음 시작할때 실행할 사용자를 지정한다 |
boot section
섹션 레이블: [boot]
| key | value | default | description |
|---|---|---|---|
| 명령을 사용한다 | 문자열 | "" | WSL 인스턴스가 시작될대 실행할 명령의 문자열이다.이 명령은 루트 사용자로 실행된다. ex: service docker start |
.wslconfig
wsl.conf는WSL특정 배포판에만 설정하는것이다.
반면.wslconfig는 전역적으로 설정하는 파일이라고 생각하면 된다.
이부분에 대해서는 조금 더 공부 한 이후에 필요하다면 정리할 예정이다.
리눅스 파일 접근
WSL2 는 VM 이다. 그리고 Hypervisor 를 통해 Divice 와 상호작용하며, 각 VM 은 상호작용이 가능하도록 이루어졌다고 했다.
즉 Window 에서 Linux 파일에 접근 가능하며, Linux 어플리케이션을 실행할수도 있는것이다.
이렇게 Window 에서 Linux 에 접근하기 위해서는 파일탐색기 에서 \\wsl$ 을 입력해서 접근 가능하다.
흥미로운것은 UNC 경로 로 되어 있다는 것이다.
UNC 경로란?
>Universal Naming Convention의 약자로, 네트워크 경로를 나타내기 위한 표준방법이다.
>UNC는 두부분으로 구성된다. 첫번째 부분은Server 이름이며, 두번째 부분은공유폴더 이름이다.
>UNC를 사용하면 네트워크의 모든 컴퓨터에서 파일 및 폴더에 접근할 수 있다.
>UNC 경로는 파일 및 폴더를 찾는데 사용되는 표준 방법이므로, 파일 공유 및 네트워크 관리에 유용하다.
이러한 UNC 경로 가 있다는 것은, Window 의 PowerShell 에서도 접근 가능하다는 것이다.
Piping
앞써서 Window 에서 Linux 배포판에 접근 가능하다고 하였다. 이를 통해 출력을 Piping 하여 윈도우 및 리눅스모두에서 실행되는 스크립트 처리가 가능하다
wsl bash -c "ls /usr/bin | cut -c1" | Group-Object
책에서는 다음처럼 추천한다
"윈도우 유틸리티에 더 익숙하다면 리눅스 애플리케이션을 실행해 나온 결과를 윈도우 유틸리티로 처리할 수 있다. 또는 (중략...) 리눅스 유틸리티를 호출하여 윈도우 출력 내용을 처리할 수 있으므로, 생산성을 높일 수 있다."
윈도우에서 리눅스 웹 애플리케이션 접근
Web Application 개발시, 웹 브라우저에서 WSL VM 접근시 WSL Lightweight VM 은 별도의 IP 주소를 갖는다.
그러므로 해당 WSL VM 의 ip addr 을 통해 해당 ip 주소를 알아낸후 접근해야 한다.
하지만, WSL 에서 localhost 주소 요청시 Linux VM에 전달하여 처리한다고 한다.
그러므로, 마음놓고 localhost 를 사용할것이다.
다음 Blog 는 Linux 에서 Window 접근하는 웹 애플리케이션에 대해서 알아볼 예정이다.