우분투 17.10 이상에서 IP 설정하기

우분투 17.10부터는 여태까지 우리가 쓰던 NetworkManager 에서 netplan 이 기본값으로 변경됐다.
근데 한국에서 몇몇 리눅스 진영에서 “우분투 17.10 부터 netplan으로 바꾼다더라” 외에는 아무런 정보가 없다.

하긴… 신문물을 거부하는 김치새끼들이 뭐 그렇지 뭐. 그러면서 iOS 운영체제 알파만 나와도 하악하악…

어쨌든, 어쩌다 보니 깐 사람이던 쓰고 싶어서 깔던 뭐 어쩌던 우분투 17.10 환경에서 IP 설정하는 법을 지금부터 싸지르도록 하겠다.

우분투에서 네트워크 관리가 재밌게 변했는데, 사용자가 netplan을 통해 네트워크를 설정하면, netplan은 우리가 썼던 NetworkManager 에 설정을 자동 적용하여 네트워크를 관리하는 그런 도구다.
이는 영문이지만 우분투 위키 에 소개되어 있다.

이 도구는 설정 파일이 파이썬이나 루비 개발자를 제외한 한국인에게 좀 생소한 형식으로 관리를 하는데, 바로 YAML 형식으로 관리한다는 것이다.
뭐… 우리가 많이 쓰는 텍스트 교환 형식이 XML, JSON, 그리고 자바에서 많이 쓰는 Properties와 행 단위로 설정하는 그런 것들인데…
설명하기 귀찮으니 기냥 위키백과 가서 봐라.

설정 파일은 대충 이렇게 생겼다.

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
 version: 2
 renderer: networkd
 ethernets:
   ens33:
     dhcp4: yes
     dhcp6: yes

여기서 뭔자 이상한 문자가 있는데, 우분투 17.10부터 이더넷 식별자가 우리가 알던 ethX 방식이 아닌 ensXYZ 방식으로 바뀌었다.
ifconfig 로 볼 수 있으며, 만약 도커 때문에 가려져서 보기 어려우면 ipconfig | grep : 치면 IPv6 항목과 함께 네트워크 식별자들이 나올 것이다.
당연하겠지만 자동 IP 할당이 기본값이다. 이를 담당하는 게 IPv4의 경우 dhcp4, IPv6의 경우 dhcp6 키로 관리한다. 간단하게 쓸거면 yes, 아니면 no로 설정한다.

그렇다면 수동으로 IP를 관리하고자 한다면 어떻게 변경해야 하나?
바로 생소해 보이는 이더넷 식별자 아래 몇가지 사항을 추가하면 된다.
상하위 구분을 공백 수로 구분하기 때문에 공백으로 고생하는 파이썬 개발자들에겐 익숙할 것이다.

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
 version: 2
 renderer: networkd
 ethernets:
   ens33:
     dhcp4: no
     dhcp6: no
     addresses: [192.168.1.2/24]
     gateway4: 192.168.1.1
     nameservers:
       addresses: [8.8.8.8,8.8.4.4]

여기서 3가지 속성이 추가되는데, addresses, gateway4, nameservers 이다.
뭐 별거 없다. 순서대로 할당할 IP주소, IPv4 방식의 게이트웨이 주소, 그리고 DNS 서버다.
DNS 서버에 하위 항목인 addresses 속성을 추가하여 대괄호로 감싼 쉼표(,) 구분으로 IP를 부여하면 된다.
눈치 깠다면 알겠지만 당연히 IPv6 방식의 게이트웨이 설정은 gateway6이다.
그렇다면 IPv6 방식으로 세팅하려면? 그냥 배열 쳐넣듯이 멀티IP 추가하여 IPv4 IPv6 이렇게 넣는다.
아가리 벌려라 예제 날아온다!

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
 version: 2
 renderer: networkd
 ethernets:
   ens33:
     dhcp4: no
     dhcp6: no
     addresses: [192.168.1.2/24, '2001:1::2/64']
     gateway4: 192.168.1.1
     nameservers:
       addresses: [8.8.8.8,8.8.4.4]

자 이제 한가지 문제가 남았다. 서브넷 마스크는 어디로 간 것일까?
안타깝게도 서브넷 마스크 속성은 여기에 없다. 하지만, 할당 IP주소 뒤에 붙는 저 익숙치 않은 /24를 주목하자.
아는 사람은 알 것이다. 바로 저건 CIDR, 사이더라고 발음하는 마스킹 넘버다.
위 링크로 들어가면 슬래시 뒤에 들어가는 숫자를 “접두어 합침” 제목 아래 나열되어 있다. 저 숫자에 해당하는 서브넷 마스크를 친절하게 소개하니 참고하여 적용한다.
홈 네트워크나 소규모 네트워크라면 보통 IPv4의 경우 24, IPv6의 경우 64를 쓰면 된다. 끝자리 IP 개수만 할당하는 서브넷 마스크 255.255.255.0 주소와 동일하다.

자, 이제 수정을 했으니 적용해야겠지? 아래 명령어 한번 치면 끝난다.
sudo netplan apply

끝이다. 상당히 간결해졌다.
우부투 위키에서 소개하는 netplan 명령어가 몇가지 있는데, 소개하는 것으로 글을 마치도록 하겠다.

  • netplan generate : 명령어를 실행하면 네트워크 구성에 가장 필수적인 설정 파일을 생성하게 된다. 실수로 네트워크 구성이 망가졌을 경우 쓰면 되겠다.
  • netplan apply : 위에서 소개했듯이 변경한 네트워크 설정을 적용한다. 필요시 재시작할 수 있다.
  • netplan ifupdown-migrate : generate와 동일하긴 한데 /etc/network/interfaces 경로에 있는 네트워크 속성을 netplan 방식으로 마이그레이션 하는 명령어이다.

끗.

참고

composite / 2017년 11월 9일 / Piss Development / 0 Comments

WSL(윈도우 내 리눅스) 에서 데몬 유지 및 sshd 서버 돌리기

먼저 WSL의 특징을 설명하겠다.
일단 리눅스기 때문에 백그라운드 서비스, 즉, 데몬도 존재하며, 똑같이 돌아간다.
하지만 윈도우에서 bash 프로세스가 하나도 없으면, 리눅스 서비스는 다 죽고 리눅스 전원이 꺼진 것이나 다름없다.
그래서 윈도우를 키자마자 리눅스 서비스를 돌리고 싶으면 윈도우 시작하자마자 bash 프로세스를 돌려야 한다.
이를 기초하여 SSH 서버 데몬을 돌림으로 리눅스의 기능을 윈도우 시작 때부터 유지하는 방법을 설명하도록 하겠다.
이를 잘 정리한 링크로부터 출처를 가져왔다.

How to run sshd as a windows service ? #612
How to run Ubuntu service on Windows (at startup)?

  1. 윈도우에서 bash 실행한다.
  2. sudo dpkg-reconfigure openssh-server 실행하여 SSH 호스트 재구성한다.
  3. sudo nano /etc/ssh/sshd_config 실행하여 SSH 설정 파일 편집에 들어간다.
  4. UsePrivilegeSeparation 항목을 찾아 옆에 yesno로 변경
    (이유는 UsePrivilegeSeparation 옵션은 chroot() 호출을 WSL에서 아직 지원하지 않기 때문)
  5. 비번으로 접속하고자 할 경우 PasswordAuthentication 항목을 찾아 (없으면 추가) yes로 세팅.
    (만약 없으면 SSH 접속할 경우 키 파일을 요구함. 유저 파일에 키를 생성하고 클라이언트도 가지고 있어야 함.)
  6. ctrl+O 단축키로 저장 후 ctrl+X 로 편집기를 빠져나간다.
  7. sudo visudo 실행하여 sudo 권한설정 파일을 편집한다.
  8. 적당한 줄을 찾아 $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D 문구를 추가한 후, $USER를 로그인 이름으로 바꾼다.
    (로그인 이름 알고싶으면 pwd ~/ 쳐서 /home/ 뒤 명칭을 봐라.)
  9. 단축키로 저장 후 나가서 메시지 뜬 게 있는지 확인하고, 메시지 나올 경우 visudo 오류이므로 적절히 수정하여 해결한다. (모르면 검색해라.)
  10. (옵션) SSH 서버를 외부에서 접속하고 싶은 경우, 윈도우에서 방화벽에서 포트번호 22를 허용한다. (개인 및 도메인 범위까지 한다. 공용 말고)
  11. 윈도우 시작 시 SSH 서버를 돌리기 위해 (적당한파일명).vbs 파일을 메모장이나 아무 편집기로 생성 후 아래 내용을 넣는다.
set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
  1. 저장했으면, 모든 bash 프로세스를 끄고(리눅스 실행 모두 다 종료) vbs 파일을 더블클릭 후 PuTTY 등으로 SSH 접속 되는지 확인한다.
  2. 성공했으면 bash.exe 프로세스 종료 후, 위 vbs 파일을 작업 스케줄러에 등록한다. (모르면 좀 검색하고). 물론 “시스템 시작시”에.
    (시스템 시작 시, 파일은 vbs파일 다이렉트 호출, 사용계정은 반드시 로그인할 계정. LOCAL SERVICE 같은 시스템계정 말고. 암호 저장 안해도 됨.)
  3. 윈도우 껐다 킨 후 PuTTY로 SSH 접속 되는지 확인해서 접속 되면 이제 윈도우와 리눅스는 한몸으로 실제처럼 돌아갈 것이다. 서비스도 다.

왜 굳이 vbs로 하냐고? 물론 bat 파일 쓰거나 직접 작업 스케줄러에 등록할 수는 있어.
근데 작업 스케줄러던 bat 등록하던 뭘 하던 도스창 뜬다. 너같으면 좋겠냐? vbsws.run 에 두번째 0 인자가 바로 창 안띄워 주는 고마운 인자다.
내가 필요 시 즐겨쓰는 놈이기도 하지. 이제 리눅스 VM으로 깔 필요도 없다. 편리하다.

끗.

composite / 2017년 8월 25일 / Piss Development / 1 Comment

WSL(윈도우 서브시스템 리눅스) 에서 node.js 개발하기

오늘 좀 골때리는 경험을 했기에 글 싸지른다. 왜인지는 후에 설명한다.
이 글은 윈도우 10 레드스톤 2(크리에이터즈 업데이트) 이상에서 리눅스 서브시스템을 설치한 사용자에 해당된다.
안깔았으면 이전 글을 참고하고, 해당사항 없으면 씹기 바란다.

1. node.js 설치

먼저 apt-get 공식 리포지토리의 node 는 옛날 버전이다.
원하는 버전을 설치하고자 할 경우 리포지토리를 추가하여 설치해야 한다.
설치 버전별 목록은 여기서 볼 수 있다.
여기서는 가장 최신 버전인 7.x 버전을 설치하도록 하겠다.
별거 없다.

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -  
sudo apt-get install -y nodejs  

끗. 사실 윈도우에 별도로 node.js 깐 적 없다면 1번에서 끝나면 된다.
URL 끝 setup_(메이저버전).x 파일명 부분에 자신이 원하는 버전 숫자로 바꾸면 된다.
하지만 윈도우 내 개발환경에서 node.jsPython 등을 설치했을 경우 골때리는 문제가 발생할 것이다.
이제부터 들어간다.

2. 환경변수 관리

이 글을 쓰는 이유이기도 한데, 기본적으로 리눅스 서브시스템을 실행하면 윈도우 환경변수가 리눅스로 공유된다.
그래서 윈도우 PATH 변수가 먼저 들어간 뒤, 리눅스 PATH 변수 내용이 짬뽕된다.
이 때문에, 예를 들어 윈도우 내 node.js를 설치한 상태일 경우, npm 실행 시 아래 메시지가 나올 것이다.

$ npm
: not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
: not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
/mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")

물론 환경변수 공유는 편리할 수 있으나, 대부분 독립형 운영체제라 가정하고 설계하고 개발하기 때문에
개발자 입장에서는 난처하면서도 골 안때릴 수가 없다. 몇가지 방법이 있는데 취향껏 따라하면 된다.

윈도우 환경변수 공유하지 않도록 설정

윈도우 아니랄까봐 리눅스 서브시스템 옵션을 레지스트리에 등록하고 있다.
따라서 만약 윈도우 환경변수를 리눅스로 옮기기 싫으면 아래 레지스트리 소스를 메모장 등으로 붙여넣은 후,

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss]
"AppendNtPath"=dword:00000000

참고로 레지파일은 반드시 빈 행이 하나 들어가도록 한 뒤 끝내야 한다.
원하는 파일명.reg 로 저장한 뒤 걍 실행해버리면 된다. 물론 되돌리고 싶으면 값 부분에 dword:00000001 로 바꿔 실행하면 된다.

Github Issue 출처

.bashrc 파일에 원치 않는 변수내용 삭제

윈도우 환경 변수를 포기 못할 경우에 간단한 팁이다.
PATH 환경변수에 특정 내용을 지우는 식으로 처리할 수 있다.
아래 쉘 스크립트를 ~/.bashrc 파일 내용에 추가하면 원치 않는 변수 내용을 삭제할 수 있다.

### remove unnecessary Win PATHs
# This can prevent extension-less commands from bleeding into BASH.
# (eg. "ng" would execute the Win bin if "@angular/cli" wasn't installed on Linux.)
#
function path_remove {
  # Delete path by parts so we can never accidentally remove sub paths
  PATH=${PATH//":$1:"/":"} # delete any instances in the middle
  PATH=${PATH/#"$1:"/} # delete any instance at the beginning
  PATH=${PATH/%":$1"/} # delete any instance in the at the end
}

path_remove '/mnt/c/Users/me/AppData/Roaming/npm'
path_remove '/mnt/c/Users/me/AppData/Local/Yarn/bin'
path_remove '/mnt/c/Program Files (x86)/Yarn/bin'
path_remove '/mnt/c/Program Files/Git'
path_remove '/mnt/c/Program Files/Git/cmd'
path_remove '/mnt/c/Program Files/nodejs'
path_remove '/mnt/c/OpenSSL-Win32/bin'
path_remove '/mnt/c/Program Files (x86)/Python27'

이후 bash를 빠져나가고 다시 bash 실행하면 원치 않는 명령어 실행을 방지하여 조금은 더 깨끗한 환경에서 개발할 수 있을 것이다.
Github Issue 출처

composite / 2017년 8월 24일 / Piss Development / 0 Comments

윈도우 10 우분투 Bash를 탐색기 메뉴로 추가하기

제목 참 거창하지만 사실 별 거 없다.
어자피 오른쪽 마우스 메뉴와 별 다를 거 없기 때문이다.

윈도우 10 레드스톤 2(크리에이터즈 업데이트) 이상에서 우분투 서브시스템 설치 방법은 구글에 널리고 널렸으니 찾아봐라.
거기게 모든 게 다 있으니. 아니면 걍 링크 뿌린다. 여기가 친절한 듯.
(주: 스토어 단독 계정 등록만 해도 우분투 받는데 지장 없다. 특히 회사컴일 수록 로컬계정 관리가 정신건강에 이롭다.)

레지스트리 편집귀 귀찮게 건드릴 거 없다.
출처는 https://github.com/Manouchehri/bash-WSL-context-menu 이다.

bash 레지스트리 추가 (원문 컨텍스트 메뉴)
bash 레지스트리 추가 (한글 컨텍스트 메뉴)

됐다. 탐색기 오른쪽 클릭으로 잘들 써봐. 끗.

composite / 2017년 8월 22일 / Piss Development / 0 Comments