강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
누구나 쉽게 배우는 임베디드 리눅스⑥
조회 : 14,060  


누구나 쉽게 배우는 임베디드 리눅스

2% 부족함을 채워보자

 

 

지난 호까지 5회에 걸쳐 임베디드 리눅스를 사용하기 위한 필요사항에 대해 알아보았다.

리눅스를 사용한 임베디드 개발 환경을 만들어 보고, 커널을 동작시키는 과정에 대해 살펴보았는데 최소한의 내용만을 다루었기에 실제 사용 하기에는 부족함이 많은 것이 사실이다.

연재의 마지막인 이번 호에서는 부족했던 부분을 조금이라도 채워보고자 다루지 않았던 부분 임베디드 리눅스를 사용하는 도움이 만한 내용을 소개하고자 한다.

 

_ 장영준 삼성전자 SW연구소 Linux Technology Group 선임 연구원

 

 

연재 순서

임베디드 리눅스 걸음마

교차 개발 환경을 구축하자

부트로더 설정은 이렇게

커널을 올려보자

루트 파일 시스템은 어떻게 구성되는가

2% 부족함을 채워보자

 

 

툴체인과 RFS 보다 쉽게 구축하는, BuildRoot

지난 5회에 걸쳐 툴체인에서부터 커널, RFS까지 구축해보았다. 여기서 가지 의문이 생길 있을 것이다. 시스템을 구성하는 있어 상당히 많은 종류의 오픈소스(Binutil, GCC, C ibrary, BusyBox, Kernel)들을 모두 다운로드 받아 개별적으로 빌드하고, 각각의 버전 조합과 연관성 등을 고려해 만드는 이의 과정이 번거로울 있다는 것이다. 그렇다면 이를 보다 간단하게 만들 있지 않을까? 이러한 필요에 의해 등장한 것이 바로 BuildRoot.

 

BuildRoot 툴체인과 RFS(Root File System) 보다 쉽게 구축하기 위한 툴이다. 빌드에 필요한 모든 소스코드를 자동으로 다운로드받아 빌드, 설치까지의 작업을 make 한번으로 만들어준다. 그리고 한 번의 빌드로 모든 이미지가 만들어지고, 이를 타겟에 적재해 바로 실행시켜 있게 된다. 외에 자주 사용하는 여러 가지 유틸리티 등도 함께 빌드할 있으며, 자신이 원하는 기능을 추가해 사용할 수도 있다.

 

다운로드

소스코드를 다운로드 받는 방법은 크게 가지가 있다. 최근 날짜의 Daily Snapshot 다운로드 받아 사용해도 되고, SubVersion 이용해 CheckOut 사용할 수도 있다.

 

1. Using Daily Snapshot

http://buildroot.uclibc.org/downloads/snapshots/ 사이트에서 최근 날짜의 파일을 다운로드한다. 다운로드 압축을 해제하면 BuildRoot 디렉토리가 생성된다.

 

 

# wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2

# tar -xjf buildroot-snapshot.tar.bz2

 

 

2. Using SubVersion

 

# svn co svn://uclibc.org/trunk/buildroot

 

사용법

아래와 같은 간단한 과정을 거쳐 툴체인과 RFS 구축할 있게 된다.

여기서 짚고 넘어갈 사항은 BuildRoot 사용시 루트 계정이 아니어도 된다는 점이다. 보통 툴체인, RFS 만들 루트 계정으로 작업을 하게 되는데, 가급적 루트가 아닌 일반 유저로 작업하기를 권장한다.

먼저, 다음 명령으로 필요한 환경 설정을 한다. 여기서는 타겟 정보, 사용할 GCC, C Library,

BusyBox 버전, 옵션 등의 정보를 설정하게 된다.

 

# make menuconfig

 

menuconfig 하게 되면 다음과 같은 화면이 뜬다. 리눅스 커널이나 BusyBox 비슷한 인터페이스로 구성돼있다.

 

 

항목마다 적절한 값으로 설정해준다. BuildRoot 사이트를 참고하면 되므로

(http://buildroot.uclibc.org/buildroot.html) 항목의 자세한 설명은 생략한다.

 

설정을 마치고 저장한 종료하고, make 하게 되면 필요한 소스를 자동으로 다운로드 받아 적절한 옵션으로 설치ㆍ빌드돼 툴체인과 RFS 생성된다.

 

# make

Using GLIBC

2 툴체인 강좌에서 소개한 CrossTool BuildRoot 비해 기능은 많지 않지만 타겟에서 프로그램을 구동하는 필요한 요소인 C Library로서 glibc 지원한다는 장점을 가진다. 반면 BuildRootuClibc만을 지원한다. uCLibc 이미지 크기가 비교적 작은 편이라 Embedded System 많이 사용되고 있기는 하지만, 기능의 제약 때문에 glibc 사용해야 하는 경우도 발생하게 된다. glibc 사용하고자 하는 경우 CrossTool 사용하거나, CrossTool 참고해 BuildRoot 직접 수정, 사용할 있다. 자세한 설정 방법은 생략한다.

 

개발 효율 향상을 가져오는, NFS

5 RFS 강좌에서는 RFS 구성하고 이를 램디스크로 만들어 타겟에서 실행해 보았다. 상용화된 제품이나 보통의 경우에는 타겟에 내장된 저장장치(램이나 플래시)에서 RFS 수행해야 것이다. 그러나 개발단계에서는 프로그램을 빌드하고 실행해보는 과정이 많이 발생돼, 다시 수행할 때마다 타겟에 프로그램 이미지를 다시 적재해야 하는 번거로움이 생긴다. 그리고 개발 당시 테스트 등을 수행하면서 타겟의 저장한도를 초과하는 크기가 필요한 경우도 생긴다. 이때 사용되는 기법이 NFS(Network FileSystem)이다.

 

NFS라는 이름에서 추측할 있겠지만, RFS 호스트에 위치하고, 타겟에서는 이를 네트워크로 연결해 사용하는 방식이다. 이렇게 되면 RFS 영역이 호스트와 타겟에서 공유가 되므로, 호스트에서 빌드된 프로그램 이미지를 타겟에서 곧바로 실행해 있게 결과적으로 개발 효율 향상을 가져온다. 또한 호스트는 저장 공간이 타겟에 비해 훨씬 많으므로 저장 공간의 제약도 받지 않게 된다. 이제부터 NFS 사용 방법에 대해 알아보자.

 

호스트 설정

호스트에서 해줘야 작업은 타겟으로부터의 NFS연결을 받을 있도록 설정하는 작업과 NFSRFS 구성하는 작업이다.

 

먼저, RFS 구성해 보자. NFS라고 해도 램디스크에서 사용했던 RFS 내용은 동일하므로, 5 RFS강좌에서 만든 RFS 그대로 사용하면 된다. 적당한 디렉토리를 만들고 여기에 이전 시간 만들었던 RFS 디렉토리 내용을 복사한다. 강좌에서는 nfs_root라는 이름의 디렉토리를 사용하겠다.

 

# mkdir -p ~oss/elinux/nfs_root

# cp -af ~oss/elinux/mk_rfs/rfs/* ~oss/elinux/nfs_root/

 

 

지난 시간에는 타겟에 적재하기 위해 작은 크기로 만들었지만, NFS에서는 용량 제약이 없으므로 필요한 다른 파일을 추가해도 무방하다.

 

다음으로, 외부(타겟)로부터 연결을 받기 위한 설정을 한다. 이때, IP 다음과 같이 설정되었다고 가정하고 설명한다(설정 방법은 4 커널 강좌를 참고한다).

- 호스트 : 192.168.95.1

- 타겟 : 192.168.95.2

 

/etc/exports 파일에 다음과 같이 라인을 추가하면 된다.

# vi /etc/exports

/home/oss/elinux/nfs_root/ 192.168.95.2(no_root_squash,rw,sync)

파일 수정 수정된 내용을 시스템에 반영한다.

# export -a

IP 192.168.95.2 시스템에서 nfs_root 디렉토리로 NFS 접근 요청이 들어오면 허용해주겠다는 의미이다. 괄호안의 no_root_squash 등은 옵션을 나타낸다. NFS 접속할 루트 권한을 허용할 것인지, 쓰기 연산을 허용할 것인지 등의 옵션을 지정할 있다.

 

가지 주의할 점은 옵션 사이에 띄어쓰기를 하면 된다는 것이다. , ,(콤마)뒤에 공백이 있으면 안 된다는 얘기다. 그리고 IP 상관없이 모든 접속을 허용하려면 192.168.95.2 대신에* 써주면 된다.

 

# man exports

 

마지막으로 NFS daemon 재가동한다. NFS server 설치되었다고 가정하고 진행한다.

 

# /etc/init.d/nfs-kernel-server stop

# /etc/init.d/nfs-kernel-server start

 

 

stop/start 대신 restart 번에 수행해도 된다. nfs-kernel-server 우분투 기준이고, 페도라 등 레드햇 계열의 리눅스를 사용한다면 다음 명령을 사용하면 된다.

 

# service nfs restart

 

 

커널 수정

타겟에서 NFS 사용하기 위해서는 타겟에 적재되는 커널에 NFS 기능을 추가해 다시

드해야 한다. 먼저, 커널 메뉴에서 다음 옵션을 켠다.

 

# make menuconfig

File systems

Network File Systems

<*> NFS file system support

[*] Root file system on NFS

 

 

그리고 호스트의 NFS위치와 IP정보를 함께 세팅해야 한다. <.config> 파일의 CMDLINE 항목은 다음과 같이 직접 수정한다.

 

# vi .config

CONFIG_CMDLINE="root=/dev/nfs rw console=ttySAC0

nfsroot=192.168.95.1:/home/oss/elinux/nfs_root

ip=192.168.95.2:192.168.95.1:192.168.95.1:255.255.255.0::eth0:off"

 

ip 항목은 순서대로 target ip : host ip : gateway ip : netmask 의미를 가진다.

수정이 완료되었으면 커널을 재빌드해준다.

 

# make zImage

 

여기까지 모든 설정이 제대로 되었다면, 타겟에서 램디스크 대신 NFS 부팅되었음을 확인할 있을 것이다. 이후 호스트의 NFS 디렉토리에서 간단한 프로그램을 작성해 빌드한 , 타겟으로의 적재 과정 없이 곧바로 실행시켜 있게 된다.

 

지금까지 NFS 대해서 알아보았는데, 이는 사용의 편리성 때문에 개발당시에는 많이 사용되는 방식이었다. 그러나 가지 제약사항도 존재한다. 첫째, NFS 네트워크를 지원하는 타겟에서만 사용가능하다. 요즘은 USB로도 네트워크를 사용할 수 있으므로 네트워크 장치가 없더라고 USB 지원하는 타겟에 사용 가능한 방법이다.

 

그리고 프로그램을 실행하는 등의 타겟에서 수행되는 모든 작업이 네트워크를 거쳐서 수행되기 때문에 속도가 느려진다는 문제점도 있다. NFS 사용 시에는 이러한 사항을 염두에 두고 사용해야 것이다.

 

어렵지 않게 누구나 활용 가능한, 임베디드 리눅스

리눅스에 익숙하지 않은 사용자가 처음으로 임베디드 리눅스의 개발 환경을 직접 구축해 보면, 윈도와 윈도 환경에서 개발한다는 것이 새삼 편리하다고 느껴지게 된다.

사용자는 먼저 리눅스라는 산을 넘어야 하고, 너머에는 임베디드 환경이라는 산이 기다리고 있기 때문이다. 하지만 이런 과정을 거치고, 실제로 임베디드 시스템을 동작시켜 보면 다른 매력을 느끼게 된다. , 개발 환경을 구축하는 일은 어렵다기보다는 익숙하지 않기 때문에 막히는 경우가 많다. 때문에 실제로 겪어 보면 누구나 있을 것이다.

임베디드 리눅스를 처음 접해 보는 분들에게 최대한 쉽게 설명하려 노력했는데, 2프로 부족함은 채워지지 않은 듯해 아쉽다. 마지막으로 임베디드 리눅스와 관련해 막히거나 궁금한 분들은 필자 이메일(jyj0316@gmail.com) 연락을 주면 최대한 노력해 답변을 구해드리도록 것이다. 그동안 읽어주신 독자분들께 감사를 드리며 <누구나 쉽게 배우는 임베디드 리눅스> 연재를 마친다

 

 

 

 

출처 : 공개 SW 리포트 12호 페이지 50 ~ 55 발췌(2008 05) - 한국소프트웨어 진흥원 공개SW사업팀 발간

 


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1650


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
한국소프트웨어진흥원 공개SW사업팀