반응형

크로스 컴파일 환경: Ubuntu 12.04 (64-bit)

OpenWRT version: 14.07 (Barrier Breaker)

Tested device: Buffalo WZR-600DHP



<문제 발생 직전까지의 상황>

OpenWRT 액세스 포인트(AP)를 맨 처음 설치하고 나서 유선랜(ethernet)을 연결하면 DHCP를 통해서 자동으로 IP 주소(IPv4)를 받는다. 웹 인터페이스(LuCI)에 들어가서 무선랜(wlan0)을 활성화시키면, 기기들이 와이파이를 통해서도 DHCP 주소를 자동으로 할당받아서 연결할 수 있다.


여기서 나는 몇몇 기기들에 대해서 항상 같은 IP주소가 할당되도록 예약(static DHCP lease)을 하고 싶었고, 동시에 향후 연결될 수많은 다른 기기들을 위해서 dynamic DHCP 주소 할당 또한 여전히 작동되도록 하고 싶었다.

이것은 웬만한 AP에서는 모두 지원하는 기능이다. LuCI 웹 인터페이스에서는 Network > DHCP and DNS 메뉴를 누르면 하단에 "Static Leases" 섹션이 있고, 여기에 이름과 맥주소, 원하는 IP주소를 써서 설정할 수 있다.




<문제가 발생하기 시작했던 상황>

LuCI 웹 인터페이스 상의 Static Leases에 입력한 정보는 /etc/config/dhcp 파일에 기록된다. 나는 실험공간에 있는 약 20개의 기기들에게 모두 static DHCP lease를 통해서 IP주소를 고정하고 싶었고, 일일이 입력하기 귀찮아서 AP에 SSH로 접속해서 텍스트 파일로 설정을 붙여넣기 했다. (그리고 향후 실험을 위해 수시로 AP를 포맷하고 재설치해야 하기 때문에 가능하면 재설치 후 빠르게 설정할 수 있는 방법이 필요했다.)


그런데 /etc/config/dhcp 파일에 텍스트 파일로 설정을 붙여넣고 나면, 그 직후에는 잘 작동하지만, 이상하게 재부팅을 하고 나면 DHCP 서버가 작동을 하지 않는 것이었다. 즉, AP를 재부팅하고 나서 노트북에서 랜선을 꽂거나 와이파이 연결 시도를 해도 연결 시도만 하고, IP 주소를 할당받는 과정에서 더이상 진행을 못하는 것이었다. 이 증상은 스마트폰에서도 똑같이 일어났다.




<삽질과 예상밖의 현상>

*혹시 IPv6 설정 때문에 오류를 일으키는 건가 싶어서 액세스 포인트의 모든 IPv6 설정을 비활성화시켜 보았다. 여전히 DHCP 주소 할당이 되지 않았다.


*접속하는 클라이언트 머신(e.g. 노트북, 스마트폰 등)에서도 IPv6 기능이 있어서 그런 것 아닐까 하는 생각에 클라이언트 기기의 모든 IPv6 설정도 비활성화시켰지만, 여전히 문제가 해결되지 않았다.


*OpenWRT 크로스 컴파일 환경에 내가 코드를 약간 수정한 것이 생각나서, 내 코드가 전혀 들어가지 않은 깨끗한 최신 크로스컴파일 환경을 새로 다운로드받고 빌드해서 설치해 보았다. 여전히 되지 않았다. ㅠㅠ


*일단 액세스 포인트에 접속은 해야 돼서, 클라이언트 머신(노트북)에서 아예 고정IP를 설정하고 랜선을 꽂았더니 놀랍게도 액세스 포인트에 접근도 잘 되고 인터넷도 잘 되었다. 

  원래 DHCP 서버에 관계 없이 클라이언트에서 고정IP 주소를 스스로 설정(단, 액세스 포인트에서 현재 다른 기기에 할당하지 않은 빈 주소여야 함)해서 접속하는 방법은 다른 모든 액세스 포인트에서도 통하는 방법이다. 하지만 20개가 넘는 클라이언트 기기들을 모두 고정IP로 설정할 수는 없는 일이다.




<결국 발견한 문제의 원인 -_- >

/etc/config/dhcp에 붙여넣었던 텍스트 파일을 자세히 살펴본 결과, 같은 "이름-MAC주소-IP주소" 정보가 두 번씩 중복으로 적혀 있었다중복으로 적혀 있던 항목을 지우고 AP를 재부팅했더니 정상적으로 작동했다! ㅠ_ㅠ

다시 말해서, /etc/config/dhcp 파일에 static DHCP lease 정보를 하나라도 중복되게 입력하면 DHCP 서버가 정상적으로 작동하지 않는 것이다.



*결론: 텍스트 파일로 설정을 저장할 때에는 오타 또는 중복으로 복사된 내용이 없는지 꼼꼼히 확인해야 예상밖의 문제 발생을 방지할 수 있다. ㅠㅠ



반응형
블로그 이미지

Bryan_

,
반응형

크로스 컴파일 환경: Ubuntu 12.04 (64-bit)

OpenWRT version: 14.07 (Barrier Breaker)

Tested device: Buffalo WZR-600DHP


OpenWRT 크로스 컴파일 환경에서 운영체제(OS)직접 빌드하여 bin 파일을 만들고 대상 기기에 설치를 하고 나서, 리눅스 콘솔을 통해서는 접근이 가능하지만, 웹 브라우저를 통해서 볼 수 있는 웹 인터페이스(Web interface, GUI)가 안되는 경우가 있다.


이것은 luci 패키지가 설치되지 않았기 때문인데, OpenWRT 기기에 SSH로 로그인하고 나서 아래 명령을 통해서 "luci-i18n-"으로 시작하는 패키지가 검색이 되는지 확인할 필요가 있다.

(OpenWRT 기기에 SSH로 로그인한 뒤의 콘솔 화면에서)

# opkg list | grep luci


만약 위 명령을 통해"luci-i18n-*"(예를 들어, 영어 버전 웹 인터페이스에 해당하는 luci-i18n-english)이 하나도 검색되지 않는다면 opkg를 이용한 설치 과정이 어렵고 복잡해진다. 직접 의존성이 있는 관련 패키지를 모두 수동으로 다운로드 받아서 ipk 파일을 집어넣고 설치해야 하기 때문이다.



이 경우, 굳이 어렵게 할 필요 없이 크로스 컴파일 환경에서 luci 패키지가 포함되도록 설정하고 OpenWRT 운영체제를 다시 빌드해서 설치하는 것이 간편하다.


(OpenWRT 크로스 컴파일 환경의 최상위 디렉토리 위치에서)

$ ./scripts/feeds update packages luci

$ ./scripts/feeds install -a -p luci


또는 luci 뿐만 아니라 모든 업데이트된 패키지를 다 포함시키고 싶다면(모두 다 기기에 설치된다는 의미는 아니고, make menuconfig에서 설정 가능하도록 보이게 하겠다는 의미), 아래와 같이 입력한다.


$ ./scripts/feeds update

$ ./scripts/feeds install -a



위와 같이 하고 나서 make menuconfig 설정에 들어가 보면, 아래 그림과 같이 LuCI 메뉴에서 모듈 설치 여부를 선택할 수 있다.

$ make menuconfig




위 화면에서 "1. Collections" 메뉴에서 luci 또는 luci-ssl을 선택하면 된다. luci-ssl은 HTTPS를 통해서 웹 인터페이스에 접속할 수 있도록 해 주는 모듈이며, 기본적으로 luci를 포함한다.




위와 같이 선택하고 나서 Save를 통해 설정을 저장하고, 크로스 컴파일 환경을 빌드한 다음 대상 기기에 설치하면 별다른 설정 없이 기본적으로 웹 인터페이스에 접근이 가능해진다. OpenWRT 웹 인터페이스 주소는 기본적으로 192.168.1.1이다.





반응형
블로그 이미지

Bryan_

,
반응형

* 테스트해본 OS: Ubuntu 12.04 LTS (64bit)

* 컴퓨터: 조립PC(Intel Core i7, 16GB RAM), 노트북(Intel Core i5, 4GB RAM)

* OpenWRT version: backfire (10.03.1)

* 장비(액세스 포인트): Buffalo WZR-HP-G300NH



OpenWRT를 라우터/액세스 포인트에 설치할 때, 원하는 대로 소스코드를 고쳐서 올리려면 사용자가 직접 소스코드를 빌드해서 펌웨어 이미지를 만들어야 한다. OpenWRT 소스로부터 펌웨어 이미지를 직접 만들기 위한 교차 개발환경(Cross compile environment) 구축 방법은 아래와 같다.


우선 교차 개발환경을 구축할 컴퓨터에 SVN (Subversion)이 설치되어 있어야 한다. SVN이 없으면 아래와 같이 설치하고, 이미 설치되어 있으면 다음 단계로 넘어간다.

$ sudo apt-get install subversion



개발 환경을 저장하기 위한 적당한 디렉토리를 하나 만들고, OpenWRT 사이트에서 SVN을 통해서 소스(정확히 말하면, 소스코드 다운로드 받기 위한 Makefile 모음)를 받는다. 참고로 이 글에서 이용한 버전은 2014년 2월 기준에서 최신 버전은 아니다. 최신 버전의 이름은 Attitude_Adjuestment (12.09)이며, SVN 주소는 svn://svn.openwrt.org/openwrt/branches/attitude_adjustment 이다.

$ mkdir openwrt

$ cd openwrt

$ svn co svn://svn.openwrt.org/openwrt/branches/backfire


이 명령을 치면 금방 SVN 체크아웃이 끝나게 되는데, 왜냐하면 실제 소스코드를 모두 받지 않았기 때문이다. 용량도 약 37.6MB밖에 안된다. 실제로 소스코드를 받기 위해서는 make 명령을 실행해야 하며, 이 과정은 매우 오래 걸린다. (필자의 노트북을 기준으로 약 1시간) 그리고 make가 끝이 나면 패키지 옵션에 따라 차이가 있겠지만, Buffalo WZR-HP-G300NH 장비를 기준으로 소소한 옵션을 조금 추가해서 빌드했더 약 4.2GB 정도를 차지했다. ;;;


우분투(Ubuntu)를 기준으로 교차 개발환경을 위해 필요한 패키지를 아래와 같이 설치한다.

$ sudo apt-get install build-essential asciidoc autoconf binutils bison bzip2 flex gawk gettext libncurses5-dev libz-dev patch unzip zlib1g-dev


참고로 build-essential과 asciidoc 등을 포함한 몇몇 패키지는 꽤 많은 용량(수백 MB)을 필요로 한다.



SVN을 통해서 내려받은 OpenWRT backfire 소스에서 추가 패키지를 업데이트하고 다운로드받기 위해서 아래와 같은 명령을 수행한다.

$ cd backfire

$ ./scripts/feeds update -a

$ ./scripts/feeds install -a



여기까지 했으면 이제 실제로 소스를 얻어서 빌드를 하기 직전 단계까지 온 것이다. 실제로 소스를 얻고 빌드하는 make 명령을 수행하기에 앞서서 중요한 옵션을 설정할 필요가 있으며, make menuconfig를 통해서 설정할 수 있다.

$ make menuconfig


잠시(수 초~수십 초) 기다리면 콘솔에 아래와 같은 설정 화면이 나타난다.

(make menuconfig 명령어 실행 시의 첫 화면)


중요한 옵션은 Target System과 Target Profile이다. 각각 엔터를 눌러서 진입하면 칩셋과 모델의 목록이 나오는데, 원하는 모델을 선택하려면 키보드 방향키로 해당하는 항목 위에서 스페이스 키 또는 S 키를 누른다.


Buffalo WZR-HP-G300NH모델은 Atheros 계열 칩셋을 써야 하므로 Target System은 Atheros AR71xx/AR7240/AR913x를 선택하였다. Target Profile은 Buffalo WZR-HP-G300NH를 선택하였다.

(Target System과 Target Profile을 WZR-HP-G300NH에 맞게 설정한 화면)



이제 본격적으로 펌웨어 이미지를 빌드할 차례다. 아래와 같은 순서로 명령어를 친다. make에서 가장 시간이 오래 걸린다.

$ make defconfig

$ make prereq

$ make


빌드가 완료되면 backfire/bin/ar71xx/ 디렉토리에서 펌웨어 이미지를 찾을 수 있다. WZR-HP-G300NH의 경우 openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin 파일을 펌웨어 설치에 이용한다.


Buffalo 액세스 포인트에 OpenWRT 펌웨어 설치 방법 > 추후 작성 예정




반응형
블로그 이미지

Bryan_

,