- 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
접근하는 웹 애플리케이션에 대해서 알아볼 예정이다.