| | 1 | [[PageOutline]] |
| | 2 | = Windows Subsystem for Linux 2 (WSL 2) = |
| | 3 | https://docs.microsoft.com/ko-kr/windows/wsl/ |
| | 4 | |
| | 5 | WSL은 실제 리눅스 커널 + 독자적인 init 프로세스 두 가지가 합쳐진 것이라 이해하면 편하다. |
| | 6 | |
| | 7 | WSL init 프로세스는 리눅스의 init 프로세스가 하는 기능 외에 추가로 리눅스와 윈도우 구성 요소 간의 통신을 위한 인프라를 제공하는 역할을 담당한다. |
| | 8 | |
| | 9 | WSL은 실제 리눅스 커널을 사용했기 때문에 호환성 문제 없이 대부분의 리눅스 프로그램을 Windows에서 직접 실행할 수 있다. |
| | 10 | |
| | 11 | 그리고, WSL 2는 윈도우와 격리되어 있지 않아 윈도우에서 리눅스 파일을 실행하거나 접근할 수 있고, 리눅스에서 윈도우의 파일을 실행하거나 접근할 수 있다. |
| | 12 | |
| | 13 | 완전한 기능의 리눅스가 필요하다면 기존 VM을 이용해야 한다. 기존 VM 환경은 완전한 리눅스 환경을 제공하는 대신 부팅의 전 과정을 거치므로 부팅 속도가 느리고, 윈도우와 격리되어 있으며, 많은 리소스를 사용한다. |
| | 14 | |
| | 15 | 반면에 WSL은 기존 VM 환경보다 리소스도 훨씬 적게 사용하고 빠르게 리눅스 프로그램을 실행할 수 있다. |
| | 16 | |
| | 17 | 각종 데몬을 실행하려면 systemd를 사용하도록 WSL을 설정해야 한다. WSL init 프로세스가 systemd를 실행하는 오버헤드가 있기 때문에 기존보다 부팅에 걸리는 속도는 느려진다. |
| | 18 | |
| | 19 | - 부팅 속도: 아무런 데몬도 실행하지 않는 기본 WSL > systemd를 사용하도록 설정한 WSL > VM |
| | 20 | |
| | 21 | 그외 차이점으로는 다음과 같은 것을 들 수 있다. |
| | 22 | |
| | 23 | 1. Windows 프로세스에 대한 열린 파일 핸들이 없는 경우, WSL이 자동으로 종료된다. 즉, 웹 서버를 종료하는 경우, WSL은 사용자가 사용을 완료하고 리소스를 정리한다는 것을 감지하기 때문에 WSL이 종료될 수 있다. |
| | 24 | 1. WSL 사용자는 모든 권한을 갖는다. 등록된 WSL 배포 등은 모두 사용자가 접근할 수 있으며 수정할 수 있다. |
| | 25 | 1. WSL은 윈도우 파일에 대한 파일 액세스 권한을 자동으로 제공한다. |
| | 26 | 1. Windows 경로는 기본적으로 경로에 추가되어 기존 Linux 환경에 비해 특정 Linux 애플리케이션에 대해 예기치 않은 동작이 발생할 수 있다. 예) rkhunter |
| | 27 | 1. WSL은 Windows 실행 파일을 실행할 수 있다. |
| | 28 | 1. WSL에서 사용하는 커널은 자동으로 업데이트된다. |
| | 29 | 1. WSL의 GPU 액세스는 GPU 호출을 Windows GPU로 라우팅하는 /dev/dxg 디바이스를 이용한다. 이 설정은 기존 VM과 다르다. |
| | 30 | |
| | 31 | |
| | 32 | == 1. 설치 조건== |
| | 33 | |
| | 34 | 1. 윈도우 10이나 윈도우 11이어야 한다. |
| | 35 | - 윈도우 10에서는 최신 버전으로 업데이트하면 가능하다. |
| | 36 | 1. 시스템 아키텍처가 64비트여야 한다. |
| | 37 | - 32비트 아키텍처에서는 사용할 수 없다. |
| | 38 | 1. 바이오스에서 가상화가 가능하도록 설정을 해야 한다. |
| | 39 | - 바이오스에서 가상화가 가능하게끔 설정되어 있는지 여부는 작업 관리자 > '성능' 탭 > 'CPU' 항목에서 '가상화'가 '사용'으로 나오는지 보면 된다. |
| | 40 | - 가상화 설정이 되어 있지 않다면 바이오스에서 설정해주자. |
| | 41 | |
| | 42 | |
| | 43 | == 2. 설치 == |
| | 44 | |
| | 45 | === 2.1. WSL 설치 === |
| | 46 | 1. ~~'Linux용 Windows 하위시스템' 사용 가능하게 변경~~ |
| | 47 | - ~~제어판 > 프로그램 제거 또는 변경(또는 '프로그램 및 기능') > Windows 기능 켜기/끄기 > 'Linux용 Windows 하위시스템'을 체크해도 되고 Powershell을 관리자 권한으로 실행해서 다음과 같이 실행해도 된다.~~ |
| | 48 | {{{ |
| | 49 | dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart |
| | 50 | }}} |
| | 51 | |
| | 52 | 2. ~~'가상 머신 플랫폼' 사용 가능하게 변경~~ |
| | 53 | - ~~제어판 > 프로그램 제거 또는 변경(또는 '프로그램 및 기능') > Windows 기능 켜기/끄기 > '가상 머신 플랫폼'을 체크해도 되고 Powershell을 관리자 권한으로 실행해서 다음과 같이 실행해도 된다.~~ |
| | 54 | {{{ |
| | 55 | dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart |
| | 56 | }}} |
| | 57 | - ~~이 다음에는 재부팅을 해서 가상 머신 플랫폼 설치를 마무리지어야 한다.~~ |
| | 58 | |
| | 59 | 3. ~~Windows Update 실행~~ |
| | 60 | - ~~Linux 커널 업데이트를 위해 필요하다. 이 과정을 거치지 않으면 배포판을 설치할 때 다음과 같은 에러가 발생한다.~~ |
| | 61 | {{{ |
| | 62 | WSL 2에 커널 구성 요소 업데이트가 필요합니다. 자세한 내용은 https://aka.ms/wsl2kernel을 참조하십시오. |
| | 63 | }}} |
| | 64 | |
| | 65 | 4. ~~Linux 커널 업데이트~~ |
| | 66 | - ~~[https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지] 다운로드받고 실행~~ |
| | 67 | - ~~이 절차는 더 이상 필요하지 않았다. ~~ |
| | 68 | |
| | 69 | |
| | 70 | 5. ~~WSL 2를 기본 버전으로 설정~~ |
| | 71 | - ~~Powershell을 관리자 권한으로 실행해서 다음과 같이 실행한다.~~ |
| | 72 | {{{ |
| | 73 | wsl --set-default-version 2 |
| | 74 | }}} |
| | 75 | - ~~이 절차는 더 이상 필요하지 않았다. ~~ |
| | 76 | |
| | 77 | 관리자 모드에서 {{{PowerShell}}} 또는 Windows 명령 프롬프트를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하여 열고 {{{wsl --install}}} 명령을 입력한 다음 컴퓨터를 다시 시작한다. |
| | 78 | |
| | 79 | |
| | 80 | === 2.2. 지원하는 배포판 설치 === |
| | 81 | 온라인 스토어에서 다운로드할 수 있는 배포판 목록은 wsl -l -o 명령으로 볼 수 있다. |
| | 82 | |
| | 83 | 이 중에서 하나를 골라 다음과 같이 간단하게 설치할 수 있다. |
| | 84 | {{{ |
| | 85 | wsl --install -d Ubuntu |
| | 86 | }}} |
| | 87 | |
| | 88 | === 2.3. 지원하지 않는 배포판 설치 === |
| | 89 | [https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/ Import Rocky Linux to WSL] |
| | 90 | |
| | 91 | CentOS, {{{RockyLinux}}} 처럼 현재 wsl에서 지원하지 않는 배포판이라 할지라도 설치가 가능하다. |
| | 92 | |
| | 93 | ==== 2.3.1. 배포판 wsl 이미지 파일로 설치 ==== |
| | 94 | 배포판 홈페이지 등에서 wsl용 이미지 파일을 제공해주는 경우에는 그걸 다운로드받아서 사용하는 것이 편하다. |
| | 95 | |
| | 96 | 1. 배포판 wsl 이미지 파일을 원하는 위치에 저장한다. 여기 예에서는 D:\Downloads\wslDistroStorage\Rocky-10-WSL-Base.latest.x86_64.wsl" |
| | 97 | 1. PowerShell을 열고 배포판을 저장 하려는 위치에 폴더를 만든다. |
| | 98 | {{{ |
| | 99 | PS> mkdir F:\Downloads\wslDistroStorage\RockyLinux10 |
| | 100 | }}} |
| | 101 | 1. wsl {{{--}}}install {{{--}}}from-file [배포판 wsl 이미지 파일] {{{--}}}name [배포판 이름] 명령으로 wsl 파일을 설치한다. |
| | 102 | {{{ |
| | 103 | PS> wsl --install --from-file "D:\Downloads\wslDistroStorage\Rocky-10-WSL-Base.latest.x86_64.wsl" --name RockyLinux10 |
| | 104 | }}} |
| | 105 | 1. wsl {{{--}}}manage [배포판 이름] {{{--}}}move [배포판 저장 경로] 명령으로 설치 위치를 원하는 곳으로 옮긴다. |
| | 106 | {{{ |
| | 107 | PS> wsl --manage RockyLinux10 --move "D:\Downloads\wslDistroStorage\RockyLinux10" |
| | 108 | }}} |
| | 109 | 1. 설치한 배포판을 확인한다. |
| | 110 | {{{ |
| | 111 | PS> wsl -l -v |
| | 112 | }}} |
| | 113 | 1. 배포판을 실행한다. |
| | 114 | {{{ |
| | 115 | PS> wsl -d RockyLinux10 |
| | 116 | }}} |
| | 117 | |
| | 118 | ==== 2.3.2. 배포판 tar 파일로 설치 ==== |
| | 119 | |
| | 120 | ===== 2.3.2.1 배포판 tar 파일 다운로드 ===== |
| | 121 | 먼저 배포판 tar 파일을 찾는다. {{{RockyLinux}}}는 https://docs.rockylinux.org/pt-BR/guides/interoperability/import_rocky_to_wsl/ 에서 다운로드받는 것이 편하다. |
| | 122 | |
| | 123 | 배포판 tar 파일을 찾기 힘들다면 Docker Hub나 Quay.io에서 받는 것이 낫다. 이를 위해서는 먼저 podman이나 docker가 설치된 시스템이 있어야 한다. wsl에 디폴트로 설치되는 Ubuntu에 podman이나 docker를 설치해도 된다. |
| | 124 | |
| | 125 | 1. 배포판 이미지를 찾는다. |
| | 126 | {{{ |
| | 127 | podman search rockylinux |
| | 128 | }}} |
| | 129 | - Rocky Linux의 Docker Official Image는 다음 URL에서 정보를 찾으면 된다. https://hub.docker.com/_/rockylinux |
| | 130 | 2. 이미지를 실행한다. |
| | 131 | {{{ |
| | 132 | podman run -t docker.io/library/rockylinux:9 ls / |
| | 133 | }}} |
| | 134 | 3. 컨테이너 ID를 확인한다. |
| | 135 | {{{ |
| | 136 | podman ps -a |
| | 137 | }}} |
| | 138 | 4. 컨테이너 ID를 tar 파일로 내보낸다. wsl에서 작업하는 것이라면 바로 윈도우 파일시스템에 저장하는 것이 편하다. 예를 들어 /mnt/c/temp/rockylinux.tar |
| | 139 | {{{ |
| | 140 | podman export [컨테이너 ID] > /path/to/rockylinux.tar.gz |
| | 141 | }}} |
| | 142 | |
| | 143 | ===== 2.3.2.2. wsl로 tar 파일 가져오기 ===== |
| | 144 | 배포판 tar 파일을 찾았다면 그 다음 단계로 tar 파일을 wsl로 가져온다. |
| | 145 | |
| | 146 | 1. 배포판 tar 파일을 원하는 위치에 저장한다. 여기 예에서는 C:\temp\rockylinux.tar |
| | 147 | 1. PowerShell을 열고 배포판을 저장 하려는 위치에 폴더를 만든다. |
| | 148 | {{{ |
| | 149 | PS> mkdir F:\Downloads\wslDistroStorage\RockyLinux9 |
| | 150 | }}} |
| | 151 | 1. wsl {{{--}}}import [배포판 이름] [배포판 저장 경로] [배포판 tar 파일] 명령으로 tar 파일을 가져온다. |
| | 152 | {{{ |
| | 153 | PS> wsl --import RockyLinux9 D:\Downloads\wslDistroStorage\RockyLinux9\ C:\temp\rockylinux.tar |
| | 154 | }}} |
| | 155 | 1. 설치한 배포판을 확인한다. |
| | 156 | {{{ |
| | 157 | PS> wsl -l -v |
| | 158 | }}} |
| | 159 | 1. 배포판을 실행한다. |
| | 160 | {{{ |
| | 161 | PS> wsl -d RockyLinux9 |
| | 162 | }}} |
| | 163 | |
| | 164 | |
| | 165 | ==== 2.3.3. 설정 ==== |
| | 166 | 기본적으로 {{{--}}}import를 사용하는 경우 root 사용자로 항상 시작한다. |
| | 167 | |
| | 168 | 기본으로 로그인하는 사용자를 바꾸려면 다음과 같은 명령을 사용한다. |
| | 169 | {{{ |
| | 170 | PS> wsl --manage rockylinux10 --set-default-user root |
| | 171 | }}} |
| | 172 | |
| | 173 | 기본으로 로그인하는 사용자는 wheel 그룹에 포함시키는 것이 편하다. 그래야 sudo 명령을 자유롭게 쓸 수 있다. |
| | 174 | {{{ |
| | 175 | usermod -aG wheel yongwoo |
| | 176 | }}} |
| | 177 | |
| | 178 | === 2.4. 배포판 export === |
| | 179 | 커스터마이징한 배포판을 나중에 쓰기 위해 저장할 목적이라면 {{{--}}}export 명령을 쓴다. |
| | 180 | {{{ |
| | 181 | PS> wsl --export RockyLinux9 rockylinux.customized.tar.gz |
| | 182 | }}} |
| | 183 | |
| | 184 | === 2.5. 설치 후 주의사항 === |
| | 185 | WSL과 Hyper-V를 같이 설치한 경우에는 Hyper-V 관리자 > '가상 스위치 관리자'를 실행하면 WSL이라는 내부용 가상 스위치가 만들어져 있음을 알 수 있다. |
| | 186 | |
| | 187 | 가상 스위치 관리자에서 직접 만든 내부용 가상 스위치는 제어판 > 네트워크 및 인터넷 > '네트워크 연결'에 보면 vEthernet 이라는 네트워크 연결이 생성되지만, WSL을 설치해서 생성되는 WSL 가상 스위치는 제어판 > 네트워크 및 인터넷 > '네트워크 연결'에서 보이지 않는다는 차이점이 있다. |
| | 188 | |
| | 189 | 가상 스위치 관리자에서 WSL 가상 스위치를 제거하려거나 하면 제거도 제대로 되지 않고 WSL에서 네트워크도 작동하지 않으니 가만히 놔두자. |
| | 190 | |
| | 191 | WSL을 삭제하면 WSL 가상 스위치도 같이 삭제가 된다. |
| | 192 | |
| | 193 | |
| | 194 | == 3. 실행 및 활용 == |
| | 195 | === 3.1. 리눅스에서 === |
| | 196 | - 리눅스에서 윈도우 파일에 접근하려면 /mnt 디렉토리를 통해 접근하면 된다. C 드라이브는 /mnt/c 에 마운트되어 있다. |
| | 197 | - 리눅스에서 윈도우 명령을 실행하려면 {{{.exe}}}를 붙여주면 된다. 확장자가 exe가 아닌 배치 파일 등을 실행하려면 cmd.exe나 powershell.exe와 함께 실행해야 한다. |
| | 198 | - wsl 내에서 기계 학습에 GPU를 사용할 수 있다. |
| | 199 | |
| | 200 | === 3.2. 윈도우에서 === |
| | 201 | - 윈도우에서 리눅스 파일에 접근하려면 {{{\\wsl.localhost}}} 공유를 통해 접근하면 된다. |
| | 202 | - 윈도우에서 리눅스 명령을 실행하려면 wsl 을 앞에 붙여주면 된다. |
| | 203 | {{{ |
| | 204 | C:\temp> dir | wsl grep git |
| | 205 | }}} |
| | 206 | - 윈도우 11에서는 리눅스의 GUI 앱까지 실행할 수 있다. |
| | 207 | - Visual Studio Code에 원격 wsl 확장(remote development 확장을 설치해도 됨)을 설치하면 OS 차이에 대해 신경쓰지 않고 편집하고 실행할 수 있다. |
| | 208 | |
| | 209 | == 4. wsl 사용법 == |
| | 210 | |
| | 211 | - 리눅스 배포판을 특정 사용자로 실행하려면 다음과 같이 한다. |
| | 212 | {{{ |
| | 213 | wsl -u yongwoo |
| | 214 | }}} |
| | 215 | - 설치된 배포판에 대한 자세한 정보는 다음과 같이 조회한다. |
| | 216 | {{{ |
| | 217 | wsl -l -v |
| | 218 | }}} |
| | 219 | - 디폴트가 아닌 배포판을 실행하려면 다음과 같이 실행한다. |
| | 220 | {{{ |
| | 221 | wsl -d CentOS7 |
| | 222 | }}} |
| | 223 | - 배포판을 삭제하려면 다음과 같이 실행한다. |
| | 224 | {{{ |
| | 225 | wsl --unregister CentOS7 |
| | 226 | }}} |
| | 227 | |
| | 228 | - wsl 명령에 대한 도움말은 다음과 같다. |
| | 229 | {{{ |
| | 230 | 사용법: wsl.exe [Argument] [Options...] [CommandLine] |
| | 231 | |
| | 232 | Linux 이진 파일을 실행하기 위한 인수: |
| | 233 | |
| | 234 | 명령줄이 제공되지 않으면 wsl.exe는 기본 셸을 시작합니다. |
| | 235 | |
| | 236 | --exec, -e <CommandLine> |
| | 237 | 기본 Linux 셸을 사용하지 않고 지정된 명령을 실행합니다. |
| | 238 | |
| | 239 | --shell-type <standard|login|none> |
| | 240 | 제공된 셸 형식으로 지정된 명령을 실행합니다. |
| | 241 | |
| | 242 | -- |
| | 243 | 나머지 명령줄을 있는 그대로 전달합니다. |
| | 244 | |
| | 245 | 옵션: |
| | 246 | --cd <Directory> |
| | 247 | 지정된 디렉터리를 현재 작업 디렉터리로 설정합니다. |
| | 248 | ~가 사용되는 경우 Linux 사용자의 홈 경로가 사용됩니다. 경로가 시작되면 |
| | 249 | / 문자를 사용하면 절대 Linux 경로로 해석됩니다. |
| | 250 | 그렇지 않으면 값이 절대 Windows 경로여야 합니다. |
| | 251 | |
| | 252 | --distribution, -d <DistroName> |
| | 253 | 지정된 배포를 실행합니다. |
| | 254 | |
| | 255 | --distribution-id <DistroGuid> |
| | 256 | 지정된 배포 ID를 실행합니다. |
| | 257 | |
| | 258 | --user, -u <UserName> |
| | 259 | 지정된 사용자로 실행합니다. |
| | 260 | |
| | 261 | --system |
| | 262 | 시스템 배포에 대한 셸을 시작합니다. |
| | 263 | |
| | 264 | Linux용 Windows 하위 시스템을 관리하기 위한 인수: |
| | 265 | |
| | 266 | --help |
| | 267 | 사용 정보를 표시합니다. |
| | 268 | |
| | 269 | --debug-shell |
| | 270 | 진단을 위해 WSL2 디버그 셸을 엽니다. |
| | 271 | |
| | 272 | --install [Distro] [Options...] |
| | 273 | Linux 배포용 Windows 하위 시스템을 설치합니다. |
| | 274 | 유효한 배포 목록의 경우 'wsl.exe --list --online'을 사용합니다. |
| | 275 | |
| | 276 | 옵션: |
| | 277 | --enable-wsl1 |
| | 278 | WSL1 지원을 사용하도록 설정합니다. |
| | 279 | |
| | 280 | --fixed-vhd |
| | 281 | 배포를 저장할 고정 크기 디스크를 만듭니다. |
| | 282 | |
| | 283 | --from-file <Path> |
| | 284 | 로컬 파일에서 배포를 설치합니다. |
| | 285 | |
| | 286 | --legacy |
| | 287 | 레거시 배포 매니페스트를 사용합니다. |
| | 288 | |
| | 289 | --location <Location> |
| | 290 | 배포에 대한 설치 경로를 설정합니다. |
| | 291 | |
| | 292 | --name <Name> |
| | 293 | 배포의 이름을 설정합니다. |
| | 294 | |
| | 295 | --no-distribution |
| | 296 | 필요한 선택적 구성 요소만 설치하고 배포를 설치하지 않습니다. |
| | 297 | |
| | 298 | --no-launch, -n |
| | 299 | 설치 후 배포를 시작하지 마세요. |
| | 300 | |
| | 301 | --version <Version> |
| | 302 | 새 배포에 사용할 버전을 지정합니다. |
| | 303 | |
| | 304 | --vhd-size <MemoryString> |
| | 305 | 배포를 저장할 디스크의 크기를 지정합니다. |
| | 306 | |
| | 307 | --web-download |
| | 308 | Microsoft Store 대신 인터넷에서 배포를 다운로드합니다. |
| | 309 | |
| | 310 | --manage <Distro> <Options...> |
| | 311 | 배포판 관련 옵션을 변경합니다. |
| | 312 | |
| | 313 | 옵션: |
| | 314 | --move <Location> |
| | 315 | 배포를 새 위치로 이동합니다. |
| | 316 | |
| | 317 | --set-sparse, -s <true|false> |
| | 318 | 배포판의 vhdx를 스파스로 설정하여 디스크 공간을 자동으로 회수할 수 있도록 합니다. |
| | 319 | |
| | 320 | --set-default-user <Username> |
| | 321 | 배포의 기본 사용자를 설정합니다. |
| | 322 | |
| | 323 | --resize <MemoryString> |
| | 324 | 배포 디스크의 크기를 지정된 크기로 조정합니다. |
| | 325 | |
| | 326 | --mount <Disk> |
| | 327 | 모든 WSL 2 배포에서 실제 또는 가상 디스크를 연결하고 탑재합니다. |
| | 328 | |
| | 329 | 옵션: |
| | 330 | --vhd |
| | 331 | <디스크>가 가상 하드 디스크를 참조하도록 지정합니다. |
| | 332 | |
| | 333 | --bare |
| | 334 | 디스크를 WSL2에 연결하고 탑재하지는 마세요. |
| | 335 | |
| | 336 | --name <Name> |
| | 337 | 탑재 지점의 사용자 지정 이름을 사용하여 디스크를 탑재합니다. |
| | 338 | |
| | 339 | --type <Type> |
| | 340 | 디스크를 탑재할 때 사용할 파일 시스템이 지정되지 않은 경우 기본적으로 ext4입니다. |
| | 341 | |
| | 342 | --options <Options> |
| | 343 | 추가 탑재 옵션입니다. |
| | 344 | |
| | 345 | --partition <Index> |
| | 346 | 탑재할 파티션의 인덱스가 지정되지 않은 경우 기본값은 전체 디스크입니다. |
| | 347 | |
| | 348 | --set-default-version <Version> |
| | 349 | 새 배포에 대한 기본 설치 버전을 변경합니다. |
| | 350 | |
| | 351 | --shutdown |
| | 352 | 실행 중인 모든 배포와 WSL 2을 즉시 종료합니다. |
| | 353 | 경량 유틸리티 가상 머신입니다. |
| | 354 | |
| | 355 | --status |
| | 356 | Linux용 Windows 하위 시스템 상태를 표시합니다. |
| | 357 | |
| | 358 | --unmount [Disk] |
| | 359 | 모든 WSL2 배포에서 디스크를 해제하고 분리합니다. |
| | 360 | 인수 없이 호출되는 경우 모든 디스크를 해제하고 분리합니다. |
| | 361 | |
| | 362 | --uninstall |
| | 363 | 이 컴퓨터에서 Linux용 Windows 하위 시스템 패키지를 제거합니다. |
| | 364 | |
| | 365 | --update |
| | 366 | Linux용 Windows 하위 시스템 패키지를 업데이트합니다. |
| | 367 | |
| | 368 | 옵션: |
| | 369 | --pre-release |
| | 370 | 사용 가능한 경우 시험판 버전을 다운로드합니다. |
| | 371 | |
| | 372 | --version, -v |
| | 373 | 버전 정보를 표시합니다. |
| | 374 | |
| | 375 | Linux용 Windows 하위 시스템 배포를 관리하기 위한 인수: |
| | 376 | |
| | 377 | --export <Distro> <FileName> [Options] |
| | 378 | 배포를 tar 파일로 내보냅니다. |
| | 379 | 파일 이름은 - for stdout 일 수 있습니다. |
| | 380 | |
| | 381 | 옵션: |
| | 382 | --format <Format> |
| | 383 | 내보내기 형식을 지정합니다. 지원되는 값: tar, tar.gz, tar.xz, vhd. |
| | 384 | |
| | 385 | --import <Distro> <InstallLocation> <FileName> [Options] |
| | 386 | 지정된 tar 파일을 새 배포로 가져옵니다. |
| | 387 | 파일 이름은 - for stdin 일 수 있습니다. |
| | 388 | |
| | 389 | 옵션: |
| | 390 | --version <Version> |
| | 391 | 새 배포에 사용할 버전을 지정합니다. |
| | 392 | |
| | 393 | --vhd |
| | 394 | 제공된 파일이 tar 파일이 아닌 .vhdx 파일임을 지정합니다. |
| | 395 | 이 작업은 지정된 설치 위치에 .vhdx 파일의 복사본을 만듭니다. |
| | 396 | |
| | 397 | --import-in-place <Distro> <FileName> |
| | 398 | 지정된 .vhdx 파일을 새 배포판로 가져옵니다. |
| | 399 | 이 가상 하드 디스크는 ext4 파일 시스템 형식으로 포맷해야 합니다. |
| | 400 | |
| | 401 | --list, -l [Options] |
| | 402 | 배포를 나열합니다. |
| | 403 | |
| | 404 | 옵션: |
| | 405 | --all |
| | 406 | |
| | 407 | 배포를 포함하여 모든 배포를 나열합니다. |
| | 408 | 현재 설치 중이거나 제거되고 있습니다. |
| | 409 | |
| | 410 | --running |
| | 411 | 현재 실행 중인 배포만 나열합니다. |
| | 412 | |
| | 413 | --quiet, -q |
| | 414 | 배포 이름만 표시합니다. |
| | 415 | |
| | 416 | --verbose, -v |
| | 417 | 모든 배포에 대한 자세한 정보를 표시합니다. |
| | 418 | |
| | 419 | --online, -o |
| | 420 | 'wsl.exe --install'을 사용하여 설치에 사용할 수 있는 배포 목록을 표시합니다. |
| | 421 | |
| | 422 | --set-default, -s <Distro> |
| | 423 | 배포를 기본값으로 설정합니다. |
| | 424 | |
| | 425 | --set-version <Distro> <Version> |
| | 426 | 지정된 배포의 버전을 변경합니다. |
| | 427 | |
| | 428 | --terminate, -t <Distro> |
| | 429 | 지정된 배포를 종료합니다. |
| | 430 | |
| | 431 | --unregister <Distro> |
| | 432 | 배포를 등록 취소하고 루트 파일 시스템을 삭제합니다. |
| | 433 | }}} |
| | 434 | |
| | 435 | == 5. 데몬 실행 == |
| | 436 | 2023년 9월부터 WSL은 systemd를 지원한다. WSL init 프로세스 대신에 systemd를 사용하도록 구현한 것이 아니라 WSL init 프로세스가 systemd를 실행한다. |
| | 437 | |
| | 438 | 그러므로 systemd를 사용하도록 설정하면 부팅에 걸리는 시간이 기존에 비해 오래 걸린다. 따라서 데몬을 실행할 일이 없다면 굳이 systemd를 사용하도록 설정할 필요가 없다. |
| | 439 | |
| | 440 | 데몬을 실행시키기 위해서는 /etc/wsl.conf 파일에 다음 부분을 추가해서 systemd를 사용하도록 WSL을 설정해야 한다. |
| | 441 | {{{ |
| | 442 | [boot] |
| | 443 | systemd=true |
| | 444 | }}} |
| | 445 | |
| | 446 | 그 이후 {{{wsl --shutdown}}} 명령으로 모든 WSL 인스턴스를 새로 시작한다. |
| | 447 | |
| | 448 | == 6. 제한 사항 == |
| | 449 | - SELinux를 지원하지 않는다. |
| | 450 | - acl은 지원한다. 몇몇 배포판에서는 필요한 패키지를 설치해야 한다. |
| | 451 | - 네트웍은 윈도우에 의해 제어되므로 Network Manager를 사용하지 않는다. 따라서 네트웍을 바꾸는 명령 예를 들어 nmcli, nmtui 명령은 안된다. |
| | 452 | - rkhunter 명령도 이상하다. --propupd 옵션으로 실행하면 다음과 같은 메시지가 나온다. |
| | 453 | {{{ |
| | 454 | Invalid BINDIR configuration option: Invalid directory found: Files/JetBrains/PyCharm |
| | 455 | }}} |
| | 456 | |
| | 457 | === 6.1. 네트워킹과 관련한 제한 사항 === |
| | 458 | https://learn.microsoft.com/ko-kr/windows/wsl/networking |
| | 459 | |
| | 460 | 디폴트로 WSL은 NAT 기반 아키텍처를 사용한다. 따라서 WSL에서 데몬을 실행하면 윈도우에서 포트포워딩을 해줘야 WSL의 데몬에 접근할 수 있다. 하지만, WSL의 IP가 매번 바뀌므로 포트포워딩 작업이 상당히 까다로워진다. |
| | 461 | |
| | 462 | 따라서 미러된 네트워킹 모드를 사용하는 것이 좋다. 이 모드에서는 윈도우의 IP와 포트를 WSL이 그대로 사용하므로 포트포워딩과 같은 작업이 필요 없다. |
| | 463 | |
| | 464 | 미러된 네트워킹 모드는 다음과 같이 설정한다. |
| | 465 | |
| | 466 | wsl settings 앱 실행 > 네트워킹 |
| | 467 | - 네트워킹 모드 : Mirrored |
| | 468 | - 자동 프로시 사용: 켬 |
| | 469 | - DNS 터널링 사용: 켬 |
| | 470 | |
| | 471 | |
| | 472 | wsl settings 앱을 사용하지 않고 직접 설정할 수도 있다. {{{%UserProfile%}}} 디렉터리(일반적으로 {{{C:\Users\<UserName>\}}})에 .wslconfig 파일을 다음과 같이 생성하면 사용할 수 있다. |
| | 473 | {{{ |
| | 474 | [wsl2] |
| | 475 | networkingMode=mirrored |
| | 476 | dnsTunneling=true |
| | 477 | autoProxy=true |
| | 478 | }}} |
| | 479 | |
| | 480 | 미러된 네트워킹 모드를 사용하지 않고 디폴트 모드(NAT)를 사용할 때는 다음과 같은 제한 사항이 있다. |
| | 481 | - wsl의 IP가 항상 바뀐다. wsl의 IP는 다음과 같이 알 수 있다. |
| | 482 | {{{ |
| | 483 | PS> wsl hostname -I |
| | 484 | }}} |
| | 485 | - 로컬이 아닌 외부에서 wsl의 포트에 접근하려면 관리자 권한으로 다음과 같이 포트포워딩을 해야 한다. |
| | 486 | {{{ |
| | 487 | netsh interface portproxy add v4tov4 listenport=[로컬 포트] connectaddress=[wsl의 IP] connectport=[wsl의 포트] |
| | 488 | }}} |
| | 489 | * 포트포워딩 설정은 재부팅 후에도 적용되며, 설정을 삭제할 때는 아래의 명령어를 입력하여 삭제할 수 있다. |
| | 490 | {{{ |
| | 491 | netsh interface portproxy delete v4tov4 listenport=[로컬 포트] |
| | 492 | }}} |
| | 493 | * 포트포워딩과 포트프록시의 차이는 잘 모르겠다. 포트프록시가 reverse proxy를 의미하는 것 아닌가 한다. |
| | 494 | * **(주의)** 이렇게 포트프록시를 설정하면 HTTP 헤더 정보에 X-Forwarded-For도 없어서 클라이언트의 원래 IP를 알 방법이 없는 것 같다. 따라서 IP를 확인해서 처리하는 부분은 제대로 작동하지 않는다. |
| | 495 | |
| | 496 | - wsl의 IP가 항상 바뀌기 때문에 고정적으로 접근하기 위해서는 다음과 같이 파워셀 스크립트(확장자 .ps1)를 작성하고 powershell.exe -File "C:\path\filename.ps1" 처럼 실행한다. alias로 지정해놓는 것이 편하다. |
| | 497 | {{{ |
| | 498 | # WSL2로 포트포워딩하는 스크립트 |
| | 499 | |
| | 500 | # wsl 내에서 실행할 때는 powershell.exe -File "C:\path\filename.ps1" 처럼 실행해야 한다. |
| | 501 | # wsl을 exit로 빠져나온 후에 이 스크립트를 실행하면 다시 원래 wsl 환경으로 되돌아갈 수 없기 때문이다. |
| | 502 | |
| | 503 | # WSL2 network port forwarding script v1 |
| | 504 | # for enable script, 'Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser' in Powershell, |
| | 505 | # for delete exist rules and ports use 'delete' as parameter, for show ports use 'list' as parameter. |
| | 506 | # written by Daehyuk Ahn, Aug-1-2020 |
| | 507 | |
| | 508 | # Display all portproxy information |
| | 509 | If ($Args[0] -eq "list") { |
| | 510 | netsh interface portproxy show v4tov4; |
| | 511 | exit; |
| | 512 | } |
| | 513 | |
| | 514 | # If elevation needed, start new process |
| | 515 | If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) |
| | 516 | { |
| | 517 | # Relaunch as an elevated process: |
| | 518 | Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"$Args runas" -Verb RunAs |
| | 519 | exit |
| | 520 | } |
| | 521 | |
| | 522 | # You should modify '$Ports' for your applications |
| | 523 | # sshd : ssh(22) |
| | 524 | # ngnix : http (80), https (443) |
| | 525 | # MariaDB : 3306 |
| | 526 | # redis : 6379 |
| | 527 | # RabbitMQ : epmd (4369), amqp (5672), rabbitmq_management (15672), clustering (25672) |
| | 528 | $Ports = (22,80,443,3306, 6379, 4369,5672,15672,25672) |
| | 529 | |
| | 530 | # Check WSL ip address |
| | 531 | wsl hostname -I | Set-Variable -Name "WSL" |
| | 532 | $found = $WSL -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; |
| | 533 | if (-not $found) { |
| | 534 | echo "WSL2 cannot be found. Terminate script."; |
| | 535 | exit; |
| | 536 | } |
| | 537 | |
| | 538 | # Remove and Create NetFireWallRule |
| | 539 | Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'; |
| | 540 | if ($Args[0] -ne "delete") { |
| | 541 | New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $Ports -Action Allow -Protocol TCP; |
| | 542 | New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $Ports -Action Allow -Protocol TCP; |
| | 543 | } |
| | 544 | |
| | 545 | # Add each port into portproxy |
| | 546 | $Addr = "0.0.0.0" |
| | 547 | Foreach ($Port in $Ports) { |
| | 548 | iex "netsh interface portproxy delete v4tov4 listenaddress=$Addr listenport=$Port | Out-Null"; |
| | 549 | if ($Args[0] -ne "delete") { |
| | 550 | iex "netsh interface portproxy add v4tov4 listenaddress=$Addr listenport=$Port connectaddress=$WSL connectport=$Port | Out-Null"; |
| | 551 | } |
| | 552 | } |
| | 553 | |
| | 554 | # Display all portproxy information |
| | 555 | netsh interface portproxy show v4tov4; |
| | 556 | |
| | 557 | # Give user to chance to see above list when relaunched start |
| | 558 | If ($Args[0] -eq "runas" -Or $Args[1] -eq "runas") { |
| | 559 | Write-Host -NoNewLine 'Press any key to close! '; |
| | 560 | $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); |
| | 561 | } |
| | 562 | |
| | 563 | }}} |
| | 564 | * 다음과 같은 에러가 나온다면 스크립트 실행 권한이 없는 것이다. |
| | 565 | {{{ |
| | 566 | 이 시스템에서 스크립트를 실행할 수 없으므로 PS1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오. |
| | 567 | }}} |
| | 568 | * 스크립트 실행 권한을 줄 때는 [https://go.microsoft.com/fwlink/?LinkID=135170 about_Execution_Policies]를 참고해 관리자 권한으로 다음과 같이 한다. |
| | 569 | {{{ |
| | 570 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine |
| | 571 | }}} |
| | 572 | |
| | 573 | - wsl로 포트포워딩하기 위해서는 방화벽에도 추가해줘야 한다. 아래는 로컬에서 wsl로 접근할 때의 방화벽 설정이다. 로컬이 아닌 외부에서 wsl로 접근할 때는 아래와 별개로 또 방화벽 설정을 해야 한다. |
| | 574 | {{{ |
| | 575 | PS> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -LocalAddress 172.16.0.0/12 -Action Allow |
| | 576 | }}} |
| | 577 | |
| | 578 | ---- |
| | 579 | [WikiStart 처음으로] |