반응형

OS: Ubuntu 14.04.2 LTS (64-bit)

QulNet version: 5.0.1


리눅스에서도 QualNet GUI를 쓸 수 있고,

[QUALNET_HOME]/bin/QualNetGUI 파일을 실행하면 된다.

(더블클릭하거나, 콘솔에서 명령어 입력)


그런데 더블클릭해도 아무것도 실행되지 않고, 콘솔에서 시도해 보면 아래와 같은 에러가 나면서 실행이 안될 때가 있다.


user@Linux:~/qualnet/5.0/bin$ ./QualNetGUI 

/home/user/qualnet/5.0/gui/lib/linux64/QualNetGUI: error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory


이 때 간단히 libjpeg 라이브러리를 설치하면 해결된다.

$ sudo apt-get install libjpeg62



반응형
블로그 이미지

Bryan_

,
반응형

OpenWRT version: 14.07 (Barrier Breaker)

Tested device: Buffalo WZR-600DHP

설치에 사용한 PC: Ubuntu 12.04.1 LTS (64-bit)


이 글에서는 라우터(또는 액세스 포인트, 여기서는 라우터로 표현)에 OpenWRT를 설치하는 여러가지 방법들 중에서 TFTP를 활용한 설치 방법을 설명한다. 라우터가 TFTP 서버를 돌리고 있는 경우에 한해 TFTP를 통해서 펌웨어 파일을 라우터에 전송하고, 라우터는 이렇게 전송받은 펌웨어를 설치하는 방식으로 진행된다. 이 글에서 설치 과정에 사용한 라우터 모델은 Buffalo WZR-600DHP이다.




<설치에 필요한 준비물>


  • OpenWRT 펌웨어(.bin 확장자) 중에서 TFTP 설치용 파일 (파일명에 tftp가 들어가 있음)
    (예: openwrt-ar71xx-generic-wzr-600dhp-squashfs-tftp.bin)
  • 랜선 연결 가능한 리눅스 컴퓨터
  • 라우터(Buffalo WZR-600DHP)


크로스 컴파일 환경에서 직접 빌드해서 펌웨어를 만드는 방법은 이전 포스팅(http://skylit.tistory.com/76)을 참고할 것. 또는 이미 빌드된 펌웨어를 여기(http://wiki.openwrt.org/toh/buffalo/wzr-600dhp)에서 받을 수 있다. 하지만 자신에게 필요한 소프트우어 패키지를 추가하는 등의 customization을 하고 싶다면 크로스 컴파일 환경을 구축해야 한다.


크로스 컴파일 환경에서 빌드(make)를 끝내고 나면 아래 위치에 펌웨어 파일이 생성된다:

[OpenWRT 최상위 디렉토리]/bin/ar71xx/openwrt-ar71xx-generic-wzr-600dhp-squashfs-tftp.bin




<설치 과정>


1. 라우터 전원을 끄고(전원 케이블을 뽑아 둔다), 끈 상태로 랜선을 리눅스 컴퓨터와 라우터의 LAN 포트 4개 중 아무 곳에나 연결한다.


2. 리눅스 컴퓨터에 TFTP가 설치되어 있는지 확인하고, 설치되어 있지 않으면 설치한다.

(Ubuntu 12.04를 기준으로)

$ sudo apt-get install tftp


3. 여전히 라우터를 꺼둔 상태에서 리눅스 컴퓨터에서 커맨드 라인 쉘을 열고 아래와 같이 입력한다. 

(Ubuntu 12.04를 기준으로 작성)

  $ cd [OpenWRT 최상위 디렉토리]/bin/ar71xx

        ↑ tftp에서는 디렉토리 변경불가. bin 파일이 있는 위치에 미리 가 있어야 한다


  $ sudo ifconfig eth0 192.168.11.2

        ↑ 600DHP 라우터는 복구 모드에서 이 IP주소를 갖는 클라이언트만 허용


  $ sudo arp -s 192.168.11.1 02aabbccdd20

        ↑ 라우터가 복구 모드일 때 클라이언트에서 이 IP주소/MAC주소로 연결 가능


  $ tftp 192.168.11.1

  >



4. 위와 같이 하고 나면 TFTP가 실행이 된다. 아래와 같이 펌웨어 전송에 필요한 명령을 입력한다.

  > binary

  > verbose

  > trace

  > rexmt 1       <-- 전송 실패 시 1초마다 재시도

  > timeout 60    <-- 60초 동안 전송을 시도함

  > put openwrt-ar71xx-generic-wzr-600dhp-squashfs-tftp.bin


5. 마지막의 "put" 명령을 치고 나면 전송을 시도하는 메세지가 1초마다 1개씩 올라오는데, 이 때 얼른 라우터 전원을 켠다. 60초 내로 연결이 성공해야 하므로 미리 랜선을 연결해둔 상태에서 전원 케이블만 바로 꽂을 수 있도록 준비해 두면 좋다.

WZR-600DHP 라우터는 맨 처음 전원이 켜졌을 때 정상적으로 부팅되기 전에 복구 모드에 잠시 들르는데, 이 때 위의 tftp 설정을 통해서 펌웨어가 라우터에 전달된다.

sent DATA <block=1, 512 bytes>

received ACK <block=1>

sent DATA <block=2, 512 bytes>

received ACK <block=2>

...

Sent XXXXXXX bytes in XX seconds

>


위와 같이 데이터가 전송이 되었다는 메세지가 뜨고 전송이 끝이 나면 이제 라우터가 펌웨어를 자동으로 설치할 것이다. 이제 TFTP의 역할은 끝났으므로 quit 를 입력하고 종료한다.

빨간색 LED가 깜빡거리면서 펌웨어를 재설치하는 과정이 몇 분(체감상 5분 가량) 지속된다. 빨간색 LED가 꺼지고 전원 LED만 켜진 상태가 되면 설치가 완료된 것이다.




<설치 후 준비>


OpenWRT를 설치(flashing)하고 나면 SSH 접속이 가능하도록 비밀번호를 설정할 필요가 있다.

랜선을 뽑았다가 다시 연결하고 (제대로 IP 주소를 받기 위해), 콘솔 창에 아래와 같이 입력한다.

$ telnet 192.168.1.1


그러면 바로 OpenWRT 라우터에 연결될 것이다. 이제 비밀번호를 설정한다.

# passwd


비밀번호 설정이 완료되면 telnet을 종료하고 잠시 기다렸다가(2~3초), 이제 SSH로 로그인을 시도해 본다.

$ ssh root@192.168.1.1


비밀번호를 물어볼 때, 방금 설정한 비밀번호를 입력해서 똑같이 로그인이 된다면 정상적으로 설정된 것이다.

여기까지 하고 나면 이제 원하는 대로 OpenWRT를 활용하면 된다.




<참고자료>

* TFTP를 이용한 OpenWRT 설치 방법(공식 페이지): http://wiki.openwrt.org/doc/howto/generic.flashing.tftp

* OpenWRT - Buffalo WZR-600DHP 관련 페이지: http://wiki.openwrt.org/toh/buffalo/wzr-600dhp




반응형
블로그 이미지

Bryan_

,
반응형

OpenWRT version: 14.07 (Barrier Breaker)

Tested device: Buffalo WZR-600DHP

외부 머신: Ubuntu 12.04 (64-bit)


*목적: 인터넷에 접속할 수 있는 OpenWRT 라우터에서 특정 리눅스 머신에 SSH 또는 SCP를 사용할 때, 비밀번호 입력 절차 없이 자동으로 인증되도록 하고 싶다.


일반적으로 리눅스에서 쓰는 잘 알려진 방법을 활용하면 (openssh를 쓴다는 가정 하에):

1. OpenWRT 기기에서 ssh-keygen 도구를 이용하여 RSA key를 생성하고,

2. OpenWRT에는 private key 파일을 보관하고,

3. 접속할 원격 머신에는 public key 파일을 $HOME/.ssh/authorized_keys 파일에 추가한다.

(참고: OpenTutorials에 있는 egoing님의 글: SSH Key - 비밀번호 없이 로그인)


그런데 위와 같이 하고 아래와 같이 RSA key를 이용한 로그인을 시도하면 에러가 뜬다.

root@OpenWrt:~# ssh -i /root/.ssh/id_rsa [원격 머신 계정 아이디]@[원격 머신 주소]

ssh: Exited: String too long

root@OpenWrt:~# 


이 경우 일반적인 ssh-keygen 대신 dropbearkey를 활용해야 한다.

(참고: https://forum.openwrt.org/viewtopic.php?id=14148)


root@OpenWrt:~# dropbearkey -t rsa -f /root/.ssh/id_rsa

Generating key, this may take a while...

Public key portion is:

ssh-rsa AAAAB3NzaC1yc2EAAADAQAB...(중략) root@OpenWrt

Fingerprint: md5 7e:aa:9b:...(생략)


위의 화면에서 "ssh-rsa ..."로 시작하는 내용은 public key이므로 복사해서 따로 파일로 저장해 두자. (예: id_rsa.pub) dropbearkey에서는 ssh-keygen과는 달리 화면상에 출력만 하고 별도로 .pub 파일로 저장하지 않는다. 그리고 이 내용을 원격 머신의 $HOME/.ssh/authorized_keys 파일에 추가해야 한다.


참고로 dropbearkey를 생성하기 전에 이미 같은 위치에 id_rsa 파일이 있으면 덮어쓰기가 안되므로, 새로 만들 파일 이름을 다르게 하거나, 기존의 id_rsa 파일을 지우도록 하자. (어차피 OpenWRT 기기에서 쓸 수 없으니까 지워도 무방함. 정 필요하면 나중에 ssh-keygen으로 다시 만들면 된다.)


이제 dropbearkey로 새로 만든 private key를 사용해서 비밀번호 입력 없이 SSH, SCP에 접속할 수 있다.


root@OpenWrt:~# scp -i /root/.ssh/id_rsa [보낼 파일] [원격 머신 계정 아이디]@[원격 머신 주소]:[파일 받을 경로]



반응형
블로그 이미지

Bryan_

,
반응형

크로스 컴파일 환경: 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_

,