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"

Ubuntu 20.04 - Cheat sheet

Ubuntu 20.04 를 설치/운영하면서 필요한 팁/트릭과 쓸모있는 사용법을 정리한다.

비슷한 문서:

Timezone 관련

CLI에서 설정을 할 수 있다.

timedatectl timedatectl 명령으로

1
2
3
4
5
6
$ timedatectl list-timezones
...
Asia/Seoul
...

$ sudo timedatectl set-timezone Asia/Seoul

만약 손으로 수정을 한다면,

timedatectl 로 지정되는 설정 Timezone/etc/localtime 이라는 바이너리로 저장되므로
명령행에서 지원하는 timezone을 복사할 수 도 있다고 한다..

1
$ sudo cp /usr/share/zoneinfo/Europe/London /etc/localtime

LCD/Screen off

기존에 글 Ubuntu/시스템 전원관리, 2017년 에서 Ubuntu 18.x 에서 디스플레이(특히 노트북 LCD)를 끄기 위해서 사용되던 직접 vbetool 명령으로 동작하지 않는다.

그래서 Ubuntu 20.04 에서는 링크 ubuntu-20-04-on-a-laptop-is-there-any-way-toturn-off-the-screen 에 있는 방법으로 사용하고 있다.

디스플레이를 끄려면

1
2
3
sudo mount -o remount,exec /dev
sudo vbetool dpms off
sudo mount -o remount,noexec /dev

다시 디스플레이를 켜려면

1
2
3
sudo mount -o remount,exec /dev
sudo vbetool dpms on
sudo mount -o remount,noexec /dev

Network 상태 확인

ss 명령

ss 명령은 Socket Statistics 를 출력해 준다. open 된 소켓에 대한 정보를 표시한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ss [-a -t -u -l -p -n] [filter]

-a:
-t: TCP
-u: UDP
-l: LISTEN 상태 포트
-n: 호스트/포트/사용자 이름을 숫자로 표시
-p: 프로세스 이름
-r, --resolve: resolve host names
-w, --raw : display only RAW sockets
-x, --unix : display only Unix domain sockets
-4, --ipv4 : display only IP version 4 sockets
-6, --ipv6 : display only IP version 6 sockets
-m, --memory : show socket memory usage

LISTEN Port 확이

netstat 같이 LISTEN 상태 프로세스를 확인할 수 있다. 다음은 t: tcp 포트, l: LISTEN 상태의 소켓 정보를 출력한다.

1
2
3
4
5
6
7
8
9
10
$ ss -lntu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 12.42.168.213%enp3s0:68 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 10 127.0.0.1:9000 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:53000 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:2020 0.0.0.0:*

IPv4, IPv6 소켓

1
2
3
4
5
6
7
8
9
$ ss -tl4
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
$
$ ss -tl6
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 [::]:2020 [::]:*
q

lsof

Linux에서 open file을 확인하는데 사용되는 lsof 명령입니다. Unix/Linux의 모든 것은 파일로 이루어져있기때문에 스트림이나 네트워크 파일도 lsof 로 확인할 수 있습니다.

1
2
$ lsof -i
$ lsof -l

Ubuntu/시스템 전원관리, 2017년

Docker CLI 요약

docker cli 명령을 정리

docker architecture 이미지 소스

비슷한 문서:

docker cli

docker cli는 docker 명령 뒤에 docker commands 로 도커를 제어한다. 그리고 대상 컨테이너를 지정하고 컨테이너에서 실행 할 수 있는 명령형식으로 구성되어 있다.

1
docker [docker commands] [container] [container command] 

Use the Docker command line docker

search 이미지 검색

Docker hub에서 이미지를 검색한다.

1
docker search busybox

Docker hub에서 상위 몇개 정도만 검색하고 싶을때 limit 옵션을 사용한다.

1
docker search busybox --limit 5

Docker hub에서는 이미지 중 별점을 검색한다.

1
2
3
4
5
# 최소 별정 50인 이미지
docker search busybox --filter=stars=50

# 별점이 3인 이미지
docker search --filter stars=50 busybox

정규 빌드 버전만 지시하려면 is-official 옵션 사용

1
2
docker search --filter is-official=true --filter stars=50 busybox

--format 옵션을 사용해 출력되는 내용을 필터링 할 수 있다. 다음은 별점만 출력하는 예이다.

1
docker search --format "{{.Name}}: {{.StarCount}}" nginx

pull 이미지를 다운로드 한다

Docker image를 내려 받는다. 이미지 이름 뒤에 :[version] 을 붙이면 지정한 버전을 내려 받고, latest 를 붙이면 최신 버전을 대상으로 한다.

1
docker pull nginx:latest

images 다운로드 이미지

Docker에서 다운로드 받는 이미지를 확인한다. docker images는 모든 이미지를 보여준다.

1
$ docker images

특정 이미지만 지시할 수 있다.

1
$ docker images nginx

run 이미지를 컨테이너로 실행한다.

Docker image를 컨테이너로 생성하고, 실행합니다.

1
docker run -p 8080:8080 nginx

옵션:

1
2
3
4
5
`-p`: Local과 Container 와 port를 연결하는 옵션
`-i`: interactive (대화방식)
`-t`: Pseudo-tty (콘솔 및 터미널 환경)
`— name`: 실행 컨테이너 이름을 지정합니다.
`-d`: 백그라운드에서 실행되는 옵션입니다.

docker image를 실행하고 bash 쉘을 연다.

1
docker run -i -t --name nginx nginx bash

ps 컨테이너 목록을 확인

Docker 컨테이너 목록을 확인합니다.

1
2
$ docker ps
$ docker ps -a

옵션:

1
2
`-a` : 실행 중이 아닌 컨테이너까지 확인
`-q` : 컨테이너의 CONTAINER ID 만 표시

start 컨테이너를 시작한다.

중단되어 있는 컨테이너를 실행합니다.

1
2
docker start nginx
nginx

attach 컨테이너 연결

실행중인 Docker Container 의 standard input, output, error streams 에 연결한다.

1
docker attach nginx

docker attach 명령 사용 사례.

exec 컨테이너 명령 실행

Docker Container의 쉘의 명령어을 실행할 수 있다.

1
docker exec nginx ls

옵션

1
2
3
4
5
-d, --detach : 명령을 detach mode, 백그라운드로 실행
-e, --env : 환경변수 설정하고 실행
-it [SHELL]: iteractive tty 옵션. 사용할 shell을 지시한다, 보통 bash
-u, --user: User ID, UID
-w, --workdir: 작업 디렉토리 지정

다음은 nginx 컨테이너의 bash 쉘을 실행한다.

1
docker exec -it nginx bash

다음은 nginx 컨테이너를 qkboo 사용자 쉘로 연결한다.

1
docker exec -it -u qkboo nginx bash

inspect 컨테이너 상세 정보

Docker Container에 상세 정보를 확인 한다.

1
docker inspect nginx

옵션

--format : 필터링

1
docker inspect  --format='{{range .NetworkSettings.Networks}}

logs 명령

Docker 컨테이너에서 sysout 또는 syserr 로그를 보려면 logs 명령을 사용한다.

docker logs

stop 컨테이너 종료

ps 명령으로 실행중인 컨테이너 아이디와 이름을 확인하고 아이디를 준다.

1
2
3
docker ps

docker stop e417951d25fd

이름으로 종료시 --name 옵션 사용

1
docker stop --name nginx2

rm 컨테이너를 삭제한다.

Docker Container 삭제합니다. 삭제할때는 실행 상태가 아닌 컨테이너만 가능합니다.

1
docker rm nginx

강제 삭제시 -f 옵션 사용.

rmi 이미지를 삭제한다.

Docker image를 삭제 하는데 이미지가 중첩된 경우가 많기 때문에 링크 같이 untag 한 후 사용한다.

1
2
3
docker rmi fd484f19954f

docker rmi test2:latest

혹은 -f 옵션으로 중첩된 이미지를 모두 함께 삭제 할 수 있다.

1
docker rmi -f fd484f19954f

참고

HTTPS 를 위한 Private SSL

Web server certificates 과정

Securing a web site with a server certificate 단계

  1. 비밀키를 생성한다.
  2. 비밀키로 CSR certificate siging requests 을 생성한다.
  3. CSR 을 CA 로 사인한다.
  4. 사인한 CERT 를 받고 설치한다.

1. 비밀키를 생성한다.

rsa 를 사용해 4096크기 비밀키를 생성한다.

1
2
3
4
5
# cd /etc/ssl/private 
# openssl genrsa -out my_rsa.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)

# chmod 0600 private/my_rsa.key
1
# chmod 0600 private/my_rsa.key

Public Key 생성

1
명령: openssl rsa -in [private key 파일명] -pubout -out [파일명]
1
# openssl rsa -in my_rsa.key -pubout -out my_rsa.pub 

2. Create a CSR(certificate signing request) from this key,

인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청서를 작성한다.

1
명령어 : openssl req -new -key [private key 파일명] -out [파일명]

비밀키에서 CSR 파일 작성을 요청하면 아래 내용을 묻는다.

1
# openssl req -new -sha256 -key ./my_rsa.key -out ./my_rsa.csr 
1
# openssl req -new -key private.key -out private.csr

인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청 형식 데이터 이다.

  • Country Name (국가코드) KR
  • State or Province Name (시/도의 전체이름) Seoul
  • Locality Name (시/군/구 등의 이름) Songpa-gu
  • Organization (회사이름) XXXX
  • Organization Unit (부서명) Server
  • Common Name (SSL 인증서를 설치할 서버의 Full Domain) www.xxxx.com
      • Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 넣어야 한다. (ip, port, http, https 포함불가능)

4. CA 인증한 CRT 인증서 만들기

CSR 을 CA에서 인증해 CRT 파일을 생성한다. 여기서는 비밀키와 CSR 요청서를 바탕으로 CRT 인증서를 생성한다.

1
명령어 : openssl req -x509 -days [기간] -key [private key 파일명] -in [csr 파일명] -out [파일명] -days [기간]

x509 를 이용하고 365일 사용 가능한 crt 인증서를 생성한다.

1
openssl req -x509 -days 365 -key my_rsa.key -in my_rsa.csr -out my_rsa.crt -days 365

생성한 혹은 CA에서 받은 CRT 파일은 아래 같이 확인해 볼 수 있다.

1
openssl x509 -text -in yourdomain.crt -noout

5. CRT 파일을 PEM 파일로 변환한다.

1
openssl x509 -in mycommoncrt.crt -out mycommonpem.pem -outform PEM 

[Tip] 인증서 Config 파일 (test.conf)

위에서 만들다 보면 계속 같은 내용을 써야 한다. 그래서 그 부분을 파일로 만들어 놓고 csr, crt 생성할때 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
C=KR
ST=Seoul
L=Seoul
O=COMPANY
OU=DEV
emailAddress=test@test.com
CN = testmachine

[req_ext]
subjectAltName = @alt_names

[alt_names]
IP.1 = 111.111.111.111
DNS.1 = test.com

csr 을 생성한다.

1
openssl req -new -key private.key -out private.csr -config test.conf

csr, crt 파일을 생성한다.

1
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf

그리고 이렇게 해서 인증서를 만들었을때 subjectAltName 이 안들어간다 . 그 부분이 필요할 경우에는 이렇게 명령어를 사용하면 된다.

1
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf -extensions req_ext

openssl 팁 몇가지

CRT 파일 확인

openssl x509 -text -noout -in <인증서파일> : 인증서 내용을 볼수 있다.

Verifying Your Keys Match

1
2
3
openssl pkey -pubout -in .\private.key | openssl sha256
openssl req -pubkey -in .\request.csr -noout | openssl sha256
openssl x509 -pubkey -in .\certificate.crt -noout | openssl sha256

NGINX 웹 서버 TLS 암호화 추가

개인키와 TLS 인증서 crt 파일을 사용한다.

1
2
$ sudo mkdir /etc/nginx/tls/private
$ mv my_rsa.key my_rsa.crt /etc/nginx/tls/private
  1. 개인 키는 /etc/nginx/tls/private/my_rsa.key 파일에 저장됩니다.
  2. 개인 키 및 CSR(인증서 서명 요청) 생성 및 CA(인증 기관)에서 인증서 TLS 인증서는
    • /etc/nginx/tls/private/example.com.crt 파일에 저장됩니다.
1
2
3
4
5
6
7
server {
listen 443 ssl;
server_name www.thinkbee.kr;
root /home/qkboo/Home/www/thinkbee.kr/;
ssl_certificate /etc/nginx/tls/private/my_rsa.crt;
ssl_certificate_key /etc/nginx/tls/private/my_rsa.key;
}

참고

  1. Howto – Install a self signed web server certificate
  2. openssl quick reference guide
  3. Openssl로 SSL 을 위한 인증서 발급하기 (HTTPS),blog
  4. Nginx - HTTPS and Certificate SSL,blog
  5. NodeJS와 Nginx 웹 서버,blog

parted로 Partition, Format하기

새 디스크 / USB 저장장치를 리눅스 계열에서 사용하고자 할 때.

디스크 확인 lsblk

lsblk 명령은 디바이스 장치가 마운트 된 곳을 출력해 준다.

1
2
3
4
5
6
7
8
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 91.8M 1 loop /snap/lxd/23991
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 118.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 118.1G 0 lvm /

새 디스크 장치(SSD, HDD, USB 등) 를 붙이고 다시 확인하면 새로운 디스크는 sd[a-z] 형식으로 표현된다.

아래 sdb 는 현재 파티션이 1개 존재하는 상태이다.

1
2
3
4
5
6
7
8
9
10
11
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 91.8M 1 loop /snap/lxd/23991
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 118.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 118.1G 0 lvm /
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 931.5G 0 part

[USB 장치]

USB 장치는 mmcblk[0-9] 형식으로 표시된다. 참고 Raspberry Pi:mmcblk

1
2
3
4
5
6
7
8
9
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 84.5G 0 part
└─sda6 8:6 0 28.9G 0 part /
mmcblk0 179:0 0 7.5G 0 disk
├─mmcblk0p2 179:2 0 6.8G 0 part /media/qkboo/ROOT
├─mmcblk0p3 179:3 0 486.1M 0 part
└─mmcblk0p1 179:1 0 200M 0 part /media/qkboo/EFI

parted 사용

파티션 및 포맷을 위해 마운트된 파티션을 언마운트 한다. parted 는 상호작용 프롬프트에서 사용하거나 단일 명령어로 사용할 수 있다.

parted 프롬프트 사용

[ext4 파티션 생성]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo parted /dev/sdb
(parted) print
Number Start End Size File system Name Flags
1 0.00GB 32.0GB 32.0GB

(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y

(parted) unit GB
(parted) mkpart primary 0 1000.0GB #디스크 크기 입력

(parted) print
Number Start End Size File system Name Flags
1 0.00GB 32.0GB 32.0GB primary lvm
(parted) quit

[fat32 파티션 생성]

USB 스토리지는 아래 같이 나타난다. 다음은 USB 파티션에 fat32 파일시스템을 프롬프트로 생성하고 있다.

1
2
3
4
5
sudo parted /dev/mmcblk0
(parted) mklabel msdos
(parted) mkpart primary fat32 1MiB 100%
(parted) set 1 boot on
(parted) quit

쉘에서 parted 명령 사용

parted 를 쉘 명령으로 사용해 단계별로 파티션을 생성할 수 있다.

1
2
3
sudo parted /dev/mmcblk0 rm 1
sudo parted /dev/mmcblk0 rm 2
sudo parted /dev/sdc mkpart primary ext3 4MiB 100%

Format, Mount & fstab

생성한 파티션에 시스템 지원 파일 시스템을 생성해야 한다. 해당 파일 시스템으로 파티션을 포맷한 후에 지정한 디렉토리에 마운트를 해서 사용하면 된다. 지속적인 사용을 위해서 /etc/fstab 에 파티션을 마운트 포인트로 등록하면 재시동 후에도 동일한 폴더에 마운트 된다.

mkfs

mkfs 명령은 파일 시스템에 따랴서 -t 옵션에 파일시스템을 지시하거나 mkfs.[FS] 형식을 명령을 바로 쓰기도 한다.

다음을 sdb1 파티션을 ext4 로 포맷하고 있다.

1
sudo mkfs -t ext4 /dev/sdb1

[USB vfat 파일시스템 생성]

1
sudo mkfs -V -t vfat /dev/mmcblk0p1

fstab 에 등록

/etc/fstab 에 새로 포맷한 디스크 경로를 추가 한다.

1
2
3
4
5
6
# HDD
/dev/sdb1 /Home2 ext4 defaults 0 1

# USB LV volume
/dev/vg_usb/dbvol /data ext4 defaults 0 1
/dev/vg_usb/workvol /home/pi/work ext4 defaults 0 1

참고

WSL2 잘 사용하기

WSL2 이용 Linux 사용시 쓸만한 팁

  1. wsl 사용 명령
  2. WSL 쉘 사용
  3. wsl 하위 시스템 디렉토리
  4. wsl 구성 파일
  5. wsl 외부 디스크 마운트 하기
  6. wsl 배포본 이름 변경하기

1. wsl 사용 명령

윈도우즈 하위 시스템 목록

1
2
3
4
5
# Linux용 Windows 하위 시스템의 목록
PS> wsl -l

# Linux용 Windows 하위 시스템의 상태를 표시
PS> wsl --status

wsl 재시작

혹은 윈도우 서비스를 재시작할 수 있다. Windows에서 PowerShell을 관리자 권한으로 열고 다음 명령을 실행하면 됩니다.

1
PS> Restart-Service LxssManager

wsl 종료

하위 시스템 배포본을 지정해 종료하려면 -t <Distro> 명령을 사용한다.

1
2
3
4
PS> wsl -l
Ubuntu-20.04(기본값)

PS> wsl -t Ubuntu-20.04

wsl shutdown

모든 하위 시스템을 종료 시키려면 --shutdown 명령을 사용한다. --shutdown 명령은 실행 중인 모든 배포과 WSL 2 경량 유틸리티 가상 머신을 즉시 종료한다.

1
PS> wsl --shutdown

Unregister

Window store 에서 설치한 배포본을 삭제해도 wsl 의 Distro 목록에는 남아 있다. 이것은 --unregistre 명령으로 제거할 수 있다.

1
2
3
4
PS> wsl -l --all
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)
Ubuntu-22.04

--unregistre 명령으로 제거한 Distro 등록을 해제한다.

1
2
3
4
5
6
7
PS> wsl --unregister Ubuntu-22.04
등록 취소 중입니다.
작업을 완료했습니다.

PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)

2. WSL 쉘 사용

--system : 현재 시스템의 distro의 셸을 시작한다.

1
2
3
4
5
PS> wsl --system
wslg [ /mnt/c/Users/daddy ]$ cd
wslg [ ~ ]$
wslg [ ~ ]$ exit
logout

--exec, -e: 시스템 distro의 명령을 현재 PowerShell에서 실행한다.

1
2
3
PS> wsl -e bash
()qkboo:/mnt/c/Users/daddy$ cd
()qkboo:~$

2. WSL 하위 시스템 디렉토리

윈도우즈와 하위 시스템의 디렉토리를 Host 의 프로그램 들에서 사용할 수 있다.

탐색기에서 직접 접근하기

윈도우즈에서 네트워크 경로로 WSL 하위 시스템 디렉토리를 접근할 수 있다.

1
\\wsl$\<Distribution>:

예를 들어 하위 시스템 이름이 Ubuntu-20.04 이고 계정이 qkboo 이라면 탐색기에서 qkboo 계정의 홈디렉토리를 이렇게 접그할 수 있다.

1
\\wsl$\Ubuntu-20.04\home\qkboo

아래는 윈도우즈 탐색기에서 wsl 홈디렉토리를 접근한 캡쳐 화면인다.

터미널에서 홈디렉토리 탐색기 열기

터미널에서 윈도우즈 탐색기를 직접 열 수 있다.

1
$ explorer.exe .

VisualStudio Code 에서 현재 디렉토리를 연다.

1
$ code.exe .

3. WSL 고급 설정 구성

배포본 구성 파일 wsl.conf 와 전역 구성 파일 .wslconfig 이 있다.

전역 구성 파일 .wslconfig

wslconfig 예제 파일

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
# Settings apply across all Linux distros running on WSL 2
[wsl2]

# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=4GB

# Sets the VM to use two virtual processors
processors=2

# Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
kernel=C:\\temp\\myCustomKernel

# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
kernelCommandLine = vsyscall=emulate

# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=8GB

# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx

# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=false

# Turn off default connection to bind WSL 2 localhost to Windows localhost
localhostforwarding=true

# Disables nested virtualization
nestedVirtualization=false

# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=true

배포본 구성 파일 wsl.conf

  • 위치: /etc/wsl.conf
  • wsl1, wsl2 배포본에 대한 구성을 지정한다.
  • 단, Windows 빌드 17093 이상에서만 사용할 수 있다.
  • systemd 지원
  • automount 지원
    DrvFS 지원
    interop 설정 등등
  • wsl.conf 구성 설정

wsl.conf 예제

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
# Automatically mount Windows drive when the distribution is launched
[automount]

# Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above. Set to false means drives won't be mounted automatically, but need to be mounted manually or with fstab.
enabled = true

# Sets the directory where fixed drives will be automatically mounted. This example changes the mount location, so your C-drive would be /c, rather than the default /mnt/c.
root = /

# DrvFs-specific options can be specified.
options = "metadata,uid=1003,gid=1003,umask=077,fmask=11,case=off"

# Sets the `/etc/fstab` file to be processed when a WSL distribution is launched.
mountFsTab = true

# Network host settings that enable the DNS server used by WSL 2. This example changes the hostname, sets generateHosts to false, preventing WSL from the default behavior of auto-generating /etc/hosts, and sets generateResolvConf to false, preventing WSL from auto-generating /etc/resolv.conf, so that you can create your own (ie. nameserver 1.1.1.1).
[network]
hostname = DemoHost
generateHosts = false
generateResolvConf = false

# Set whether WSL supports interop process like launching Windows apps and adding path variables. Setting these to false will block the launch of Windows processes and block adding $PATH environment variables.
[interop]
enabled = false
appendWindowsPath = false

# Set the user when launching a distribution with WSL.
[user]
default = DemoUser

# Set a command to run when a new WSL instance launches. This example starts the Docker container service.
[boot]
command = service docker start

4. wsl 외부 디스크 마운트 하기

윈도우즈 wsl 에서 리눅스 파티션 혹은 USB 파티션 디스크를 마운트해서 사용하려고 한다.

  1. 관리자 모드에서 Powershell 을 연다.

파워쉘에서 연결된 디스크 목록을 확인한다.

1
2
3
4
5
6
7
PS> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

DeviceID Caption Partitions Size Model
-------- ------- ---------- ---- -----
\\.\PHYSICALDRIVE0 ST2000DM008-2FR102 1 2000396321280 ST2000DM008-2FR102
\\.\PHYSICALDRIVE1 WDS500G3X0C-00SJG0 4 500105249280 WDS500G3X0C-00SJG0
\\.\PHYSICALDRIVE2 ATA HGST HTS721010A9 USB Device 1 1000202273280 ATA HGST HTS721010A9...
  1. 관리자 모드 PowerShell 에서 마운트할 Device ID를 마운트 한다.

--bare 를 사용해 마운트 여부를 확인할 수 있다.

1
PS> wsl --mount \\.\PHYSICALDRIVE2 --bare
  1. WSL 리눅스 터미널에서 디스크를 확인한다.

아래 같이 마운트를 실행한다.

1
2
3
4
PS> wsl --mount \\.\PHYSICALDRIVE2 -type ext4
디스크가 '/mnt/wsl/PHYSICALDRIVE2'(으)로 탑재되었습니다.
참고: /etc/wsl.conf에서 automount.root 설정을 수정한 경우 위치가 달라집니다.
디스크를 분리하고 분리하려면 'wsl.exe --unmount \\.\PHYSICALDRIVE2'을 실행하십시오.

파티션을 마운트 한다면

1
2
3
4
PS> wsl --mount \\.\PHYSICALDRIVE2 -p 1   # partition 1
디스크가 '/mnt/wsl/PHYSICALDRIVE2p1'(으)로 탑재되었습니다.
참고: /etc/wsl.conf에서 automount.root 설정을 수정한 경우 위치가 달라집니다.
디스크를 분리하고 분리하려면 'wsl.exe --unmount \\.\PHYSICALDRIVE2'을 실행하십시오.

연결된 디스크가 sdd 에 표시된다.

1
2
3
4
5
6
7
~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 363.1M 1 disk
sdb 8:16 0 8G 0 disk [SWAP]
sdc 8:32 0 256G 0 disk /mnt/wslg/distro
sdd 8:48 0 931.5G 0 disk
└─sdd1 8:49 0 931.5G 0 part

어떠 파일 시스템인지 확인하려면 lsblk -f 명령을 사용한다.

1
2
3
4
5
6
7
8
~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda ext4
sdb swap 44bcbb9a-3a2c-44db-99e4-9c14dec69098 [SWAP]
sdc ext4 3255683f-53a2-4fdf-91cf-b4c1041e2a62 159.1G 32% /mnt/wslg/distro
sdd
└─sdd1 ext4 9b3c51ab-a49b-41c7-a105-fb9d47a86476
(3.11.1)qkboo@desktop-goyangi:~$

df 명령으로 확인해 보자,

1
2
3
4
5
6
7
8
9
10
s$ df -h
Filesystem Size Used Avail Use% Mounted on
none 16G 4.0K 16G 1% /mnt/wsl
drivers 465G 397G 69G 86% /usr/lib/wsl/drivers
none 16G 0 16G 0% /usr/lib/wsl/lib
/dev/sdc 251G 80G 160G 34% /

...

/dev/sdd1 917G 852G 19G 98% /mnt/wsl/PHYSICALDRIVE2p1

6. 배포본 이름 변경하기

  1. 먼저 모든 WSL 실행 배포본을 종료한다.

현재 배포본 Ubuntu 20.04 인데 do-os-relase 업그레이드로 22.04 로 완료된 상태이다. 하지만 배포본 이름은 20.04 라서 이름을 22.04 로 변경하려고 한다.

1
2
3
PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)
  1. 레지스트리 편집기를 열고 다음 위치로 이동한다.

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss

  1. Lxss 항목 중 배포본 레지스트리를 선택하면 아래 같은 내용에서 *DistributionName 을 찾아 변경한 배포본 이름으로 바꾸고 저장한다.
  1. 변경된 이름을 저장하고 wsl 배포본 목록을 확인한다.
1
2
3
PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-22.04(기본값)

— 참고

  1. WSL 시작하기: https://github.com/wslhub/wsl-firststep/

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$

참고

Windows Powershell: 관리자 administrator 계정 활성화와 Openssh 서버 활성화

외부에서 원격접속해서 관리자 명령을 실행하려면 관리자 권한이 필요하다. 윈도우 파워쉘에서 openssh 설치하고 시작/재시작 등의 작업을 위해서는 administrator 계정이 활성화 되어야 한다.

  1. openssh windows server 설치
  2. administrator 계정 활성화
  3. 원격 ssh 접속

Powershell Openssh 설치

윈도우 파워쉘에서 openssh 설치

administrator 계정

명령행을 관리자 권한으로 실행하고 아래 명령 수행. 어드민 계정이 활성화 상태로 변경됩니다.
어드민 계정이 활성화되어 있기 때문에 Administrator 계정으로 로그인이 가능해집니다.

윈도우즈 administrator 활성화

administrator 게정을 활성화 하려면

  1. 파웨쉘을 관리자로 실행해 다음 같이 실행한다.
1
> net user administrator /active:yes

패스워드 변경은 사용자 계정 변경에서 ‘다른 계정 관리’

  1. 관리자 권한으로 실행할 명령 앞에 runas 명령을 붙여 실행한다.

파워쉘에서 관리자로 명령을 실행하려면 runas 명령을 사용한다.

1
runas.exe /savecred /user:administrator "%sysdrive%\testScripts\testscript1.ps1"

참고

  1. openssh 서버 구성: https://docs.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_server_configuration
  2. https://docs.microsoft.com/ko-kr/powershell/scripting/learn/remoting/ssh-remoting-in-powershell-core?view=powershell-7.1
  3. 윈도우즈 서비스 만들기: https://docs.microsoft.com/ko-kr/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer

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