안녕하세요, 코코넛입니다~!

이번에는 제가 애용하고 있는 윈도우 OS의 WSL2(Windows Subsystem for Linux version 2)에 관해

  1. 포트포워딩
  2. vmmem 이슈 => wsl2 에 자원 할당
  3. 윈도우 시작 시에 wsl2 내에서 원하는 bashscript 실행

이렇게 세가지를 다뤄 보도록 하겠습니다.


우선 1번 포트포워딩인데요, wsl2 내에서 외부로 포트포워딩하고 싶은 경우 방화벽 설정을 건드려 줘야 합니다.

아래의 스크립트를 원하는 file 이름으로 확장자명은 .ps1 형식으로 원하는 경로에 저장을 합니다. (예: port_fowarding.ps1)

$remoteport = bash.exe -c “ifconfig eth0 | grep ‘inet ‘”
$found = $remoteport -match ‘\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’;

if( $found ){
$remoteport = $matches[0];
} else{
echo “The Script Exited, the ip address of WSL 2 cannot be found”;
exit;
}

#[Ports]

#All the ports you want to forward separated by comma
$ports_tcp=@(22,80,443,3306);

#[Static ip] #You can change the addr to your ip config to listen to a specific address
$addr=’0.0.0.0′;
$ports_a_tcp = $ports_tcp -join “,”;

#Remove Firewall Exception Rules
iex “Remove-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ “;

#adding Exception Rules for inbound and outbound Rules
iex “New-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ -Direction Outbound -LocalPort $ports_a_tcp -Action Allow -Protocol TCP”;
iex “New-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ -Direction Inbound -LocalPort $ports_a_tcp -Action Allow -Protocol TCP”;

for( $i = 0; $i -lt $ports_tcp.length; $i++ ){
$port = $ports_tcp[$i];
iex “netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr”;
iex “netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport”;
}

그리고 윈도우의 ‘작업 스케쥴러’ 라고 검색해서 작업 스케쥴러 상에서 작업 만들기를 통해서 이 파일을 윈도우가 시작할 때 실행되도록 할텐데요,

트리거 => 시스템 시작 시 로 설정을 해줍니다.

동작탭에서

프로그램 / 스크립트 => C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

시작 위치 => 위의 스크립트가 존재하는 폴더 Path (예: C:\Users\test\wsl2_config)

인수 추가 => -ExecutionPolicy Bypass -File .\port_fowarding.ps1

라고 설정해 줍니다.

그리고 저장을 해줍니다.

여기까지 하면 포트포워딩까지는 됩니다.


두번째는 윈도우 cpu, memory 등을 wsl2에 임의로 할당하는 설정입니다.

wsl2에 임의로 자원을 할당하지 않으면 윈도우에서 사용하는 메모리를

버퍼 상태로 할당하여 윈도우에서 필요할 때 메모리를 사용을 못할 수 있습니다.

그래서 자원을 임의로 할당해 주면 이런 불상사는 일어나지 않겠죠?

아래의 스크립트를 C:\Users\사용자명\.wslconfig 로 저장합니다.

꼭 사용자 홈 디렉터리에 .wslconfig 의 이름으로 저장이 되어야 윈도우에서 인식할 수 있습니다.

[wsl2] memory=4GB
processors=2
swap=2GB
localhostForwarding=true


 

memory는 4GB를 할당, cpu 프로세서는 2개, 스왑메모리는 2GB를 할당하는 옵션입니다.

memory를 할당하지 않을 경우 윈도우 메모리 자원을 wsl2가 점유하고 있을 수 있으니 주의바랍니다.


 

마지막으로 윈도우가 구동되면서 작업 스케쥴러를 통해서 wsl2내의 bashscript를 구동시켜 원하는 프로세스를 실행시킬 수 있는 설정입니다.

아래의 스크립트를 파일로 임의의 이름으로 확장자는 .bat 형식으로 원하는 경로에 저장을 해줍니다. (예: init_system.bat)

C:\Windows\System32\bash.exe -c “/home/wsl2유저명/init_system.sh”

 

그리고 저장한 파일을 또 ‘작업 스케쥴러’ 에 추가해 줍니다.

트리거 => 시스템 시작 시 로 설정을 해줍니다.

이번에는 동작탭에서

프로그램 / 스크립트 => C:\Users\test\wsl2_config\init_system.bat

정도로 설정을 해주면 됩니다. 이 설정은 /home/wsl2유저명/init_system.sh 를 윈도우 시작 시에 실행하게 됩니다.

용도의 예로는 crontab 이나 webserver 를 구동시키는 정도를 나열해 볼 수 있겠습니다.