NetworkManager + dnsmasq으로 인터넷공유 만들기


필요성, 궁금함, 현재 상황

  1. 메인 데스크탑을 무선랜으로 인터넷에 연결하고 사용함.
  2. 다른 기기들도 모두 기본적으로 무선으로 LAN접속.
  3. 다 좋은데, 메인 데스크탑 <-> 라즈베리파이 접속할때 ssh 접속도 느린거 같을때가 있음.
  4. 무선랜 접속이 많고, 블루투스 등등 다른 간섭도 많을거고,
  5. 어쨌든 조금 물리적으로 거리가 있는 무선공유기까지 갔다 오는거니까.
  6. 그래서 사용 안하고 있는 데스크탑의 내장 유선 랜포트로 인터넷연결을 공유하는 Private network을 만들어서 유선으로 연결해보기로 했다.
  7. 정말 체감이 빨라질지 궁금했고
  8. 직접 수동으로 설정하는게 거의 없거나,
  9. 내가 사용하고 있는 NetworkManager에서 쉽게 설정이 가능할거 같았다. - https://wiki.archlinux.org/index.php/NetworkManager#Sharing_internet_connection_over_Ethernet

진행과 추가적인 설정

  1. 그냥 nm-applet 사용해서 wired connection에 인터넷 공유를 체크한게 설정 전부.
  2. dnsmasq 패키지만 설치하고, 별도로 systemctl으로 enable/start한건 없음. (NetworkManager에서 자동으로 관리)
  3. 잘 동작함. ㅎㅎ
  4. 추가적으로, Private Network에 접속하는 호스트의 MAC 어드레스에 IP주소를 고정해서 접속이 편하도록 설정했다.

MAC주소에 고정IP 할당하기

  1. dnsmasq의 DHCP 설정을 추가한다.
  2. /etc/NetworkManager/dnsmasq-shared.d/static-ips.conf 파일을 작성했다.
  3. 별도의 재시작 없이, 파일 저장하고, 그냥 유선연결을 끊었다가 다시 연결하면 끝.
  4. 나머지는 NetworkManager이 다 자동으로 처리.

설정파일의 내용은 1:

Ping 07/02/2019


Golang 사랑

회사일로 Golang을 다시 잡고 쓰게됐다.

예전에도 잠깐 썼었는데1, 이번엔 그냥 더 오래 진지하게 필요에 의해서 쓰게됐다.

지금 일터에서도 필요에 의해서 작은 프로그램을 작성하고 할 일이 있어서 쓰다가 아예 서비스 코드에 적용을 하려 일하고있다.

많은걸 더 깊이 생각하고 익히는 좋은 계기로 꾸준하게 사용하고 있고, 만족스럽다. 대부분의 경우에. 그리고 Emacs와 연동도 좋고 언어 자체의 설계나 그런점들도 너무 좋은거 같다.

GC이 있는 언어를 최근에는 꺼리다가 다시 사용하니까 좋은것 같아. 그냥 문법적은 모호함이 없고 단순함, 머리에 쉽게 기억할만한 규칙들, 혹은 아예 어떤 규칙도 기억할 필요가 없도록 만들거나 하는게 얼마나 설계에 좋은지 깨닫는다.

Golang Goroutine, Channel, I/O 그리고 Scheduler 이해해보기


Go언어를 요즘에 진지하게 생각하고 계속해서 자료를 찾아보며 익히고 있다.

가장 흥미있는 부분은 Goroutine scheduler 구현과 I/O시스템을 어떻게 만들었을까인데, 아직은 소스코드를 뜯어 읽고 하지는 못하지만, 그냥 내가 만들었다면 아마 이렇지 않을까 하는 정도의 추측을 갖고 반대로 예제들을 만들어보며 확인해보고 있다.1

우선 현재의 추측은 다음과 같다.

  1. GOMAXPROCS 같은걸 이용해서 실행시간에는 필요한만큼만 최소한으로만 OS Thread을 시작하는듯. 2
    1. 너무 많은 스레드가 있어도 어차피 Context switching 비용만 늘어나고 별 의미는 커녕 더 나쁠 수 있으니까.
  2. Goroutine들은 Go runtime의 Scheduler이 서로 실행기회를 나눠준다.
    1. 실행기회를 다른 goroutine에 yield하는 방법은,
    2. I/O operation을 실행하거나
    3. Channel에 Receive/Send할때
  3. 위 (2.2)에서 I/O operation이 Async I/O으로 구현되었을거라고 생각.
    1. 왜냐하면, 그래야 blocking 안되고, Go scheduler으로 실행이 넘어가고,
    2. Go scheduler은 I/O event loop을 통해서 적절하게 다음에 실행할 Goroutine을 결정할 수 있을테니까.

예제 프로그램 코드

 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
39
40
41
package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

func timer(wg *sync.WaitGroup) {
	fmt.Println("timer started")
	select {
	case <-time.After(3 * time.Second):
		// NOTE: this never happens while it can't get any chance to run by scheduler
		wg.Done()
	}
}

func printer() {
	for {
		// DO NOTHING
		// NOTE: doing any I/O here can yield to gorountine scheduler
	}
}

func main() {
	var (
		wg = sync.WaitGroup{}
	)

	runtime.GOMAXPROCS(1)

	wg.Add(1)

	go printer()
	go timer(&wg)

	wg.Wait()

	fmt.Println("bye")
}

실행결과, 결론, 생각

예상한대로,