Window Host에서 WSL 서비스로 port forward 사용

윈도우에서 WSL2 사이에 port forward 를 통해서 WSL에서 사용중인 서비스에 접속하고 사용할 수 있다.

  • 원격에서 WSL2에 SSH서비스로 접근하고자 할 때
  • 원격에서 WSL2에 서비로 동작하는 django 등 서비스에 접근하고자 할 때

WSL2 에 포트 포워드

초기 WSL2 버전까지만 해도 WSl2의 IP로 직접 포트 포워딩을 하거나 VM의 IP를 변경해 사용하는데 왜그런지 최신 WSL2 의 VM IP 는 호스트의 네트워크 인터페이스에서 게스트 머신 WSL2의 IP 네트워크가 확인이 안된다.

예를 들어 윈도우의 ipconfig로 아래 처럼 가상머신 어뎁터가 나오지만 IP network 이 다르다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

이더넷 어댑터 vEthernet (Default Switch):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:c23a:366b:1078%47
IPv4 주소 . . . . . . . . . : 192.168.160.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

이더넷 어댑터 vEthernet (WSL (Hyper-V firewall)):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:2b1a:9d22:efc5%55
IPv4 주소 . . . . . . . . . : 172.18.80.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

WSL2의 게스트 머신과 윈도우 호스트 머신 사이의 라우팅을 담당하는 어뎁터가 172.18.80.1 이 WSL의 라우팅 포인트 같은데 실재 wsl 의 IP 는 다음 같이 나온다.

1
2
> wsl hostname -I
172.18.82.228

즉 호스트의 라우팅 테이블에서 알 수 없는 네트워크로 정의된다. 그래서 윈도우에서 직접 게스트 머신으로 라우팅이 안된다. 포트 포워딩시 WSL 게스트 머신의 IP를 직접 사용이 어렵다는 의미다.

게스트머신 IP로 ssh 접근은 된다. 그런데 port forwarding 에선 잘 안된다. 그런데 localhost 는 직접 게스트 머신의 포트에 접근이 가능하다. 그래서 localhost 를 사용하면 된다.

포트 포워드 스크립트

.ps1 파일에 아래 스크립트를 작성한다. WSL2 의 IP에 대해서,

  • 줄막음 처리한 것은 이전에 사용했던 방식이다. (어떤 버전인진 모르겠다)
  • 127.0.0.1 혹은 localhost 를 사용하면 된다.

스크립트

-

1
2
3
4
5
6
7
8
9
10
11
# `start_wsl2_portforward.ps1` 파일
$script = {
# netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=(wsl hostname -I)
# netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=(wsl hostname -I)
# portforward for Router
netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=127.0.0.1
netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=127.0.0.1
netsh advfirewall firewall add rule name="TCP/5000" protocol=TCP dir=in localport=5555 action=allow
netsh advfirewall firewall add rule name="TCP/2000" protocol=TCP dir=in localport=2222 action=allow
}
Start-Process -FilePath powershell.exe -ArgumentList "-Command & {$script run}" -verb RunAs

윈도우를 시작하고 Powershell 에서 이 스크립트를 실행하면 관리자 모드 허용을 받아 포트 포워드와 방화벽이 모두 업데이트 된다.

1
2
3
4
> start_wsl2_portforward.ps1

확인됨...

호스트의 포트 포워드 구성을 확인.

1
2
3
4
5
6
7
8
PS C:\Users\daddy> netsh interface portproxy show v4tov4

ipv4 수신 대기: ipv4에 연결:

주소 포트 주소 포트
--------------- ---------- --------------- ----------
0.0.0.0 2000 127.0.0.1 2222
0.0.0.0 5000 127.0.0.1 5555

호스트의 방화벽을 확인

1
> netsh advfirewall firewall show rule name="TCP/8686"

포워드 / 방화벽 구성 삭제

포드워와 방화벽을 삭제할 수 있다.

1
2
3
4
5
# 포트 포워드 삭제
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

# 방화벽 삭제
netsh advfirewall firewall delete rule name="TCP/5000"

WSL 에서 CUDA 사용을 위한 User Guide

CUDA on WSL User Guide

2021/12/05 일 현재

1. WSL 이란

네이티브 리눅스 앱을 Windows 11 and later OS build 에서 실행할 수 있는 Windows Subsystem for Linux 이다.

WSL 1 vs. WSL 2

WSL2 is the second generation of WSL that offers the following benefits:

  • Linux applications can run as is in WSL2. WSL 2 is characteristically a VM with a Linux WSL Kernel in it that provides full compatibility with mainstream Linux kernel allowing support for native Linux applications including popular Linux distros.

  • Faster file system support and that’s more performant.

  • WSL 2 is tightly integrated with the Microsoft Windows operating system, which allows it to run Linux applications alongside and even interop with other Windows desktop and modern store apps.

2. NVIDIA GPU Accelerated Computing on WSL 2

WSL 2에서 마이크로소프트는 NVIDIA CUDA 및 기타 컴퓨팅 프레임워크와 기술과 함께 데이터 과학, 머신러닝 및 추론 솔루션을 위한 GPU 가속 컴퓨팅을 가능하게 하는 GPU 반가상화 기술을 도입했다. WSL 유사 환경 또는 WSL 2에서 CPU 개입을 줄이면서 GPU에서 더 많은 병렬 작업을 파이프라인으로 수행할 수 있으므로 거의 네이티브에 가까운 성능을 제공한다. NVIDIA 드라이버 지원은 CUDA 및 관련 컴퓨팅 소프트웨어 스택에서 멈추지 않습니다. 다이렉트 ML 지원과 함께 DX12 API를 지원하여 WSL 2에서 그래픽을 활성화하는 DirectX 지원이 있습니다.

Illustration of the possibilities with NVIDIA CUDA software stack on WSL 2

3. WSL2 시작

WSL2 요구사항

  • Geforce, Quadro 제품 계열에서 Pascal 또는 최신 GPU 구조를 WDDM모드로 SKU를 사용할 수 있다.
  • 최신 WSL 커널 로 5.10.16.3 이상을 권장한다. (최소 4.19.121+ 이상)
  • Windows 11 에서는 윈도우 인사이더 프로그램 가입이 필요 없다.
  • Windows 10 에서는 윈도우 인사이더 프리뷰 프로그램이 필요하다.

Step 1: Install NVIDIA Driver for GPU Support

윈도우 11 그래픽 드라이버로 NVIDIA GeForce Game Ready or NVIDIA RTX Quadro 를 설치한다.

3.3. Step 2: Install WSL 2

윈도우 터미널 / 커맨드 라인 / 파워쉘 에서 WSL을 설치

1
wsl.exe --install

Ensure you have the latest WSL kernel:

1
wsl.exe --update

3.4. Setting Up a Linux Development Environment

기본으로 WSL2는 Ubuntu 가 설치되어 온다. 다른 배포본은 MS store에서 설치. wsl 시작.

1
wsl.exe

업데이트를 위한 WSL 명령:

4. Getting Started with CUDA on WSL 2

WSL2에서 CUDA 를 지원하려면 CUDA Toolkit이 설치되고 cuDNN도 설치해야 한다.

4.1 WSL에서 CUDA Toolkit을 설치한다

WSL 2 에서 CUDA application을 실행하려면 CUDA toolkit for Linux 를 설치해야 한다.

CUDA Toolkit 11.5 를 다운로드하고 설치한다.

1
2
3
4
5
6
7
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-5-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

4.2 cudnn 설치

CUDA Toolkit 버전에 대응하는 cuDNN 을 설치해야 한다.

1
2
3
sudo apt install libcudnn8
sudo apt install libcudnn8-dev
sudo apt-get install libcudnn8-samples

4.3 CUDA 애플리케이션

윈도우에 CUDA 애프리케이션이 있아면 다음 같이 WSL에서 실행해 보자

1
2
3
$ cd /mnt/c/Users/<username>/Desktop
$ cp /mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.5/extras/demo_suite/deviceQuery.exe ~/
$ ./deviceQuery.exe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(tf25gpu_p39)~$ nvidia-smi
Sun Dec 5 02:29:22 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.00 Driver Version: 510.06 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:09:00.0 On | N/A |
| 0% 43C P8 20W / 320W | 1179MiB / 11264MiB | N/A Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

4.4 Building CUDA Samples

CUDA 샘플을 빌드해서 실행해 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(tf25gpu_p39)/usr/local/cuda-11.5/samples/4_Finance/BlackScholes$ ./BlackScholes
[./BlackScholes] - Starting...
GPU Device 0: "Pascal" with compute capability 6.1

Initializing data...
...allocating CPU memory for options.
...allocating GPU memory for options.
...generating input data in CPU mem.
...copying input data to GPU mem.
Data init done.

Executing Black-Scholes GPU kernel (512 iterations)...
Options count : 8000000
BlackScholesGPU() time : 0.234201 msec
Effective memory bandwidth: 341.586668 GB/s
Gigaoptions per second : 34.158667

BlackScholes, Throughput = 34.1587 GOptions/s, Time = 0.00023 s, Size = 8000000 options, NumDevsUsed = 1, Workgroup = 128

Reading back GPU results...
Checking the results...
...running CPU calculations.

Comparing the results...
L1 norm: 1.741792E-07
Max absolute error: 1.192093E-05

Shutting down...
...releasing GPU memory.
...releasing CPU memory.
Shutdown done.

[BlackScholes] - Test Summary

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

Test passed
(tf25gpu_p39)/usr/local/cuda-11.5/samples/4_Finance/BlackScholes$

참고

WSL 파일시스펨, 네트워크

WSL 파일시스템

윈도우와 WSL 사이의 파일 시스템 공유

WSL 데이터 공간

Windows에 WSL 패키지는 아래의 Packages 폴더 안의 어딘가에 위치한다.

1
C:\Users\[사용자명]\AppData\Local\Packages\

Ubuntu 깔았다면 Packages폴더 아래에 Ubuntu라는 단어가 들어간 폴더명이 보일 것이다. 바로 그 폴더가 Ubuntu WSL의 위치다.

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\daddy> ls .\AppData\Local\Packages\

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020-11-01 오후 10:45 1527c705-839a-4832-9118-54d4Bd6a0c89_cw5n1h2txyewy
d----- 2020-11-01 오후 10:31 ActiveSync
d----- 2020-11-12 오전 8:07 adobe.acrobatreaderdc.protectedmode
d----- 2020-11-01 오후 10:45 c5e2524a-ea46-4f67-841f-6a9465d9d515_cw5n1h2txyewy
d----- 2021-02-16 오후 7:52 CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc
d----- 2021-02-17 오후 4:58 CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc
d----- 2020-11-01 오후 10:45 E2A4F912-2574-4A75-9BB0-0D023378592B_cw5n1h2txyewy

위 패키지 경로에서 LocalState 폴더 안의 rootfs 폴더가 바로 WSL1의 Root와 동일한 경로이다.

1
2
3
4
5
PS C:\Users\daddy> ls .\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021-02-17 오후 5:34 1206910976 ext4.vhdx

권한문제

윈도우와 리눅스는 서로 다른 권한 매커니즘을 가지므로 윈도우 탐색기 상에서 그냥 WSL 경로로 파일을 옮기면 권한이 이상해진다. 가능하면 WSL 로그인후에 사용한다.

탐색기로 홈디렉토리 열기

현재 Working Directory를 네크워크를 통해 Windows 탐색기로 여는 방법
아래의 명령어를 WSL에서 실행하면 현재 작업 중인 위치를 네트워크 연결을 통해서 Windows에서 열어준다.

1
explorer.exe .

WSL 네트워크

DHCP

https://stackoverflow.com/questions/61002681/connecting-to-wsl2-server-via-local-network

참고

WSL 설치

WLS 설치

https://docs.microsoft.com/ko-kr/windows/wsl/install-win10#manual-installation-steps

https://www.44bits.io/ko/post/wsl2-install-and-basic-usage

WSL 에러

가상머신 에러

wsl2 코드 4294967295

Windows 기능 추가/삭제를 이용해 1 Linux 하위시스템, 2 가상머신 껏다 켜는 방법
https://bluenotes.kr/272

wls2 삭제후 재 설치
https://hyelmy.github.io/%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81/honeytips2/

https://blogger.pe.kr/853

재시작

여러가지 방법이 있지만 대부분의 Windows에서 동작하는 방법은 먼저 PowerShell을 관리자 권한으로 열고 다음 명령을 실행하면 됩니다.

1
Restart-Service LxssManager

Windows 10 버전 1903/19H1 (빌드 18362) 이상 부터는 명령 프롬프트(CMD)를 열고 다음 명령어만 간단히 입력함으로서 WSL 시스템을 종료할 수 있습니다.

wsl -t [배포판 이름]
예를 들어 Ubuntu 20.04를 설치하였다면 wsl -t ubuntu를, Debian을 설치하였다면 wsl -t debian과 같이 사용하시면 됩니다.

추가로 Windows 10 버전 2004/20H1 (빌드 18917) 이상 부터는 명령 프롬프트에서 다음 명령어를 사용하여 모든 WSL 시스템을 한 번에 종료할 수 있습니다. 가령 Ubuntu와 Debian 머신이 구동되고 있다면 아래 명령어로 모두 종료 시킬 수 있습니다.

wsl –shutdown

1
2
3
4
5
6
7
(base) PS C:\Users\daddy> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)
(base) PS C:\Users\daddy> wsl -t Ubuntu-20.04
(base) PS C:\Users\daddy>
(base) PS C:\Users\daddy> wsl -t Ubuntu-20.04 --shutdown
(base) PS C:\Users\daddy>

주요 명령

  1. WSL 버전 확인하기 (cmd창에서)
1
2
3
wsl -l -v

wsl -- list --verbose

우분투 배포판 버전 변경하는 명령어

1
wsl --set-version Ubuntu-20.04 2
  1. 우분투 종료 명령어
    wsl -t Ubuntu-20.04
  • 새로 설치하는 리눅스 배포판에 wsl2로 변경

wsl –set-default-version 2

  1. WSL2 활성화 (Power shell 상)
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

wsl IP 주소

1
wsl hostname -I

네트워크

ssh

https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui

DHCP

https://stackoverflow.com/questions/61002681/connecting-to-wsl2-server-via-local-network

참고

고정 IP

https://netmarble.engineering/wsl2-static-ip-scheduler-settings/

https://blog.dalso.org/linux/wsl2/11430

1

배치 파일을 만들어서 작업 스케쥴러에 추가해 재시동시 다시 설정한다.

1
2
wsl -d Ubuntu-20.04 -u root ip addr add 192.168.254.10/24 broadcast 192.168.10.255 dev eth0 label eth0:1
netsh interface portproxy add v4tov4 listenport=8585 listenaddress=0.0.0.0 connectport=8585 connectaddress=192.168.254.10
1