WSL 사용하기
WSL을 오래간만에 사용할 때 보기
    linux wsl wsl2
    개요
관련 링크
기본
Distro 목록 보기
- 
distro의 뜻 : 리눅스 배포판, 위키백과
- 관련 링크 : List Available WSL Linux Distors in Windows 10
- 모든 Distro 목록 보기
    wsl –list –all 혹은 wsl -l –all 
- 현재 실행중인 distro 목록 보기
    wsl –list –running (혹은 wsl -l –running) 
- 2022-01-17 현재 running 중인 my distro name
    - Ubuntu-20.04
 
기본 명령
- Ubuntu package 목록을 업데이트 하라
    - 업데이트 명령
        1 > sudo apt-get update 
- 업데이트 안 된 distro 은 새로운 패키지를 설치하려할 때 문제가 생길수 있으므로 처음에, 또는 수시로 업데이트 한다
 
- 업데이트 명령
        
설정
WSL의 고급 설정 구성
- 관련 링크 : WSL의 고급 설정 구성
- wsl.conf 설정하는 법
WSL2 에서 C++ 환경설정 하기
관련 링크
- ⭐⭐Using C++ and WSL in VS Code, visual Studio Code Doc
- VS Code에서 WSL2와 C++ 환경설정 하기, 개인블로그
- gcc/g++ 설치하기, woowaa.net
- gcc 배포 이력, gcc.gnu.org : 2022-01-17 현재 최종 버전은 GCC 11.2 ( 내가 쓰는 WSL2 최종 버전은 gcc 9.3 )
현재 환경
- 모든 소스코드와 compiler는 WSL내에서 hosting하지만
- windows상의 VS Code 와 그의 확장들 ( Remote - WSL, 디버거 등등)을 사용함
- 결론 - VS Code x WSL2 환경, VS Code 확장으로 intellisense, 빌드및 디버깅 모두 가능함
- 이 환경에 대한 자세한 설명은 VS Code Remote Development 를 참조
최신 버전 업데이트
- 
Install GCC on Ubuntu 20.04
    - 명령
        1 2 > sudo apt update > sudo apt install build-essential gdb 
- 위 명령은 gcc,g++,make등 많은 패키지를 한 번에 설치한다
- 2022-01-17 현재 최신버전은 다음과 같다
        - build-essential - 12.8ubuntu1.1
- gdb - 9.2-0ubuntu1~20.04
 
- build-essential - 
 
- 명령
        
Run VS Code in WSL
- WSL 상의 cpp project 폴더에서 code .명령을 수행한다- 
“installing VS Code Server” 메시지가 보인다
        - VS Code가 Linux side에서 작은 서버를 다운로드해서 설치하고 데스크탑 side의 VS Code가 대화하기 시작한다
- VS Code는 해당 cpp project 폴더를 열고
            - VS Code 상의 File Explorer는 VS Code가WSL context상에서 실행된다는 표시를 보여준다- title bar 에서 [WSL: Ubuntu-20.04]를 볼 수 있다
 
- title bar 에서 
- VS Code 상의 status bar에서도[WSL: Ubuntu-20.04]표시를 볼 수 있다
 
- VS Code 상의 
 
 
- 
“installing VS Code Server” 메시지가 보인다
        
- 제목의 링크에서 알려주는 필수 VS Code 확장을 깔고 튜토리얼을 따라해보면 .vscode폴더내에 다음의 파일이 자동으로 생성된다- 
c_cpp_properties.json: compiler 경로와 IntelliSense 설정
- 
tasks.json: build instructions (make 파일과 비슷)
- 
launch.json: 디버거 설정
 
- 
- 
tasks.json파일의 구성- VS Code에서 Terminal > Configure Default Build Task명령을 줄때 자동으로 생성
- 
        내용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { "version": "2.0.0", "tasks": [ { "type": "shell", "label": "g++ build active file", "command": "/usr/bin/g++", "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"], "options": { "cwd": "/usr/bin" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] } - 
command설정 : 실행할 프로그램을 지정. 이 경우g++
- 
args배열 : g++에 전달할 command-line arguments를 지정함
- 이 arguments는 컴파일러가 기대하는 순서로 지정되어야 한다
- 이 task는 g++ 에게 다음과 같이 지시한다
            - active file (${file})을 가지고, 컴파일 해서,- 여기서 active file 이라는 것은
                    - VS Code에서 Terminal > Configure Default Build Task명령을 줄때
- 현재 VS Code Editor 상에서 보고있던 .cpp파일을 말함 (즉 현재 활성화된 파일)
 
- VS Code에서 
 
- 여기서 active file 이라는 것은
                    
- 현재 디렉토리($(fileDirname})에
- active file 이름과 같은 실행파일을 만들지만
- 확장자는 가지지 않도록(${fileBasenameNoExtenstion})
 
- active file (
- 결과적으로 helloworld라고 실행파일이 만들어진다 ( 소스코드 이름이helloworld.cpp일때)
- 이 링크(variables reference)를 통해 task.json의 variables에 대해 자세히 알수 있다
- 
label값 : tasks 목록에서 보게될 제목이다. 아무렇게나 이름지어도 된다
- 
groupobject의"isDefault": true값 :Ctrl+Shift+B(Build 명령)를 눌렀을때 이 task가 실행될 것이라는 것을 설정함- 이 property는 편의적인 목적만 있음
- 이 설정을 false로 두더라도 Terminal Menu의 Tasks: Run Build Task로 실행할 수 있다
 
 
- 
 
- VS Code에서 
- Build한 것 실행하기
    1 2 3 > ls helloworld helloworld.cpp > ./helloworld 
- tasks.json 수정하기
    - 
tasks.json를 수정하여 여러개의 C++ files
 
- 
필수 VSCode 확장
- 
Remote - WSL : Windows 상의 VS Code를 이용하여 linux application을 개발하도록 지원.- Windows 환경의 생산성 그대로 linux에서 사용가능하다
 
WSL2 Ubuntu에 ZSH 설치해서 터미널 꾸미기
zsh 설치
- 
sudo apt install zsh로 설치  
- 기본 쉘을 zsh로 변경
    - 현재 설정된 기본 쉘 확인
        1 2 $ echo $SHELL /bin/bash <-- 현재 bash가 기본 쉘임 
- 기본 쉘 변경 명령
        1 $ chsh -s $(which zsh) - 
which zsh에서which는zsh의 경로와 파일명을 찾아서 반환한다
- 바로 변경되지는 않고 탭을 닫았다가 다시 로그인 해야 변경된 기본 쉘이 반영된다
 
- 
 
- 현재 설정된 기본 쉘 확인
        
- oh my zsh 설치
    - 
oh my zsh 의 설치는 링크에 자세히 나와 있다
        - sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
 
- 위 명령으로 설치를 하는데..
        - 일단 sh -c명령에 대한 설명은 다음 링크를 참고하자 : 링크
- 
sh -c명령을 다음에 오는 명령줄 문자열을 인터프리터식으로 실행하는 명령이다
- 
sh이 어떤 쉘로 연결되어 있는지는readlink -e $(which sh)을 실행하면 알수있는데 내 경우는/usr/bin/dash와 연결되어 있었고 일반적으로dash에 연결되어 있는듯하다
- 왜 바로 curl명령을 호출하지 않고 이런식으로dash로 실행하는지는 잘 모르겠다
 
- 일단 
- 아래 그림과 같이 설치가 된다
    
 
- 
oh my zsh 의 설치는 링크에 자세히 나와 있다
        
- 하나씩 zsh 플러그인들을 설치하고 있는데 crlf 에러가 난다
WSL2에서 20.04 버전을 22.04 LTS 버전으로 업그레이드 하기
- 참고링크 : Upgrade ubuntu in WSL2 from 2004 to 22.04 의 선택된 답변, from 
- TL;DR
    1 2 3 > sudo apt update && sudo apt full-upgrade # Window logout & login > sudo do-relese-upgrade 
troubleshooting
Case 1 : 인터넷 관련 명령중 unable to resolve ... 문제
증상
- WSL 소스 코드 디렉토리에서 code .누르면 VS Code Server에 접속하여 뭔가 download받는등 인터넷 접속을 하는데 안됨
- ping 도 안됨
관련 링크
- wget unable to resolve host address 문제 해결, 지식이 홀쑥
- WSL2 DNS issues 답변, github/WSL
- WSL - Could not resolve hostname, 테크블로그 ~/xo.dev
설명
- wsl.conf가 없으면 대신 resolv.conf 가 자동 생성되어 사용되는데 재부팅이후 잘 동작하지 않게됨
- wsl.conf를 명시적으로 생성하여 제대로 설정하면 됨
- 이후 /etc/resolv.conf 파일을 수정하여 DNS 설정을 변경
    1 nameserver 8.8.8.8 
- 마지막으로 윈도우 터미널에서 wsl --shutdown명령어를 사용하여 wsl 인스턴스 종료후 다시 시작
Case 2 : sudo systemctl start nginx 명령을 주면 다음 에러가 뜬다
1
2
3
honggaruy@3950X-P600S:~$ sudo systemctl start nginx
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
 
- StackExchange / ask ubuntu 그룹의 질문
- 답변요약 - 참고로 아래 두 답변의 답변자는 한 사람이다!
    - 
선택된 답변 ( 2021.12.6 ) - 매우 길다
        - Windows 에서는 systemctl명령이 동작하지 않음
- Short Answer
            - 
systemctl의 흔한 사용처는 service를 시작시키는 것이다.
- 
Ubuntu in WSL에서는 아래와 같이 대체할 수 있다1 $ sudo service <service name> start 
 
- 
 
- Windows 에서는 
- 
신규 WSL의 경우 ( 2022.09.22 )
        - MS 공식 발표: Systemd support is now available in WSL!
- 의미: 일반적으로 Ubuntu in WSL에서는Systemd가 필요하지 않지만, 이제는 선택할수 있는 옵션중 하나가 되었다
 
 
- 
선택된 답변 ( 2021.12.6 ) - 매우 길다