반응형

OS: Raspbian Jessie

Kernel version: 4.1.7-v7+

Device: Raspberry Pi 2 Model B



라즈베리 파이에서 리눅스 커널 헤더를 apt-get 으로 설치하면, 현재 OS가 실행 중인 것보다 낮은 버전이 설치된다. 실제 사용중인 버전의 커널 헤더를 설치하려면, 홈페이지에 가서 직접 다운로드받아서 설치해야 한다. (이전 포스팅의 1.2 Raspbian용 linux headers 다운로드/설치 항목 참조)


제는 이렇게 sudo dpkg -i로 헤더를 설치하면, 루트 권한으로 설치되면서 소스코드 파일의 퍼미션이 모두 루트만 읽고 쓸 수 있게 되어서 (아마도 600, -rw-------) 일반 유저 프로세스에서 접근할 수 없게 되는 것이다. 


이로 인해 아래와 같은 작업이 모두 루트 권한 없이는 불가능해진다:

  • 커널 모듈을 비롯해서 리눅스 헤더를 참조해서 빌드하는 경우 (make를 sudo make로 해야 되는 상황... 따라서 생성되는 파일이 모두 owner가 root가 되어버린다)
  • ctags 같은 vim 플러그인에서 리눅스 헤더 소스에 접근하지 못하게 됨 (permission denied 처리되면서 소스코드를 로딩하지 못함.)


일단 설치 자체가 루트 권한 없이 불가능하므로, 설치를 다 하고 나서 수동으로 퍼미션을 조정하기로 했다. 일단 리눅스 헤더 최상위 디렉토리 위치에서, 하위 디렉토리에 있는 모든 소스 파일에 644 퍼미션을 줘서 root가 아니어도 read-only 접근이 되도록 했다.


$ cd /usr/src/linux-headers-$(uname -r)

$ sudo chmod -R 644 ./*



이렇게 했더니 하위 디렉토리에 접근 자체가 안된다. 

생각해 보니 디렉토리는 755 퍼미션(drwxr-xr-x)을 줘야 한다. ㅡㅡ;

다행히, 현재 위치에서 하위에 있는 모든 디렉토리의 퍼미션을 755로 변경하는 방법도 있다. [1]


$ cd /usr/src/linux-headers-$(uname -r)

$ sudo chmod 755 $(sudo find ./ -type d)



<추가사항>

여기까지 하면 ctag 같은 작업에는 문제가 없지만, make는 여전히 안될 때가 있다.

가끔 make가 scripts 디렉토리에 있는 실행 파일을 써야 할 때가 있어서 그렇다.

scripts 디렉토리에 있는 실행 파일들도 디렉토리와 마찬가지로 755 퍼미션을 걸어 줘야 한다.

$ cd /usr/src/linux-headers-$(uname -r)/scripts

$ sudo chmod -R 755 ./*

$ sudo chmod -R 644 ./*.[ch]


scripts 디렉토리 안에 실행파일이 아닌 소스 파일들도 있어서 소스 파일은 그냥 실행 옵션을 뺐다.


이제 sudo 없이 make도 잘 되고, ctags도 잘 작동한다. ^^




<참고자료>

[1] "How to chmod all directories except files (recursively)?", http://superuser.com/questions/91935/how-to-chmod-all-directories-except-files-recursively/91966




반응형
블로그 이미지

Bryan_

,
반응형

Model: Raspberry Pi 2 Model B

OS: Raspbian Jessie (2015.09.24)

Kernel: 4.1.7-v7+

gcc: 4.7.3

WLAN device: Netis WF2190 (RTL8812au)


라즈베리파이에 RTL8812au를 소스코드에서 빌드하는 순서는 PC에서 하는 것과 같고, 다만 Makefile 내용만 약간 수정하면 된다. [1]



<선행 요구사항>

*리눅스 헤더 소스가 설치되어 있어야 한다.

*그외 빌드에 필요한 패키지들이 필요할 수 있다. Make 과정에서 빌드 에러가 나는 경우 해당 에러를 없애줄 관련 소스코드를 설치하는 식으로 해야 할 듯.

*라즈베리파이가 인터넷에 연결되어 있어야 한다.



<참고: 라즈베리파이 리눅스 헤더 설치>

사실 커널 버전 4.1.7-v7+ 를 apt-get install에서 설치할 수 없다. 그래서 직접 리눅스 헤더 소스를 받아서 수동 설치해야 하고, 수동으로 설치하려면 특정 버전의 gcc와 dkms가 필요하다. 현재는 gcc-4.7을 필요로 하고 이것은 apt-get install로 되길래 설치했다.


$ sudo apt-get install gcc-4.7

$ sudo apt-get install dkms

(참고로 둘다 수십 MB의 저장 공간을 필요로 한다.)


헤더 소스 설치파일은 deb 파일로 되어 있어서 dpkg로 설치한다.


$ sudo dpkg -i linux-headers-4.1.7-v7+_4.1.7-v7+-2_armhf.deb




<RTL8812AU 드라이버 설치>


PC용 설치와 마찬가지로 git에서 드라이버 소스코드를 받는다.


$ git clone https://github.com/gnab/rtl8812au.git

$ cd rtl8812au



Makefile을 열고 아래와 같이 일부분을 수정한다.


...(생략)...


CONFIG_MP_INCLUDED = n

CONFIG_POWER_SAVING = n

CONFIG_USB_AUTOSUSPEND = n

CONFIG_HW_PWRP_DETECTION = n

CONFIG_WIFI_TEST = n

CONFIG_BT_COEXIST = n

CONFIG_RTL8192CU_REDEFINE_1X1 = n

CONFIG_INTEL_WIDI = n

CONFIG_WAPI_SUPPORT = n

CONFIG_EFUSE_CONFIG_FILE = n

CONFIG_EXT_CLK = n

CONFIG_FTP_PROTECT = n

CONFIG_WOWLAN = n


...(중략)...


CONFIG_PLATFORM_I386_PC = n

CONFIG_PLATFORM_ANDROID_X86 = n

CONFIG_PLATFORM_JB_X86 = n

CONFIG_PLATFORM_ARM_S3C2K4 = n

CONFIG_PLATFORM_ARM_PXA2XX = n

CONFIG_PLATFORM_ARM_S3C6K4 = n

CONFIG_PLATFORM_ARM_RPI = y

CONFIG_PLATFORM_MIPS_RMI = n


...(생략)...


이어서 빌드 및 설치 과정을 진행하면 된다.

$ make
$ sudo make install
$ sudo mobprobe 8812au





<참고자료>

[1] https://www.raspberrypi.org/forums/viewtopic.php?p=706261



반응형
블로그 이미지

Bryan_

,
반응형

Model: Raspberry Pi 2 Model B V1.1

USB WLAN: TP-LINK TL-WN722N (Atheros ath9k_htc)


라즈베리파이를 무선 메쉬 네트워크의 메쉬 라우터로 만드는 과정에서, USB 무선랜카드 2개를 꽂으면 하나가 매우 자주 연결이 끊어지는 현상이 발생했고, 자세히 확인해 보니 아예 device driver가 죽었다가 다시 살아나기를 반복하고 있었다. 그 현상은 아래와 같이 demsg 화면에서 확인할 수 있다. 그림 속 빨간 색 글씨와 같은 에러가 대략 10여 초를 주기로 계속 발생한다. 즉, 겉으로 보면 USB 무선랜카드의 전원 LED가 10초를 주기로 꺼졌다가 켜지기를 반복한다. 당연히 네트워킹은 안 된다.


(2개 이상의 ath9k_htc 계열 USB 무선랜카드를 연결했을 때 자주 보게 되는 에러 메시지. 

저런 식으로 인터페이스 이름이 지속적으로 커져서 phy30이 넘은 적도 있었다... -_-)


5V/2A의 저전력에 의지하는 라즈베리파이 입장에서 USB 무선랜카드 2개를 동시에 쓰면 1개만 쓸 때에 비해서 아무래도 전력이 부족할 가능성이 높다. 게다가 알고 보니 내가 실험에 사용하는 TL-WN722N 모델이 USB 포트를 통한 전력 공급에 문제가 있는 것 같았다. 한 마디로 설상가상이다. ㅜㅜ 

어디선가 영어로 된 페이지에서 알려진 이슈로 위와 같은 현상이 언급되어 있었던 기억이 난다. 지금으로써는 비교할 만한 다른 ath9k_htc 계열 무선랜카드가 없어서 이것이 결함인지 아닌지 알 길이 없다. (그래도 어느정도 결함 수준으로 봐야 할 정도다.)


더 큰 문제는, 안그래도 전력을 많이 쓰는 녀석이 몸집마저 커서 Raspberry Pi 2 Model B에서는 두 개를 동시에 USB 포트에 직접 꽂을 수도 없다는 사실이다. 이것은 사실 라즈베리파이 2 모델의 디자인으로 인해서 생기는 문제이기도 한데, USB 포트 4개가 한 곳에 몰려 있기 때문에 연결되는 USB 객체가 조금이라도 크기가 커지면 연속으로 (심지어 대각선으로도) 꽂을 수가 없다.


그래서 아래 사진과 같이 하나는 USB 포트에 직접 꽂고, 다른 하나는 USB 확장 케이블을 통해서 연결해야만 했다.



그리고 예상대로, USB 확장 케이블(대략 1~1.5m 쯤 되는 듯)을 통해서 연결된 무선랜카드에서만 위의 dmesg 화면과 같이 디바이스 라이버가 재시작하는 문제가 지속적으로 봘생했다. 어쩌다 한 번씩 멀쩡하게 작동하는 듯 했지만, 하루가 지나고 보면 어김없이 하나는 꺼져 있었다.


결국, 매번 재부팅시키고 아슬아슬하게 살아 있기를 바라기만 해서는 정상적인 실험이 불가능하다고 판단하고, 가장 무식하지만 가장 확실한(...) 물리적인 해결책을 사용했다. 그 무식한 방법은 그냥 뚱뚱한 껍데기를 뜯어내는 것 -_-;;

나사가 하나도 없기 때문에 가장자리에서부터 힘으로 열려고 노력하면 생각 외로 잘 뜯어진다(...).  


그 결과...



이제 동시에 무선랜카드 2개를 USB 포트에 직접 꽂을 수 있게 되었고, 신기하게도 디바이스 드라이버가 재시작하는 현상이 말끔히 사라졌다.


...다음부터는 Atheros 계열 무선랜카드를 살 때, 알려진 문제점이 없는지 좀더 검색해 보고 사는 것이 좋겠다. ㅜㅜ



반응형
블로그 이미지

Bryan_

,
반응형

Model: Raspberry Pi 2 Model B

OS: Raspbian Jessie (2015.09.24)

WLAN: TP-LINK TL-WN722N (Atheros ath9k_htc)


라즈베리파이에 USB 무선랜카드를 연결하고, 이 무선랜카드를 더 자세히 제어해야 할 필요가 생겼다. 이를 위해 무선 네트워크 디바이스 드라이버 관련 오픈소스 패키지(Backports)에서 직접 소스코드를 수정하고 빌드하기로 하였다.


*주의사항: 이 방법은 서버나 PC에서 라즈베리파이 전용 device driver를 크로스 컴파일(cross-compile)하는 방법에 비하면 결코 좋은 방법은 아니다. 원래 정석은 강력한 PC에서 소스코드를 라즈베리파이에 맞게 ARM 계열 아키텍처로 설정하고 기타 조건을 지정한 다음 디바이스 드라이버 파일들(.ko 파일들)만 라즈베리파이에 복사해서 재시작하는 방법이다. backports를 크로스 컴파일하는 방법이 잘 정리된 글을 아직 찾지 못해서 임시방편으로 이렇게 하게 되었다.



1. 사전 준비


1-1. 필요한 패키지 사전 설치


$ sudo apt-get install dkms

$ sudo apt-get install libncurses5-dev


1-2. Raspbian용 linux headers 다운로드/설치


NOTE: (2016년 1월 18일에 확인) sudo apt-get install linux-headers-rpi 명령으로는 최신 커널 버전의 헤더를 받을 수가 없다. 따라서  인터넷에서 직접 커널 헤더 설치파일을 받아서 설치하였다.


우선 현재 라즈베리파이에 설치된 Raspbian이 쓰는 커널 버전부터 확인한다.

$ uname -a

Linux raspberrypi 4.1.7-v7+ #817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015 armv7l GNU/Linux


Linux raspberrypi 뒤에 적힌 버전 숫자와 일치하는 linux headers deb파일을 아래 페이지에 가서 다운로드 받는다.

https://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/


다운로드 받은 리눅스 헤더 설치:

$ sudo dpkg -i [다운로드 받은 헤더 설치파일].deb





2. Backports 소스코드 빌드 및 설치 환경 구축


2-1. Backports 소스코드 다운로드


https://www.kernel.org/pub/linux/kernel/projects/backports/stable/



2-2. Backports 소스코드 빌드를 위한 설정


특정 무선랜 인터페이스 소스코드를 사용하기 위해 프리셋 설정에서부터 시작하는 것이 안전하다. 어떤 프리셋이 있는지 아래 명령으로 확인한다. 참고로 make가 정상적으로 작동하기 위해서는 KLIB argument에서 헤더를 정확히 지정해 주어야 한다.

$ make KLIB=/lib/modules/4.1.7-v7+/ defconfig-help


필자의 경우 TP-LINK TL-WN722N (Atheros ath9k_htc) 무선랜카드를 쓰고 있기 때문에 ath9k 프리셋을 설정하였다.

$ make KLIB=/lib/modules/4.1.7-v7+/ defconfig-ath9k


이렇게 설정파일(.config)이 만들어진 상태에서 세부 설정을 추가하고 싶으면 아래 명령을 입력한다.

$ make KLIB=/lib/modules/4.1.7-v7+/ menuconfig



(backports 패키지의 make menuconfig 예시)



Wireless LAN > Atheros WIreless Cards > Atheros ath9k_htc debugging 항목 선택

 - 이렇게 하면 ath9k_htc의 debugfs 파일들이 /sys/kernel/debug/ieee80211/phyX/ 폴더 하위에 표시된다. (phyX = phy0, phy1, ... )


(Atheros ath9k 계열의 디버깅 설정)



2-3. Backport 소스코드 빌드 및 설치


설정이 끝나면 빌드를 한다.

$ sudo make KLIB=/lib/modules/4.1.7-v7+/


NOTE: 원래 sudo 없이 빌드가 되어야 하는데, 이상하게 리눅스 헤더를 deb 파일에서 dpkg로 설치하고 나면, 해당 버전의 헤더는 루트 권한 없이는 make가 진행되지 않는 문제가 있다. 이것을 해결하려면 /lib/modules/4.1.7-v7+/ 하위 파일들의 실행 권한을 루트가 아닌 사용자에게도 허용해야 하는데, 일단은 복잡하게 변경하지 않고 sudo make로 빌드하였다. 

(이렇게 진행해도 문제가 없었다.)


참고로 라즈베리파이에서 직접 컴파일하기 때문에 시간이 오래 걸린다. 이미 앞서 언급했지만, 크로스 컴파일에 비하면 좋은 방법이 아니다. 단지 아직 확실하게 크로스 컴파일하는 방법을 몰라서 일단 되는 방법부터 시도한 것이다.


빌드가 끝나면 운영체제에 디바이스 드라이버(device driver)를 설치한다.

$ sudo make KLIB=/lib/modules/4.1.7-v7+/ install





3. 재시작 및 테스트


설치가 끝나면 재부팅해서 작동 여부를 확인한다. 쉘에서 dmesg를 쳐서 오류 메세지가 뜨는 것은 없는지 확인해볼 것.


라즈베리파이는 전력이 약하기도 하고, 내가 테스트에 사용한 TL-WN722N이 하필이면 고질적으로 USB 포트에 따라 작동을 잘 하거나 전혀 작동하지 못하는 문제가 있기 때문에 dmesg에서 문제없이 디바이스 드라이버가 로드되었는지 점검하는 것이 필요하다. 아래는 2개의 USB 무선랜카드 중 1개가 제대로 작동하지 못해서 dmesg에서 오류가 발생한 예시이다.



위와 같은 오류가 발생할 때, 현재로써는 완전한 해결책을 찾지 못했다. 그저 USB 무선랜카드를 USB 포트에서 완전히 뺐다가 다시 꽂거나, 라즈베리파이 전원을 통째로 뺐다가 꽂으면 약 50% 확률로 정상 작동하였다.



반응형
블로그 이미지

Bryan_

,
반응형

OS: Raspbian Jessie (2015.09.24)

HW: Raspberry Pi 2 Model B

WLAN: TL-WN722N (ath9k_htc)



무선 메쉬 네트워크(wireless mesh network)는 우리나라에서는 일상 영역에서는 잘 쓰이지 않지만(그냥 AP 하나가 유선망에 직접 연결되어 무선 인터넷을 제공하는 경우가 많고, 이것은 메쉬 네트워크라고 하기에는 너무 제한적), 미국을 비롯한 넓은 지역에 인터넷 액세스를 제공하기 위한 저렴하고 유연한 방법으로 많이 쓰이고 있으며, 연구나 특수한 목적을 달성하기 위해서도 자주 쓰인다.


나도 연구 차원에서 메쉬 네트워크 실험 환경을 구축해야 될 필요성에 따라 라즈베리파이를 메쉬 라우터(mesh router)로 활용하는 형태로 구성해 보았고, 성공적으로 연결이 되는 설정을 기록하고자 한다. 다만 말 그대로 연결만 가능한 상태이기 때문에, 이 상태에서 앞으로 성능을 개선하기 위해 여러가지 설정 변경을 해야 할 것이다. (테스트 결과, 인터넷 속도는 100KB/s가 채 되지 않는 듯 하다. ㅜㅜ)


라즈베리파이 3개가 각각 AP 역할을 수행할 뿐만 아니라 서로 또다른 무선 네트워크를 통해 연결됨으로써, 하나의 AP에 연결된 모바일 기기가 다른 AP에 연결된 모바일 기기에 직접 연결(direct communication)하도록 하는 것이 목표이다. 즉, 인터넷 연결 없이 AP들끼리 패킷을 전달한다. 이를 위해, 각 라즈베리파이는 최소 2개의 무선랜 인터페이스(무선랜카드) 필요로 한다. 하나는 모바일 기기들을 연결하기 위한 것이고, 다른 하나는 메쉬 라우터들끼리 연결하기 위한 것이다. 여기서 무선랜 인터페이스 개수가 더 늘어나면, 여유 자원으로 성능을 개선하는 데 활용할 수 있다.


(무선 메쉬 네트워크 구성)




<준비물>

  • Raspbian이 설치된 라즈베리파이 2~3개
  • 5V/2A 이상의 전원 어댑터 (USB 무선랜카드를 2개 쓰기 때문에 전력이 안정적으로 공급되어야 한다. 경험상 5V/2A 중에서도 품질이 나쁘면 전력이 잘 공급되지 않아서 계속 재부팅되는 문제가 있었다.)
  • USB 무선랜카드: 라즈베리파이 각각에 2개씩 연결해야 하므로 라즈베리파이 개수의 2배만큼 필요
  • 유선 공유기(인터넷 연결과 라즈베리파이 설정을 쉽게 하기 위해서 필요)
  • 랜선(유선 공유기와 라즈베리파이 간 연결)




1. 라즈베리파이 초기 설정


향후 안정적인 사용을 위해 Locale, time, keyboard layout, SD카드 전체 용량 활용을 위한 resize 설정 등을 해 둔다.

$ sudo raspi-config


자세한 설정 방법은 산딸기마을 이장 나무꾼님의 글(http://www.rasplay.org/?p=3786)을 참고할 것.




2. 필요한 패키지 설치


2-1. 라즈베리파이의 기본 네트워크 설정 서비스 삭제


$ sudo apt-get purge raspberrypi-net-mods ifplugd

 - 이유: /etc/network/interfaces 파일을 이용한 설정이 제대로 작동하기 위해서 다른 설정 도구를 지워야 한다.

 - 이 부분은 사용자마다 네트워크 설정에 사용하는 방법이 조금씩 달라서(리눅스 배포판에 따라서도 다르다) 본의 아니게 특정한 방법을 강요하는 것이 될 수도 있다. 하지만 필자는 네트워크 설정시 GUI를 이용하는 것을 싫어하기 때문에(그냥 AP에 연결할 때를 제외한 ad-hoc network 등의 다양한 설정을 하다 보면 원하는 대로 작동하지 않는 경우가 많다. 특히 우분투에 내장된 NetworkManager가 악명이 높다.) 전통적인 방법인 /etc/network/interfaces 파일을 핵심으로 하는 설정을 사용한다.


2-2. 필요한 패키지 설치: hostpd, isc-dhcp-server, quagga


$ sudo apt-get update

$ sudo apt-get install hostapd isc-dhcp-server quagga

 - hostapd: 리눅스를 액세스포인트(AP)로 작동하도록 해 주는 서비스

 - isc-dhcp-server: AP에 연결되는 클라이언트에게 IP주소를 발급하기 위한 DHCP 서버 서비스

 - quagga: 라즈베리파이와 클라이언트들이 서로 통신할 수 있도록 경로를 설정하는 라우팅 패키지(quagga에 여러 라우팅 프로토콜이 내장되어 있는데, 그 중에서 RIP를 쓰고자 한다.)

 - 이 패키지들 설치를 위해서 라즈베리파이가 인터넷에 연결되어 있어야 한다.




3. 네트워크 설정


3-1. /etc/network/interfaces

auto lo

iface lo inet loopback


auto eth0

iface eth0 inet dhcp


# AP로 사용할 무선랜카드 설정

# 1번 노드 address: 10.0.1.1, 2번 노드: 10.0.2.1, 3번 노드: 10.0.3.1

auto wlan0

iface wlan0 inet static

  address 10.0.1.1

  netmask 255.255.255.0

hostapd /etc/hostapd/hostapd.conf # DHCP 서버 실행을 위해서 필요하다.


# 라즈베리파이들이 서로 통신하기 위한 애드혹 네트워크 설정

# 1번 노드 address: 192.168.3.1, 2번 노드: 192.168.3.2, 3번 노드: 192.168.3.3

# 주소 대역은 필자의 경우 192.168.3.X로 했지만, 다른 대역을 써도 된다.

# 다만, 192.168.0.X는 기존 공유기에서 워낙 많이 쓰기 때문에 오류 방지를 위해 안 쓰는 것이 좋다.
# wireless-essid, wireless-channel 값은 3개 모두 똑같아야 한다.

auto wlan1

iface wlan1 inet static

  address 192.168.3.1

  netmask 255.255.255.0

  wireless-channel 11

  wireless-essid RpiAdhoc

  wireless-mode ad-hoc



3-2. /etc/hostapd/hostapd.conf

 여기서 지정하는 interface 항목은 3-1에서 AP로 사용하려는 인터페이스 이름과 일치해야 한다.

interface=wlan0

driver=nl80211


# 1번 노드: RpiAP1, 2번 노드: RpiAP2, 3번 노드: RpiAP3 

ssid=RpiAP1


# 무선랜 작동 모드, 802.11n도 일단 g로 표기해야 한다.

hw_mode=g


# 802.11n 모드를 켜려면 아래 4줄을 추가한다. 이것은 무선랜카드 특성에 따라서 될 수도, 안될 수도 있다.

# 일단 위의 hw_mode=g 만 먼저 입력해서 되는지 확인한 다음에 아래 옵션을 추가하도록 하자.

ieee80211n=1

wmm_enabled=1

ieee80211d=1

country_code=US


# 1~11 중에서 지정할 수 있다. 가급적 1,6,11 중 하나를 고른다.

# 애드혹 네트워크에서 쓰는 채널과 다르게 지정하는 것이 좋다.

channel=6


macaddr_acl=0

auth_algs=1

ignore_broadcast_ssid=0



3-3. /etc/dhcp/dhcpd.conf

이 파일은 이미 존재해야 정상적인 상황이다.

이미 존재하는 파일을 열고, option domain-name-servers, default-lease-time, max-lease-time, authoritative 항목의 주석을 해제하고 원하는 도메인 네임 서버 주소와 DHCP주소 할당 시간을 입력한다.

option domain-name-servers 8.8.8.8; # 그외 원하는 DNS 서버 주소 사용 가능

default-lease-time 600;

max-lease-time 7200;


authoritative;


그리고 맨 아래에 아래 내용을 추가한다. 아래와 같이 설정하고 클라이언트가 1번 노드에 연결할 경우, 클라이언트는 DHCP를 통해서 10.0.1.10부터 10.0.1.250 사이의 주소를 발급받게 되고, 보통은 10부터 순서대로 발급받게 된다.


1번 노드의 경우:

subnet 10.0.1.0 netmask 255.255.255.0 {

range 10.0.1.10 10.0.1.250;

option routers 10.0.1.1;

}


2번 노드의 경우:

subnet 10.0.2.0 netmask 255.255.255.0 {

range 10.0.2.10 10.0.2.250;

option routers 10.0.2.1;

}


3번 노드의 경우:

subnet 10.0.3.0 netmask 255.255.255.0 {

range 10.0.3.10 10.0.3.250;

option routers 10.0.3.1;

}



3-4. /etc/quagga/*

zebra.conf (없으면 새로 만든다.)

hostname Router

password zebra

enable password zebra

debug zebra events

debug zebra packet

ip forwarding

log file /var/log/quagga/zebra.log



ripd.conf (없으면 새로 만든다.)

참고로 quagga 설정파일은 주석을 사용하는 문법이 다르기 때문에(!로 시작하는 라인만 주석처리), 아래의 파란색 글씨(<-- 이후)는 쓰지 말 것.

hostname ripd

password zebra

debug rip events

debug rip packet

router rip

 version 2

 network 10.0.1.0/24  <-- 1번노드의 경우임. 2번은 10.0.2.0/24, 3번은 10.0.3.0/24

 network 192.168.3.0/24  <-- 라즈베리파이들의 애드혹 네트워크

 network 192.168.1.0/24  <-- 라즈베리파이의 유선(eth) IP주소 대역. 인터넷 연결을 위해 필요

log file /var/log/quagga/ripd.log


위 설정에서 192.168.1.X는 필자의 유선공유기 IP주소에 해당한다. 각자의 공유기에서 할당받는 IP주소(즉, 라즈베리파이의 eth0 인터페이스가갖는 주소) 대역에 맞게 수정해야 한다.

그리고 진정한 메쉬 네트워크의 작동을 보고 싶으면, 1번 노드를 제외한 나머지 2개의 라즈베리파이에서는 마지막 eth0의 IP주소 대역을 삭제한다. 그러면 인터넷은 1번 노드에서만 연결되고, 나머지 노드들은 1번이 제공하는 인터넷을 자신의 클라이언트들에게 제공할 것이다. 물론 속도는 더 느려진다. (애초에 메쉬 네트워크의 목적 중 하나가 더 넓은 Internet coverage니까)



3-5. 설정 적용을 위한 서비스 재시작(또는 재부팅)

$ sudo /etc/init.d/networking restart

$ sudo /etc/init.d/hostapd restart

$ sudo /etc/init.d/isc-dhcp-server restart

$ sudo /etc/init.d/quagga restart


또는 그냥 라즈베리파이를 아예 재부팅한다. 여기까지 하면, 라즈베리파이는 유선랜을 통해서 인터넷이 되지만 새로 만든 AP를 통해서 연결하는 클라이언트들은 서로 접속은 되지만 인터넷은 안되는 상태가 된다. 인터넷 연결 설정 방법은 5단원을 참고할 것.



4. 테스트


4-1. 클라이언트(스마트폰, 노트북 등) 연결

  3-5까지 설정을 마치고 나서 스마트폰에서 와이파이 검색을 하면, RpiAP1, RpiAP2, RpiAP3이 보일 것이다.

메쉬 네트워크가 제대로 설정되었는지 확인하기 위해서는 2대 이상의 클라이언트 기기로 서로 다른 AP에 연결해야 한다.


4-2. Ping

  한쪽 클라이언트에서 다른 AP에 연결된 다른 클라이언트의 IP주소로 Ping을 날려서 되는지 확인한다.

예를 들어, RpiAP1에 연결된 클라이언트(10.0.1.10)에서 아래와 같은 기기들에게 ping을 날려서 정상적으로 되어야 한다.

  • RpiAP2 (10.0.2.1)
  • RpiAP3 (10.0.3.1)
  • RpiAP2에 연결된 클라이언트(10.0.2.10 ~ 10.0.2.250 중에 할당받은 주소)
  • RpiAP3에 연결된 클라이언트(10.0.3.10 ~ 10.0.3.250 중에 할당받은 주소)

스마트폰에서는 terminal emulator 같은 콘솔 앱을 가지고 테스트할 수 있다. RIP가 라우팅 정보를 교환하는 데 조금 시간이 걸릴 수도 있으므로 클라이언트를 바꿔 가며 여러 차례 ping을 날려 본다.




5. 인터넷 연결 설정


5-1. /etc/sysctl.conf 

설정 파일에서 net.ipv4.ip_forward=1 라고 적힌 라인의 주석 해제(앞에 있는 # 제거)

net.ipv4.ip_forward=1

 (AP로 쓰지 않는 일반 리눅스는 보안상 포워딩이 기본적으로 금지되어 있어서 직접 해제해야 한다.)


그리고 서비스 재시작: 

$ sudo sysctl -p /etc/sysctl.conf



5-2. iptables 설정

1번 노드의 경우:

$ sudo iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24  -j MASQUERADE

2번 노드의 경우:

$ sudo iptables -t nat -A POSTROUTING -s 10.0.2.0/24 ! -d 10.0.2.0/24  -j MASQUERADE

3번 노드의 경우:

$ sudo iptables -t nat -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24  -j MASQUERADE


참고로 iptables 설정은 재부팅하면 사라지므로, 부팅할 때마다 자동 실행되도록 설정해 두면 좋다. Raspbian 같은 데비안 계열은 /etc/rc.local 파일의 맨 끝에 exit 0 바로 위에 원하는 스크립트를 추가하면 된다.




*기타 Troubleshooting

 - ripd가 정상 실행되지 않는 경우: /var/log/ 디렉토리 밑에 quagga 디렉토리가 없으면 만들어 주고, owner:group을 quagga:quagga로 지정한다. sudo chown 명령어를 사용한다.

 - 라즈베리파이가 자꾸 저절로 재부팅되는 경우: 전력 부족일 경우가 많다. 위에서도 언급했듯이, 무선랜카드 2개를 쓰기 때문에 전력 소모가 좀더 많아지므로 전원 어댑터를 2A 이상으로 쓸 것. (5V/2A)



반응형
블로그 이미지

Bryan_

,