OpenWRT C 프로그래밍
openWRT란
하나의 정적 펌웨어를 만드는 대신 openWRT는 선택적인 패키지 관리와 함께 완전히 쓰기 가능한 파일 시스템을 제공합니다. 이를 통해 공급 업체에서 제공하는 응용 프로그램 선택 및 구성의 제한에서 벗어날 수 있으며 패키지를 사용하여 모든 응용 프로그램에 맞게 임베디드 장치를 사용자 지정할 수 있습니다. 개발자를 위해 openWRT는 완전한 펌웨어 이미지 및 배포를 만들지 않고도 응용 프로그램을 빌드 할 수있는 프레임 워크를 제공합니다. 사용자에게 이것은 완전한 사용자 정의의 자유를 의미하며 벤더가 상상하지 못했던 방식으로 임베디드 장치를 사용할 수 있습니다.
여기까지가 openWRT공식 홈페이지(openwrt.org)에 나와있는 정의이고, 나는 단순히 공유기 운영체제로 접근하여 사용하였다.
이 포스팅은 내가 직접 openWRT에서 C프로그래밍을 하기위한 실습과정이 담겨있다.
실습 환경
운영체제: VM ubuntu
공유기: TP-LINK Archer C7 AC1750
첫번째 방법
openWRT 공식 홈페이지에 나와있는 "Hello, world!" for OpenWrt 과정을 따라 하였다.
openwrt.org/docs/guide-developer/helloworld/start
"Hello, world!" for OpenWrt
startStart with Chapter 1 "Hello, world!" for OpenWrt Welcome to the “Hello, world!” -article series for OpenWrt. This article series walks you through the basics of developing new software for your router. We will start with an extremely simple applic
openwrt.org
"Preparing your OpenWrt build system for use" 단계부터 천천히 진행하였다. 그러던 중 다음과 같은 애러가 발생했다.
(포스팅을 위해 과거 발생했던 애러를 구글링하여 가져왔습니다.)
make: *** [/home/mcotting/programming/openwrt/include/toplevel.mk:227: world]
생소한 작업이다보니 애러 원인을 찾을 수 없었다. 이를 해결하기 위해 퇴근후 며칠을 구글링해보고 재설치, 가이드와 똑같은 경로 등 여러 방법으로 시도했지만 결국 해결하지 못했다.
그래서 openWRT 공식 홈페이지에 있는 가이드라인 말고 다른 방법을 찾아보았다.
두번째 방법
다음과 같은 방법으로 시도 하였다.
electrosome.com/cross-compile-openwrt-c-program/
Cross Compiling C Program for OpenWrt - Hello World Tutorial
How to cross compile a C program for OpenWrt ?. OpenWrt is an open source embedded linux which is primarily used to route network traffic.
electrosome.com
내가 이해한 방법은 다음과 같다.
현재 공유기와 똑같은 환경을 만들어서 C 컴파일을 하고 실행파일을 scp 를 이용해 공유기에 복사 후 실행.
위의 사진은 현재 나의 공유기(ac1750)에 적용된 openWRT에 접속해서 얻은 정보이다.
공식 사이트에도 공유기 관련 정보들도 있다.
openwrt.org/toh/tp-link/archer-c7-1750
TP-Link Archer C7 AC1750
TP-Link Archer C7 AC1750 The TP-Link Archer C7 AC1750 is a wireless router with both 2.4GHz and 5GHz radios. It has five 1 gigabit/second Ethernet ports, and a moderately fast processor. Available since 201x. V1, V2 & V3 uses 3 external antennas for 5GHz a
openwrt.org
어제 OpenWrt Build System 의 Downloading & Installing 단계까지 진행 완료하였고 오늘은 Configuring Target 부터 진행한다.
현재 디렉토리 경로는 ~/openwrt 이다. (글쓴이의 경우 /hom/jun/ 하위에 설치(clone) 하였다.)
make menuconfig
TP-LINK Archer C7 AC1750의 경우 다음과 같이 설정한다.
위 사진과 같이 설정하고 저장하고 나온다.
make
다음과 같이 make를 시작하면 상당히 오랜 시간이걸린다 글쓴이의 경우 오랜시간 빌드를 했지만 VM ubuntu에 할당한 용량이 부족하여 OS를 처음부터 다시 설치하였다 ...
.... 약 두시간 용량은 약 10기가..? 원래 이런가 ...
어쨋든 빌드과정은 완료하였다.
이제 크로스 컴파일을 가능하도록 환경을 만들어야 한다.
다음 명령어를 실행한다.
sudo nano /bin/openwrt.config
아래의 코드를 복사하고 openwrt.config에 붙여넣기 한다.
export STAGING_DIR=/home/ligo/chaos_calmer/staging_dir
export TOOLCHAIN_DIR=$STAGING_DIR/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
export LDCFLAGS=$TOOLCHAIN_DIR/usr/lib
export LD_LIBRARY_PATH=$TOOLCHAIN_DIR/usr/lib
export PATH=$TOOLCHAIN_DIR/bin:$PATH
여기서 경로와 toolchain 버전?의 경우 본인의 환경에 맞춰야한다. 나같은 경우 staging 하위에 있는 이름이랑 똑같이 했다.
export STAGING_DIR=/home/jun/openwrt/staging_dir
export TOOLCHAIN_DIR=$STAGING_DIR/toolchain-mips_24kc_gcc-8.4.0_musl
export LDCFLAGS=$TOOLCHAIN_DIR/usr/lib
export LD_LIBRARY_PATH=$TOOLCHAIN_DIR/usr/lib
export PATH=$TOOLCHAIN_DIR/bin:$PATH
그리고 활성화 시킨다.
source /bin/openwrt.config
이제 HelloWorld를 만들자
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
위의 코드를 복사한다.
nano hello.c
나노 명령어를 실행 후 붙여 넣기를 한다. 그리고 컴파일을 진행한다.
mips-openwrt-linux-gcc -o hello hello.c
그러면 실행파일이 생겼다. 이제 공유기로 복사를 해야한다.
scp hello root@192.168.4.1:hello
scp 를 이용하여 공유기에 복사를 진행한다 .
scp: secure copy (remote file copy program)의 줄임말로 ssh를 이용해 네트워크로 연결된 호스트간에 파일을 주고 받는 명령어입니다.
ssh root@192.168.4.1
ssh 접속을 해서 ls 해보면 hello 실행파일이 있다. 이것을 실행하면 끝.
------ 후기
그동안 네트워크 개발 쪽을 공부했었지 Openwrt 같은 펌웨어를 직접 만지는 것은 처음이었다. openwrt.org를 믿고 시작했는데 무언가 잘못되었고 수차례 실패를 반복하였고, 결국 성공했다. 처음 실패에서는 막막했고 매일 조금씩 하다 보니까 성공한 것 같다. 하지만 아직 지금 포스팅하는 과정을 완벽하게 이해하지 못했다. 이를 이해하기 위해서는 좀 더 펌웨어 관련 모듈을 사용해 봐야겠다. 사실 최종 목표는 공유기에 내가 만든 코드를 실행시키는 것이 목표이다. 그래서 다음 포스팅은 공유기에서 내가 만든 프로그래밍을 실행하는 글을 포스팅하겠다.