본문 바로가기

시스템/Windows

WSL2 개발환경 설정

WSL 설치

Windows 기능 켜기/끄기

프로그램 및 기능(appwiz.cpl) 실행 해 Windows 기능 켜기/끄기
Linux용 Windows 하위 시스템 (Windows Subsystem Linux) , 가상 머신 플랫폼 (Virtual Machine Platform) 설치.

WSL은 리눅스용 윈도우즈 하위 시스템과 가상 머신 플랫폼만 필요한데, 일부 설정이 Hyper-V 를 사용할 수 있으로 Hyper-V 와 하이퍼바이저 플랫폼 기능도 설치해 준다.

콘솔에서 해당 기능 설치하는 경우

> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

 

업데이트

기본적으로 설치되는 wsl 버전이 1.0 이라 wsl2 를 사용하기 위해 업데이트한다.

> wsl --update
> wsl --set-default-version 2

마이크로소프트스토어에서 '윈도우즈 서브시스템 for linux' 로 다운 받아도 동일.

 

배포 목록

온라인에서 배포되고 있는 목록을 가져온다.

> wsl --list --online

 

설치

목록에서 원하는 Name 항목을 설치하고 버전을 확인한다.

> wsl --install -d Ubuntu-22.04

> wsl -l -v

 

 

실행

WSL 은 윈도우 부팅 시에 자동으로 실행되지 않으므로, 아래 명령을 실행해야 동작하게 된다. 
이 명령을 윈도우 스케줄러를 사용해 pc 시작시 실행 가능하도록 설정하면, 부팅시에 자동으로 실행 시킬 수 있음
단, 자동 실행시 이 명령은 터미널이 뜨게 되므로 터미널을 자동으로 종료 시키는 설정 등 추가 필요

> wsl -d Ubuntu-22.04

 

백그라운드 서비스를 위해 WSL 에 접속 후 /etc/wsl.conf 파일에 아래 내용이 있는 지 확인해 없으면 추가

[boot]
systemd=true

 


환경설정

터미널

Windowns Terminal 은 여러 터미널 환경을 선택해 접근할 수 있는 별도 앱으로, 마이크로소프트스토어에서 배포하고 있다.
마이크로소프트스토어에서 Windows Terminal 설치
설정 : Ctrl + '+', ','
기본 프로필 : 설치한 배포판 선택
왼쪽 메뉴에서 배포판 프로필 선택 후 색상, 폰트 변경

폰트의 경우 oh-my-zsh 과 powerlevel10k 테마 사용하는 경우 커스터마이징된 폰트 필요
한글 지원되는 고정폭 폰트 : D2CodingLigature Nerd Font

아래 사이트에서 다운받아 윈도우에서 설치
https://www.nerdfonts.com/

 

 

 

기본 도구

git, zsh 설치

> sudo apt update
> sudo apt install git zsh

oh-my-zsh, 테마설정
참고 : 터미널 iTerm2 , oh-my-zsh 설정 (tistory.com)

 

SSH

윈도우ubuntu 배포판에는 ssh 서버가 포함되어 있으나, 설치만 되어있고 서비스는 동작하지 않은 상태로 배포된다.
호스트키를 생성하고, 서비스를 재시작해 본다.

> sudo ssh-keygen -A
> sudo service ssh restart


정상적으로 서비스가 실행되지 않는 경우 그냥 깔끔하게 기존 패키지를 삭제 하고 다시 설치

> sudo apt purge openssh-server
> sudo apt intall openssh-server
> service ssh status

 

ssh ip, 포트와 패스워드 접속 등 설정을 /etc/ssh/sshd_config 파일을 통해 변경한다.

> nano /etc/ssh/sshd_config

#ListenAddress 0.0.0.0
#Port 22
#PasswordAuthentication yes

> sudo service ssh restart

 

 

개발 도구

기타 개발용 도구들 설치

clang, make, g++ 등 빌드 도구

> sudo apt install build-essential clang

 

nvm, nodejs

> sudo apt install curl
> curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
> source ~/.zshrc
> nvm ls
> nvm install --lts
> node --version

// 다른버전 설치
> nvm install v18.19.0

// 버전 전환
> nvm use v18.19.0
> nvm use --lts

 

emscripten

> git clone https://github.com/emscripten-core/emsdk.git
> cd emsdk
> ./emsdk install latest
> ./emsdk activate latest
> source ${EMSDK}/emsdk_env.sh

// 모든 쉘에 적용
> echo 'source "${EMSDK}/emsdk_env.sh"' >> $HOME/.zprofile

 

cmake

가끔 소스에서 빌드해야 하는 경우가 있으므로 cmake 설치
홈페이지 https://cmake.org/download/ 에서 linux 소스 tar.gz 파일 링크 복사

> sudo apt install wget libssl-dev
> wget https://github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1.tar.gz
> tar -zxvf cmake-3.28.1.tar.gz
> cd cmake-3.28.1
> ./bootstrap --prefix=/usr
> make
> sudo make install

 

PATH 공유설정

윈도우와 서브시스템간 path를 공유할지를 설정한다. 양쪽에 개발환경을 각각 구축한 경우 사용.
리눅스 환경에서 아래 내용 추가후 재시작

> sudo nano /etc/wsl.conf

[interop]
appendWindowsPath=false

 

vscode

윈도우에 vscode 설치, Remote Development 확장 설치
만약 path를 공유하지 않는경우 vscode path는 zshrc에 별도 등록

코드 실행

> code .

vscode는 윈도우, 서브시스템간에 설정과 확장이 별도로 관리됨
vscode 창의 왼쪽끝에 보면 파란색 아이콘이 있는데, 이 원격 아이콘을 선택해 wsl 접속으로 변경 가능
wsl에 연결 후 확장을 눌러보면 Local, WSL:배포판으로 별도 표시

 

원격지에 vscode server만 설치

> curl -fsSL https://code-server.dev/install.sh | sh

> vim ~/.config/code-server/config.yaml

 

 


포트 포워딩

파워쉘 스크립트 작성

wsl 에 설정된 각 포트들은 윈도우즈 시스템으로부터 포트포워딩이 설정되어야 외부에서 정상 접속할 수 있다.
wsl의 ip는 매번 재 할당 되므로, 시스템 시작시에 포워딩할 포트 목록을 등록해주는 절차를 거쳐야 하는데, 관련 내용을 스크립트로 만들어 매번 직접 실행해 주거나 시스템 시작시에 자동 실행되도록 해야 한다.

포워딩할 포트 목록을 $hostPorts, $remotePorts 테이블에 정의

// 아래 항목에 @{'이름'=@(호스트포트,내부포트);'이름'=@(호스트포트,내부포트);}; 형태로 추가
$ports = @{'nginx'=@(5000, 5500);};

foreach( $key in $ports.keys ) {
    if ( $ports[$key].Length -ne 2 ) {
        Write-Output "오류: $key 항목의 포트 설정을 확인하세요.`입력형식: @{'이름'=@(호스트포트, 리모트포트);}";
        exit;
    }
}

$remoteAddress = bash.exe -c "ip addr show eth0 | grep 'inet '"
$foundIp = $remoteAddress -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if ( $foundIp ) {
    $remoteIp = $matches[0];
} 
else {
    Write-Output "WSL 배포판에서 이더넷 eth0의 ip를 확인할 수 없음";
    exit;
}

Invoke-Expression "netsh interface portproxy reset";
foreach( $key in $ports.keys ) {
    $hport = $ports[$key][0];
    $rport = $ports[$key][1];
    Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$hport connectport=$rport connectaddress=$remoteIp";
}

Invoke-Expression "netsh interface portproxy show v4tov4";

원하는 이름으로 저장 ex) port_forward.ps1

위 스크립트를 실행하면, wsl의 eth0 ip의 포트로 포워딩이 설정되었음을 알수 있다.
wsl ip는 매번 변경되므로, pc가 켜지거나 wsl 재 시작시에 매번 위 스크립트를 실행해 줘야 한다

 

스크립트 실행

실행 정책 변경 없이 스크립트를 실행하기 위해 파워쉘을 관리자권한으로 열고 아래 명령 입력

> powershell.exe -ExecutionPolicy RemoteSigned -File .\port_forward.ps1

RemoteSigned 정책은 다운로드되지 않은 스크립트와, 서명된 스크립트만 실행하며, 상관없이 무조건 실행되도록 하려면 Bypass 정책을 사용한다.

정책 자체를 변경해 바로 스크립트를 실행하려면, 실행 정책 중 CurrentUser Scope를 RemoteSigned로 활성화한다.

// 실행 정책 변경
> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

// 바로 실행 가능
> ./port_forward.ps1

 

PC 로그인 시 실행

pc가 시작되면 자동으로 wsl ip 로 포트포워딩을 할수 있게 작업 스케줄러에 위 스크립트를 설정한다.

작업스케줄러(taskschd.msc) 실행
작업만들기
일반 탭 : 이름, 가장 높은 수준 권한
트리거 탭 : 새로만들기 > 로그온, 필요시 지연시간 설정
동작 탭 : 새로만들기 > 프로그램시작

프로그램 : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
인수추가 : -noprofile -ExecutionPolicy RemoteSigned -File port_forward.ps1
시작위치 : 스크립트 위치

별도 정책을 변경하지 않은 경우 powershell 을 구동해야 하므로, 프로그램은 powershell을 선택하고 인수들을 넣어준다.
정책이 이미 설정된 경우는 스크립트를 바로 실행 가능하므로 해당 스크립트를 프로그램으로 지정하고, 별도 인수는 필요하지 않음.


Docker

도커는 데몬으로 동작하는 특성으로 WSL 에서 설정해야 할 것들이 좀 있다.
위 포트 포워딩 항목에 도커 포트를 포함해서 열어 주어야 하고, systemd 가 활성화 되어야 한다.

 

설치

> curl -fsSL https://get.docker.com -o docker-install.sh
> sudo sh ./docker-install.sh

WSL 이니까 윈도우즈용 도커 데스크탑 사용하라고 나옴.
20초 기다리면 설치.

 

docker 그룹에 유저 추가

> sudo usermod -aG docker $USER

 

Ubuntu 22.04 iptables 변경

Ubuntu 22.04 이상은 기본 설정(iptables-nft)인 경우 컨테이너 이미지 실행시 오류 발생하므로 iptables-legacy 로 변경한다.

> sudo update-alternatives --config iptables
> sudo service docker start
> sudo service docker status

 

제거

> sudo apt autoremove docker-ce docker-ce-cli containerd.io
> sudo rm /usr/share/keyrings/docker-archive-keyring.gpg /etc/apt/sources.list.d/docker.list

 

 

 

Podman

 

podman 설치(ubuntu 22.04 이상)

20.04 에서는 써드파티 저장소 추가해서 설치해야 함.
도커 설치되어있는 경우 제거 후 podman 설치.

> sudo apt install podman

 

레지스트리 설정

popman은 기본 레지스트리로 도커허브가 설정되지 않는다. 개인별 설정에 레지스트리를 추가해 준다. 
library/컨테이너처럼 축약해 도커허브를 사용하는 경우 aliases 에 추가하고, 비공개 레지스트리도 이곳에 설정한다.

> mkdir -p ~/.config/containers
> cp /etc/containers/registries.conf ~/.config/containers/.
> vi ~/.config/containers/registries.conf

# 별도 보안이 없이 이미지를 검색할 레지스트리 배열
unqualified-search-registries=["docker.io", "url:port"]

# 파일에 추가
[aliases]
"library"="docker.io/library"

# private registry 중 보안 사용하는 경우
[[registry]]
location = "registry.url:port"
insecure = true

 

파일시스템 마운트

도커 shared 볼륨을 위해 루트 위치를 마운트

> sudo mount --make-rshared /

 

기타

podman은 컨테이너별 데몬으로 실행이 가능하므로, 컨테이너에 따라 systemd 서비스 설정한다.
예를 들어 구동되는 컨테이너 my_server 를 systemd 로 설정하려면 my_server.service 파일을 생성해 /etc/systemd/system/ 하위에 복사한다.

[Unit]
Description=My Server Description

[Service]
ExecStart=/usr/bin/podman start -a my_server
ExecStop=/usr/bin/podman stop -t 5 my_server
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

 

위 파일은 podman 명령으로도 생성가능

> podman generate systemd my_server

 

서비스 시작

> systemctl start my_service.service
> systemctl status my_service.service
> systemctl stop my_service.service

 

podman 제거

> sudo apt autoremove podman


관련 폴더 및 파일 제거
~/.config/cni/net.d/*podman*
~/.config/containers
~/.local/share/containers
/etc/containers/*
/var/lib/containers/*

 

 


 

 

 

 

'시스템 > Windows' 카테고리의 다른 글

배치파일  (0) 2018.08.02
MBR to GPT : 파티션 변환하기  (0) 2018.07.13
VS2017 OFFLINE 레이아웃  (0) 2017.12.02
svn 서버 설치  (0) 2017.09.24
파워쉘 원격 접속  (0) 2017.02.22
윈도우 소프트 라이선스 도구  (0) 2016.01.10
이것저것 레지스트리  (0) 2015.09.14
윈도우 C++ 개발환경 (Code::Blocks, wxWidgets)  (0) 2015.03.30
윈도우7 무선랜카드 SoftAP 설정 명령  (0) 2014.04.16
터미널서비스 admin 접속  (0) 2012.08.28