[[PageOutline]] = Windows Subsystem for Linux 2 (WSL 2) = https://docs.microsoft.com/ko-kr/windows/wsl/ WSL은 실제 리눅스 커널 + 독자적인 init 프로세스 두 가지가 합쳐진 것이라 이해하면 편하다. WSL init 프로세스는 리눅스의 init 프로세스가 하는 기능 외에 추가로 리눅스와 윈도우 구성 요소 간의 통신을 위한 인프라를 제공하는 역할을 담당한다. WSL은 실제 리눅스 커널을 사용했기 때문에 호환성 문제 없이 대부분의 리눅스 프로그램을 Windows에서 직접 실행할 수 있다. 그리고, WSL 2는 윈도우와 격리되어 있지 않아 윈도우에서 리눅스 파일을 실행하거나 접근할 수 있고, 리눅스에서 윈도우의 파일을 실행하거나 접근할 수 있다. 완전한 기능의 리눅스가 필요하다면 기존 VM을 이용해야 한다. 기존 VM 환경은 완전한 리눅스 환경을 제공하는 대신 부팅의 전 과정을 거치므로 부팅 속도가 느리고, 윈도우와 격리되어 있으며, 많은 리소스를 사용한다. 반면에 WSL은 기존 VM 환경보다 리소스도 훨씬 적게 사용하고 빠르게 리눅스 프로그램을 실행할 수 있다. 각종 데몬을 실행하려면 systemd를 사용하도록 WSL을 설정해야 한다. WSL init 프로세스가 systemd를 실행하는 오버헤드가 있기 때문에 기존보다 부팅에 걸리는 속도는 느려진다. - 부팅 속도: 아무런 데몬도 실행하지 않는 기본 WSL > systemd를 사용하도록 설정한 WSL > VM 그외 차이점으로는 다음과 같은 것을 들 수 있다. 1. Windows 프로세스에 대한 열린 파일 핸들이 없는 경우, WSL이 자동으로 종료된다. 즉, 웹 서버를 종료하는 경우, WSL은 사용자가 사용을 완료하고 리소스를 정리한다는 것을 감지하기 때문에 WSL이 종료될 수 있다. 1. WSL 사용자는 모든 권한을 갖는다. 등록된 WSL 배포 등은 모두 사용자가 접근할 수 있으며 수정할 수 있다. 1. WSL은 윈도우 파일에 대한 파일 액세스 권한을 자동으로 제공한다. 1. Windows 경로는 기본적으로 경로에 추가되어 기존 Linux 환경에 비해 특정 Linux 애플리케이션에 대해 예기치 않은 동작이 발생할 수 있다. 예) rkhunter 1. WSL은 Windows 실행 파일을 실행할 수 있다. 1. WSL에서 사용하는 커널은 자동으로 업데이트된다. 1. WSL의 GPU 액세스는 GPU 호출을 Windows GPU로 라우팅하는 /dev/dxg 디바이스를 이용한다. 이 설정은 기존 VM과 다르다. == 1. 설치 조건== 1. 윈도우 10이나 윈도우 11이어야 한다. - 윈도우 10에서는 최신 버전으로 업데이트하면 가능하다. 1. 시스템 아키텍처가 64비트여야 한다. - 32비트 아키텍처에서는 사용할 수 없다. 1. 바이오스에서 가상화가 가능하도록 설정을 해야 한다. - 바이오스에서 가상화가 가능하게끔 설정되어 있는지 여부는 작업 관리자 > '성능' 탭 > 'CPU' 항목에서 '가상화'가 '사용'으로 나오는지 보면 된다. - 가상화 설정이 되어 있지 않다면 바이오스에서 설정해주자. == 2. 설치 == === 2.1. WSL 설치 === 1. ~~'Linux용 Windows 하위시스템' 사용 가능하게 변경~~ - ~~제어판 > 프로그램 제거 또는 변경(또는 '프로그램 및 기능') > Windows 기능 켜기/끄기 > 'Linux용 Windows 하위시스템'을 체크해도 되고 Powershell을 관리자 권한으로 실행해서 다음과 같이 실행해도 된다.~~ {{{ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart }}} 2. ~~'가상 머신 플랫폼' 사용 가능하게 변경~~ - ~~제어판 > 프로그램 제거 또는 변경(또는 '프로그램 및 기능') > Windows 기능 켜기/끄기 > '가상 머신 플랫폼'을 체크해도 되고 Powershell을 관리자 권한으로 실행해서 다음과 같이 실행해도 된다.~~ {{{ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart }}} - ~~이 다음에는 재부팅을 해서 가상 머신 플랫폼 설치를 마무리지어야 한다.~~ 3. ~~Windows Update 실행~~ - ~~Linux 커널 업데이트를 위해 필요하다. 이 과정을 거치지 않으면 배포판을 설치할 때 다음과 같은 에러가 발생한다.~~ {{{ WSL 2에 커널 구성 요소 업데이트가 필요합니다. 자세한 내용은 https://aka.ms/wsl2kernel을 참조하십시오. }}} 4. ~~Linux 커널 업데이트~~ - ~~[https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지] 다운로드받고 실행~~ - ~~이 절차는 더 이상 필요하지 않았다. ~~ 5. ~~WSL 2를 기본 버전으로 설정~~ - ~~Powershell을 관리자 권한으로 실행해서 다음과 같이 실행한다.~~ {{{ wsl --set-default-version 2 }}} - ~~이 절차는 더 이상 필요하지 않았다. ~~ 관리자 모드에서 {{{PowerShell}}} 또는 Windows 명령 프롬프트를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하여 열고 {{{wsl --install}}} 명령을 입력한 다음 컴퓨터를 다시 시작한다. === 2.2. 지원하는 배포판 설치 === 온라인 스토어에서 다운로드할 수 있는 배포판 목록은 wsl -l -o 명령으로 볼 수 있다. 이 중에서 하나를 골라 다음과 같이 간단하게 설치할 수 있다. {{{ wsl --install -d Ubuntu }}} === 2.3. 지원하지 않는 배포판 설치 === [https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/ Import Rocky Linux to WSL] CentOS, {{{RockyLinux}}} 처럼 현재 wsl에서 지원하지 않는 배포판이라 할지라도 설치가 가능하다. ==== 2.3.1. 배포판 wsl 이미지 파일로 설치 ==== 배포판 홈페이지 등에서 wsl용 이미지 파일을 제공해주는 경우에는 그걸 다운로드받아서 사용하는 것이 편하다. 1. 배포판 wsl 이미지 파일을 원하는 위치에 저장한다. 여기 예에서는 D:\Downloads\wslDistroStorage\Rocky-10-WSL-Base.latest.x86_64.wsl" 1. PowerShell을 열고 배포판을 저장 하려는 위치에 폴더를 만든다. {{{ PS> mkdir F:\Downloads\wslDistroStorage\RockyLinux10 }}} 1. wsl {{{--}}}install {{{--}}}from-file [배포판 wsl 이미지 파일] {{{--}}}name [배포판 이름] 명령으로 wsl 파일을 설치한다. {{{ PS> wsl --install --from-file "D:\Downloads\wslDistroStorage\Rocky-10-WSL-Base.latest.x86_64.wsl" --name RockyLinux10 }}} 1. wsl {{{--}}}manage [배포판 이름] {{{--}}}move [배포판 저장 경로] 명령으로 설치 위치를 원하는 곳으로 옮긴다. {{{ PS> wsl --manage RockyLinux10 --move "D:\Downloads\wslDistroStorage\RockyLinux10" }}} 1. 설치한 배포판을 확인한다. {{{ PS> wsl -l -v }}} 1. 배포판을 실행한다. {{{ PS> wsl -d RockyLinux10 }}} ==== 2.3.2. 배포판 tar 파일로 설치 ==== ===== 2.3.2.1 배포판 tar 파일 다운로드 ===== 먼저 배포판 tar 파일을 찾는다. {{{RockyLinux}}}는 https://docs.rockylinux.org/pt-BR/guides/interoperability/import_rocky_to_wsl/ 에서 다운로드받는 것이 편하다. 배포판 tar 파일을 찾기 힘들다면 Docker Hub나 Quay.io에서 받는 것이 낫다. 이를 위해서는 먼저 podman이나 docker가 설치된 시스템이 있어야 한다. wsl에 디폴트로 설치되는 Ubuntu에 podman이나 docker를 설치해도 된다. 1. 배포판 이미지를 찾는다. {{{ podman search rockylinux }}} - Rocky Linux의 Docker Official Image는 다음 URL에서 정보를 찾으면 된다. https://hub.docker.com/_/rockylinux 2. 이미지를 실행한다. {{{ podman run -t docker.io/library/rockylinux:9 ls / }}} 3. 컨테이너 ID를 확인한다. {{{ podman ps -a }}} 4. 컨테이너 ID를 tar 파일로 내보낸다. wsl에서 작업하는 것이라면 바로 윈도우 파일시스템에 저장하는 것이 편하다. 예를 들어 /mnt/c/temp/rockylinux.tar {{{ podman export [컨테이너 ID] > /path/to/rockylinux.tar.gz }}} ===== 2.3.2.2. wsl로 tar 파일 가져오기 ===== 배포판 tar 파일을 찾았다면 그 다음 단계로 tar 파일을 wsl로 가져온다. 1. 배포판 tar 파일을 원하는 위치에 저장한다. 여기 예에서는 C:\temp\rockylinux.tar 1. PowerShell을 열고 배포판을 저장 하려는 위치에 폴더를 만든다. {{{ PS> mkdir F:\Downloads\wslDistroStorage\RockyLinux9 }}} 1. wsl {{{--}}}import [배포판 이름] [배포판 저장 경로] [배포판 tar 파일] 명령으로 tar 파일을 가져온다. {{{ PS> wsl --import RockyLinux9 D:\Downloads\wslDistroStorage\RockyLinux9\ C:\temp\rockylinux.tar }}} 1. 설치한 배포판을 확인한다. {{{ PS> wsl -l -v }}} 1. 배포판을 실행한다. {{{ PS> wsl -d RockyLinux9 }}} ==== 2.3.3. 설정 ==== 기본적으로 {{{--}}}import를 사용하는 경우 root 사용자로 항상 시작한다. 기본으로 로그인하는 사용자를 바꾸려면 다음과 같은 명령을 사용한다. {{{ PS> wsl --manage rockylinux10 --set-default-user root }}} 기본으로 로그인하는 사용자는 wheel 그룹에 포함시키는 것이 편하다. 그래야 sudo 명령을 자유롭게 쓸 수 있다. {{{ usermod -aG wheel yongwoo }}} === 2.4. 배포판 export === 커스터마이징한 배포판을 나중에 쓰기 위해 저장할 목적이라면 {{{--}}}export 명령을 쓴다. {{{ PS> wsl --export RockyLinux9 rockylinux.customized.tar.gz }}} === 2.5. 설치 후 주의사항 === WSL과 Hyper-V를 같이 설치한 경우에는 Hyper-V 관리자 > '가상 스위치 관리자'를 실행하면 WSL이라는 내부용 가상 스위치가 만들어져 있음을 알 수 있다. 가상 스위치 관리자에서 직접 만든 내부용 가상 스위치는 제어판 > 네트워크 및 인터넷 > '네트워크 연결'에 보면 vEthernet 이라는 네트워크 연결이 생성되지만, WSL을 설치해서 생성되는 WSL 가상 스위치는 제어판 > 네트워크 및 인터넷 > '네트워크 연결'에서 보이지 않는다는 차이점이 있다. 가상 스위치 관리자에서 WSL 가상 스위치를 제거하려거나 하면 제거도 제대로 되지 않고 WSL에서 네트워크도 작동하지 않으니 가만히 놔두자. WSL을 삭제하면 WSL 가상 스위치도 같이 삭제가 된다. == 3. 실행 및 활용 == === 3.1. 리눅스에서 === - 리눅스에서 윈도우 파일에 접근하려면 /mnt 디렉토리를 통해 접근하면 된다. C 드라이브는 /mnt/c 에 마운트되어 있다. - 리눅스에서 윈도우 명령을 실행하려면 {{{.exe}}}를 붙여주면 된다. 확장자가 exe가 아닌 배치 파일 등을 실행하려면 cmd.exe나 powershell.exe와 함께 실행해야 한다. - wsl 내에서 기계 학습에 GPU를 사용할 수 있다. === 3.2. 윈도우에서 === - 윈도우에서 리눅스 파일에 접근하려면 {{{\\wsl.localhost}}} 공유를 통해 접근하면 된다. - 윈도우에서 리눅스 명령을 실행하려면 wsl 을 앞에 붙여주면 된다. {{{ C:\temp> dir | wsl grep git }}} - 윈도우 11에서는 리눅스의 GUI 앱까지 실행할 수 있다. - Visual Studio Code에 원격 wsl 확장(remote development 확장을 설치해도 됨)을 설치하면 OS 차이에 대해 신경쓰지 않고 편집하고 실행할 수 있다. == 4. wsl 사용법 == - 리눅스 배포판을 특정 사용자로 실행하려면 다음과 같이 한다. {{{ wsl -u yongwoo }}} - 설치된 배포판에 대한 자세한 정보는 다음과 같이 조회한다. {{{ wsl -l -v }}} - 디폴트가 아닌 배포판을 실행하려면 다음과 같이 실행한다. {{{ wsl -d CentOS7 }}} - 배포판을 삭제하려면 다음과 같이 실행한다. {{{ wsl --unregister CentOS7 }}} - wsl 명령에 대한 도움말은 다음과 같다. {{{ 사용법: wsl.exe [Argument] [Options...] [CommandLine] Linux 이진 파일을 실행하기 위한 인수: 명령줄이 제공되지 않으면 wsl.exe는 기본 셸을 시작합니다. --exec, -e 기본 Linux 셸을 사용하지 않고 지정된 명령을 실행합니다. --shell-type 제공된 셸 형식으로 지정된 명령을 실행합니다. -- 나머지 명령줄을 있는 그대로 전달합니다. 옵션: --cd 지정된 디렉터리를 현재 작업 디렉터리로 설정합니다. ~가 사용되는 경우 Linux 사용자의 홈 경로가 사용됩니다. 경로가 시작되면 / 문자를 사용하면 절대 Linux 경로로 해석됩니다. 그렇지 않으면 값이 절대 Windows 경로여야 합니다. --distribution, -d 지정된 배포를 실행합니다. --distribution-id 지정된 배포 ID를 실행합니다. --user, -u 지정된 사용자로 실행합니다. --system 시스템 배포에 대한 셸을 시작합니다. Linux용 Windows 하위 시스템을 관리하기 위한 인수: --help 사용 정보를 표시합니다. --debug-shell 진단을 위해 WSL2 디버그 셸을 엽니다. --install [Distro] [Options...] Linux 배포용 Windows 하위 시스템을 설치합니다. 유효한 배포 목록의 경우 'wsl.exe --list --online'을 사용합니다. 옵션: --enable-wsl1 WSL1 지원을 사용하도록 설정합니다. --fixed-vhd 배포를 저장할 고정 크기 디스크를 만듭니다. --from-file 로컬 파일에서 배포를 설치합니다. --legacy 레거시 배포 매니페스트를 사용합니다. --location 배포에 대한 설치 경로를 설정합니다. --name 배포의 이름을 설정합니다. --no-distribution 필요한 선택적 구성 요소만 설치하고 배포를 설치하지 않습니다. --no-launch, -n 설치 후 배포를 시작하지 마세요. --version 새 배포에 사용할 버전을 지정합니다. --vhd-size 배포를 저장할 디스크의 크기를 지정합니다. --web-download Microsoft Store 대신 인터넷에서 배포를 다운로드합니다. --manage 배포판 관련 옵션을 변경합니다. 옵션: --move 배포를 새 위치로 이동합니다. --set-sparse, -s 배포판의 vhdx를 스파스로 설정하여 디스크 공간을 자동으로 회수할 수 있도록 합니다. --set-default-user 배포의 기본 사용자를 설정합니다. --resize 배포 디스크의 크기를 지정된 크기로 조정합니다. --mount 모든 WSL 2 배포에서 실제 또는 가상 디스크를 연결하고 탑재합니다. 옵션: --vhd <디스크>가 가상 하드 디스크를 참조하도록 지정합니다. --bare 디스크를 WSL2에 연결하고 탑재하지는 마세요. --name 탑재 지점의 사용자 지정 이름을 사용하여 디스크를 탑재합니다. --type 디스크를 탑재할 때 사용할 파일 시스템이 지정되지 않은 경우 기본적으로 ext4입니다. --options 추가 탑재 옵션입니다. --partition 탑재할 파티션의 인덱스가 지정되지 않은 경우 기본값은 전체 디스크입니다. --set-default-version 새 배포에 대한 기본 설치 버전을 변경합니다. --shutdown 실행 중인 모든 배포와 WSL 2을 즉시 종료합니다. 경량 유틸리티 가상 머신입니다. --status Linux용 Windows 하위 시스템 상태를 표시합니다. --unmount [Disk] 모든 WSL2 배포에서 디스크를 해제하고 분리합니다. 인수 없이 호출되는 경우 모든 디스크를 해제하고 분리합니다. --uninstall 이 컴퓨터에서 Linux용 Windows 하위 시스템 패키지를 제거합니다. --update Linux용 Windows 하위 시스템 패키지를 업데이트합니다. 옵션: --pre-release 사용 가능한 경우 시험판 버전을 다운로드합니다. --version, -v 버전 정보를 표시합니다. Linux용 Windows 하위 시스템 배포를 관리하기 위한 인수: --export [Options] 배포를 tar 파일로 내보냅니다. 파일 이름은 - for stdout 일 수 있습니다. 옵션: --format 내보내기 형식을 지정합니다. 지원되는 값: tar, tar.gz, tar.xz, vhd. --import [Options] 지정된 tar 파일을 새 배포로 가져옵니다. 파일 이름은 - for stdin 일 수 있습니다. 옵션: --version 새 배포에 사용할 버전을 지정합니다. --vhd 제공된 파일이 tar 파일이 아닌 .vhdx 파일임을 지정합니다. 이 작업은 지정된 설치 위치에 .vhdx 파일의 복사본을 만듭니다. --import-in-place 지정된 .vhdx 파일을 새 배포판로 가져옵니다. 이 가상 하드 디스크는 ext4 파일 시스템 형식으로 포맷해야 합니다. --list, -l [Options] 배포를 나열합니다. 옵션: --all 배포를 포함하여 모든 배포를 나열합니다. 현재 설치 중이거나 제거되고 있습니다. --running 현재 실행 중인 배포만 나열합니다. --quiet, -q 배포 이름만 표시합니다. --verbose, -v 모든 배포에 대한 자세한 정보를 표시합니다. --online, -o 'wsl.exe --install'을 사용하여 설치에 사용할 수 있는 배포 목록을 표시합니다. --set-default, -s 배포를 기본값으로 설정합니다. --set-version 지정된 배포의 버전을 변경합니다. --terminate, -t 지정된 배포를 종료합니다. --unregister 배포를 등록 취소하고 루트 파일 시스템을 삭제합니다. }}} == 5. 데몬 실행 == 2023년 9월부터 WSL은 systemd를 지원한다. WSL init 프로세스 대신에 systemd를 사용하도록 구현한 것이 아니라 WSL init 프로세스가 systemd를 실행한다. 그러므로 systemd를 사용하도록 설정하면 부팅에 걸리는 시간이 기존에 비해 오래 걸린다. 따라서 데몬을 실행할 일이 없다면 굳이 systemd를 사용하도록 설정할 필요가 없다. 데몬을 실행시키기 위해서는 /etc/wsl.conf 파일에 다음 부분을 추가해서 systemd를 사용하도록 WSL을 설정해야 한다. {{{ [boot] systemd=true }}} 그 이후 {{{wsl --shutdown}}} 명령으로 모든 WSL 인스턴스를 새로 시작한다. == 6. 제한 사항 == - SELinux를 지원하지 않는다. - acl은 지원한다. 몇몇 배포판에서는 필요한 패키지를 설치해야 한다. - 네트웍은 윈도우에 의해 제어되므로 Network Manager를 사용하지 않는다. 따라서 네트웍을 바꾸는 명령 예를 들어 nmcli, nmtui 명령은 안된다. - rkhunter 명령도 이상하다. --propupd 옵션으로 실행하면 다음과 같은 메시지가 나온다. {{{ Invalid BINDIR configuration option: Invalid directory found: Files/JetBrains/PyCharm }}} === 6.1. 네트워킹과 관련한 제한 사항 === https://learn.microsoft.com/ko-kr/windows/wsl/networking 디폴트로 WSL은 NAT 기반 아키텍처를 사용한다. 따라서 WSL에서 데몬을 실행하면 윈도우에서 포트포워딩을 해줘야 WSL의 데몬에 접근할 수 있다. 하지만, WSL의 IP가 매번 바뀌므로 포트포워딩 작업이 상당히 까다로워진다. 따라서 미러된 네트워킹 모드를 사용하는 것이 좋다. 이 모드에서는 윈도우의 IP와 포트를 WSL이 그대로 사용하므로 포트포워딩과 같은 작업이 필요 없다. 미러된 네트워킹 모드는 다음과 같이 설정한다. wsl settings 앱 실행 > 네트워킹 - 네트워킹 모드 : Mirrored - 자동 프로시 사용: 켬 - DNS 터널링 사용: 켬 wsl settings 앱을 사용하지 않고 직접 설정할 수도 있다. {{{%UserProfile%}}} 디렉터리(일반적으로 {{{C:\Users\\}}})에 .wslconfig 파일을 다음과 같이 생성하면 사용할 수 있다. {{{ [wsl2] networkingMode=mirrored dnsTunneling=true autoProxy=true }}} 미러된 네트워킹 모드를 사용하지 않고 디폴트 모드(NAT)를 사용할 때는 다음과 같은 제한 사항이 있다. - wsl의 IP가 항상 바뀐다. wsl의 IP는 다음과 같이 알 수 있다. {{{ PS> wsl hostname -I }}} - 로컬이 아닌 외부에서 wsl의 포트에 접근하려면 관리자 권한으로 다음과 같이 포트포워딩을 해야 한다. {{{ netsh interface portproxy add v4tov4 listenport=[로컬 포트] connectaddress=[wsl의 IP] connectport=[wsl의 포트] }}} * 포트포워딩 설정은 재부팅 후에도 적용되며, 설정을 삭제할 때는 아래의 명령어를 입력하여 삭제할 수 있다. {{{ netsh interface portproxy delete v4tov4 listenport=[로컬 포트] }}} * 포트포워딩과 포트프록시의 차이는 잘 모르겠다. 포트프록시가 reverse proxy를 의미하는 것 아닌가 한다. * **(주의)** 이렇게 포트프록시를 설정하면 HTTP 헤더 정보에 X-Forwarded-For도 없어서 클라이언트의 원래 IP를 알 방법이 없는 것 같다. 따라서 IP를 확인해서 처리하는 부분은 제대로 작동하지 않는다. - wsl의 IP가 항상 바뀌기 때문에 고정적으로 접근하기 위해서는 다음과 같이 파워셀 스크립트(확장자 .ps1)를 작성하고 powershell.exe -File "C:\path\filename.ps1" 처럼 실행한다. alias로 지정해놓는 것이 편하다. {{{ # WSL2로 포트포워딩하는 스크립트 # wsl 내에서 실행할 때는 powershell.exe -File "C:\path\filename.ps1" 처럼 실행해야 한다. # wsl을 exit로 빠져나온 후에 이 스크립트를 실행하면 다시 원래 wsl 환경으로 되돌아갈 수 없기 때문이다. # WSL2 network port forwarding script v1 # for enable script, 'Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser' in Powershell, # for delete exist rules and ports use 'delete' as parameter, for show ports use 'list' as parameter. # written by Daehyuk Ahn, Aug-1-2020 # Display all portproxy information If ($Args[0] -eq "list") { netsh interface portproxy show v4tov4; exit; } # If elevation needed, start new process If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # Relaunch as an elevated process: Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"$Args runas" -Verb RunAs exit } # You should modify '$Ports' for your applications # sshd : ssh(22) # ngnix : http (80), https (443) # MariaDB : 3306 # redis : 6379 # RabbitMQ : epmd (4369), amqp (5672), rabbitmq_management (15672), clustering (25672) $Ports = (22,80,443,3306, 6379, 4369,5672,15672,25672) # Check WSL ip address wsl hostname -I | Set-Variable -Name "WSL" $found = $WSL -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; if (-not $found) { echo "WSL2 cannot be found. Terminate script."; exit; } # Remove and Create NetFireWallRule Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'; if ($Args[0] -ne "delete") { New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $Ports -Action Allow -Protocol TCP; New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $Ports -Action Allow -Protocol TCP; } # Add each port into portproxy $Addr = "0.0.0.0" Foreach ($Port in $Ports) { iex "netsh interface portproxy delete v4tov4 listenaddress=$Addr listenport=$Port | Out-Null"; if ($Args[0] -ne "delete") { iex "netsh interface portproxy add v4tov4 listenaddress=$Addr listenport=$Port connectaddress=$WSL connectport=$Port | Out-Null"; } } # Display all portproxy information netsh interface portproxy show v4tov4; # Give user to chance to see above list when relaunched start If ($Args[0] -eq "runas" -Or $Args[1] -eq "runas") { Write-Host -NoNewLine 'Press any key to close! '; $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); } }}} * 다음과 같은 에러가 나온다면 스크립트 실행 권한이 없는 것이다. {{{ 이 시스템에서 스크립트를 실행할 수 없으므로 PS1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오. }}} * 스크립트 실행 권한을 줄 때는 [https://go.microsoft.com/fwlink/?LinkID=135170 about_Execution_Policies]를 참고해 관리자 권한으로 다음과 같이 한다. {{{ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine }}} - wsl로 포트포워딩하기 위해서는 방화벽에도 추가해줘야 한다. 아래는 로컬에서 wsl로 접근할 때의 방화벽 설정이다. 로컬이 아닌 외부에서 wsl로 접근할 때는 아래와 별개로 또 방화벽 설정을 해야 한다. {{{ PS> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -LocalAddress 172.16.0.0/12 -Action Allow }}} ---- [WikiStart 처음으로]