Open Source Network Router 개발 환경인 OpenWRT 소개

리눅스는 근래 들어서 가장 흥미롭고 널리 쓰이는 운영체제(OS)가 되었습니다. 특히 최근에 구글 안드로이드에서 리눅스 커널을 안드로이드의 커널로 탑재하면서 리눅스의 그 명성은 더 높아진거 같습니다. 비용이 들지 않는 모든 소스가 공개되어 있는 오픈소스지만, 지금은 누구나 가지고 있는 모바일 폰의 70% 정도가 안드로이드가 탑재되어 있습니다. 알게 모르게 우리는 리눅스에 많은 영향을 받고 있다고 보면 되겠습니다. 

그런데 이미 좀더 일찍 네트워크 라우터(대표적으로 IP 공유기)에 리눅스 커널이 탑재가 되어 보급되었었는데요, 그 주요 솔루션이 바로 여기서 소개할 “OpenWRT” 입니다. OpenWRT는 2004년 Linksys의 네트워크 라우터 제품(WRT54 시리즈)에 커스텀 펌웨어로 개발이 시작되어서 현재까지 공식적으로 전세계의 약 900여개의 라우터 제품에 OpenWRT가 탑재되어 공급되고 있습니다. OpenWRT는 리눅스 커널을 탑재한 임베디드 리눅스라고 볼 수 있으며, OpenWRT의 커널과 어플리케이션들은 GPL 라이선스를 따르고 있어서 누구나 OpenWRT 소스를 다운로드 및 개발을 할 수 있는 장점이 있습니다.

저도 마찬가지로  OpenWRT를 네트워크 라우터를 개발하면서 접하게 되었고, 그 범용적인 특성때문에 현재까지도 개발 참고용으로 OpenWRT 패키지를 잘 활용하고 있습니다. 따라서 이번 시간에는 오픈소스 네트워크 라우터 개발 도구인 OpenWRT에 대하여 소개를 드려볼까 합니다.

네트워크 라우터의 간략한 개념

네트워크 라우터(Router)는 단어 의미는 어려울꺼 같지만 우리가 늘 접하는 개념중에 하나입니다. 간단하게 얘기하자면 인터넷 통신 사업자(ISP)와 고객(Client)을 중간에서 잘 연결해 주는 장치 혹은 장비라고 보시면 되겠습니다. 흔히 우리가 가정에서 사용하는 IP 공유기도 넓은 범주에서 라우터에 속한다고 보면 됩니다. 특히 가정에서 모바일폰과 여러대의 PC를 연결해 주는 기능을 주로 IP 공유기가 하는데요, NAT(Network Address Translation)기술로 가상 IP를 각 가정에 할당된 공인 IP로 변환해주는 기능을 IP공유기 즉 라우터가 수행합니다. 

이 고마운 라우터로 인해 디바이스당 일일이 고정 IP를 할당하지 않아도 수많은 기기들이 가상 IP를 할당받아서 인터넷을 사용할 수 있습니다. 전에 코드도사의 포스트에서는 리눅스가 네트워크에 최적화된 OS라고 설명을 드렸었는데요, 이 NAT 기능을 리눅스 커널에서 수행하고 있습니다. 리눅스가 알게 모르게 통신의 발전에 이바지 했답니다.

이 라우터에 OpenWRT가 탑재가 되어 있는 라우터가 많습니다. OpenWRT는 국내보다는 해외에 탑재된 제품이 많은데요, 대표적인 제품이 위에서 언급한 Linksys사의 WRT54G 입니다.

Linksys사의 WRT54G

국내에는 IP공유기로는 제일 유명한 제품이 IP Time 인데요, 이 제품에는 OpenWRT가 아닌 일반 임베디드 리눅스가 탑재되어 있습니다. 만약 IP Time에 OpenWRT가 올라가 있다면 어느 누군가가 OpenWRT의 커스텀 FW를 올려서 구동하려고 분명히 시도를 했을수도 있습니다^^ 일단 국내 라우터 제품은 OpenWRT가 탑재된 제품이 극소수로 알고 있습니다. 

이 외에 수많은 라우터 제조사의 라우터 제품이 OpenWRT가 탑재되어 있습니다. 저 또한 OpenWRT가 탑재된 라우터 제품을 개발하였었습니다. 누군가는 제가 개발한 제품을 쓰고 있다고 생각하면 나름 보람을 느끼는거 같습니다. 

아래 링크는 OpenWRT가 탑재된 제품 리스트 입니다. 혹시 자신의 라우터(공유기)가 OpenWRT가 탑재되어 있는지 호기심이 있으신 분들은 확인해 보셔도 좋습니다.

추후에는 OpenWRT는 이용하여 공유기를 직접 개발하여 관련된 내용을 포스팅 할 예정입니다. 코드도사에 많은 방문 바랍니다.

OpenWRT 소스는 어디서 구경할까요?

자 그럼 이 흥미로운 리눅스 기반의 OS인 OpenWRT를 어디서 어떻게 확인해 볼 수 있을까요? OpenWRT의 공식 사이트로 먼저 이동해 보겠습니다.

위 링크는 OpenWRT 공식 사이트의 메인 페이지입니다.  접속해 보니 깔끔하고 정돈된 위키 페이지 느낌이 나는거 같습니다. 

요기서 OpenWRT의 Source를 다운로드 하거나 개발 관련 문서 및 포럼을 방문할 수 있습니다. 먼저 간략하게 OpenWRT 패키지를 어떻게 다운로드 하는지 확인해 볼까요? 접속한 화면의 좌측을 보니 Download 링크가 나타납니다. 다운로드 링크로 들어가 보겠습니다.

firmware repositiry라고 설명이 되어 있네요. 이 링크로 접속하면 이미 컴파일 된 OpenWRT의 펌웨어 파일이 올려져 있을겁니다. 각 CPU 아키텍처별로 이미 컴파일된 펌웨어가 서버에 이미 올려져 있습니다. 

그런데 펌웨어 파일보다는 OpenWRT의 소스를 확인해 보고 싶은데 어떻게 해야 할까요? 위 화면에서 봤을때 Git Repo. 가 있다는거 같네요. 그리고 Github도 링크가 걸려 있습니다. 

위 링크가 OpenWRT의 Github 입니다. 여기에 접속하면 OpenWRT의 소스를 바로 웹에서 확인해 볼 수 있습니다. 

OpenWRT Source를 다운로드 하여 컴파일 해보기 

그렇다면 직접 OpenWRT를 자신의 리눅스에 다운로드하여 compile을 해보는게 어떨까요? 어렵지 않을까?라고 생각하시는 분들 계시겠지만 생각보다 어렵지 않습니다. 친절하게도 OpenWRT의 공식사이트에서는 수많은 문서로 처음 시작하는 개발자들을 위해 손쉽게 설명을 해놓고 있습니다. 그 문서를 참조해서 다운로드 및 Compile을 해보도록 하겠습니다. 

OpenWRT를 컴파일해 보려면 일단 리눅스 환경이 준비되어야 겠네요. 즉 호스트 PC가 필요합니다. 만약 리눅스가 설치된 PC나 서버가 없다면 본인의 PC에 VirtualBox로 가성머신으로 리눅스를 구동하여 OpenWRT를 다운 및 컴파일을 할 수 있습니다. 관련된 내용은 아래 링크 첨부해드릴테니 참고하시기 바랍니다.

리눅스 머신이 준비되었다면 먼저 git을 사용하여 OpenWRT의 Source를 다운로드 하도록 하겠습니다. 리눅스 터미널에서 아래 명령어를 차례대로 입력하여 OpenWRT 소스를 다운로드 받습니다.

git clone https://git.openwrt.org/openwrt/openwrt.git/ openwrt
cd openwrt

./scripts/feeds update -a
./scripts/feeds install -a

여기서 scripts 디렉토리의 feeds는 OpenWRT의 어플리케이션이나 유틸리티를 최신 버전으로 업데이트 하는 과정입니다. 만약 최신 패키지로 컴파일하고 싶으면 feeds를 업데이트 하시기 바랍니다.

Source를 git으로 clone하는데 약간의 시간이 소요될 수 있습니다. git clone이 끝나면 OpenWRT를 컴파일 하기 위해 몇가지 어플리케이션을 필수로 설치를 해야 합니다. 아래 명령어를 입력하여 설치를 합니다.

sudo apt install subversion g++ zlib1g-dev build-essential git python time
sudo apt install libncurses5-dev gawk gettext unzip file libssl-dev wget
sudo apt install libelf-dev

만약에 우분투 버전이 18.04 이후 버전이라면 추가적으로 아래 패키지를 설치 하시기 바랍니다. 

sudo apt install build-essential libncurses5-dev python unzip   

자 그럼 OpenWRT를 컴파일 하기 위한 준비는 이제 마무리가 되었습니다. 이제 컴파일을 해볼까요? 먼저 openwrt 라는 git clone을 한 최상위 디렉토리로 이동하여 “make menuconfig”를 입력하게 언테를 누릅니다. 그럼 OpenWRT의 main menuconfig 화면이 나오게 됩니다. 

여기서는 OpenWRT를 올릴 타켓 디바이스만 일단 정해줍니다. 위 화면에서 위에서 3번째 까지 타겟 디바이스에 대한 설정입니다. 여기서 주목할만한 점은 OpenWRT는 라즈베리파이 1~3B+까지 지원한다는 사실입니다. 위의 화면대로 설정했자면 라즈베리파이 3B+ 모델의 OpenWRT 펌웨어를 컴파일 하여 구동시킬 수 있게 됩니다. OpenWRT의 범용성이 좋죠?

위와 같이 설정했으면 menuconfig에서 하단의 Save를 선택하고 저장을 하고 menuconfig를 종료합니다. 이제 최 상위 디렉토리인 openwrt 에서 make 를 입력하고 엔터를 치면 컴파일이 진행이 됩니다. 컴파일시에 기본적으로 compile 과정에 대한 Source의 경로 및 진행과정을 볼 수가 없는데, 이런 부분을 확인하고 싶다면 아래와 같이 입력하면 됩니다.

make V=99

위 옵션의 의미는 Verbose를 99까지 즉 최고로 올린다는 뜻입니다. 이렇게 make 옵션을 주면 컴파일 과정 모든것을 터미널 화면으로 보여주게 됩니다. 

컴파일이 완료되기까지는 사용하는 PC의 성능에 따라서 차이가 있을 수 있습니다. 그럼에도 워낙 다운로드 받는 패키지의 양도 많고 컴파일 과정이 길어서 시간이 꽤 소용됩니다. 컴파일 과정동안은 잠시 쉬거나 바람을 쐬고 와도 될꺼 같습니다. 

완료가 되었으면 openwrt 디렉토리에서 하위에 새로 생긴 디렉토리를 발견할 수 있습니다. 여기서 bin 에 지금까지 컴파일을 진행했던 전 과정에 대한 펌웨어 파일이 들어있습니다. 

openwrt/bin/targets/brcm2708/bcm2710 으로 이동하면 펌웨어 파일을 확인할 수 있습니다.

 펌웨어 파일은 총 4개가 생성이 되었습니다. 이 파일을 라즈베리파이 3 B+ 에 올리면 라즈베리파이 3 B+에 OpenWRT가 구동이 되게 되는 것입니다. 라즈베리파이에 OpenWRT를 올리는 과정은 별도의 포스트로 기술해 보도록 하겠습니다. 여기서는 간단하게 컴파일 하는 방법만 알아보도록 하겠습니다.

이렇게 해서 OpenWRT의 컴파일이 완료되었습니다. 

마치며…

지금까지 OpenWRT의 개념 및 라우터에 대한 내용, 그리고 OpenWRT를 직접 다운로드 및 컴파일을 하는 방법에 대해 알아봤습니다. 이번 포스트에서 기술한 내용은 OpenWRT를 소개하는 시간이 될꺼 같네요. 이후에는 OpenWRT를 직접 라즈베리파이나 UDOO Neo, VoCore2 등의 IoT 디바이스에 컴파일 하여 올려보도록 할 예정입니다. 관련되어 궁금한 점은 댓글 남겨주시기 바랍니다.

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.