1. TFTP 서비스 설정

임베디드 보드를 사용하기 위해서는 호스트PC에서 TFTP 서비스를 사용하여야 한다.


TFTP 서버 패키지 설치

서버로 사용할 PC에서 TFTP 서비스를 사용하기 위해서는 우선 관련 패키지를 아래의 명령어를 실행해 설치하여야한다.

yum install tftp   //페도라에서의 인스톨 명령

apt-get install tftp   //우분투에서의 인스톨 명령


패키지 설치가 완료되었으면 TFTP 서비스를 통해 이용할 파일을 넣을 디렉토리를 생성한다.

mkdir /tftpboot

 

TFTP 서비스를 사용하기 위해서 설정파일을 수정한 후 데몬을 재시작해 주어야한다.

vi /etc/xinetd.d/tftp   //페도라에서의 설정파일

====================================================================

# default: off

# description: The tftp server serves files using the trivial file transfer \

# protocol.  The tftp protocol is often used to boot diskless \

# workstations, download configuration files to network-aware printers, \

# and to start the installation process for some operating systems.service

tftp{socket_type             = dgram      

     protocol               = udp      

     wait                  = yes      

     user                 = root      

     server                 = /usr/sbin/in.tftpd      

     server_args            = -s /tftpboot    //해당폴더를 tftp서버로 사용      

     disable                 = no}    //기본은 yes이므로 no로 바꿔준다

====================================================================


vi /etc/default/tftp-hpa   //우분투에서의 설정파일

====================================================================

# defaults for tftpd-hpa

RUN_DAEMON="yes"   //기본은 no이므로 yes로 바꿔준다.

OPTIONS="-l -s /tftpboot/"   //해당폴더를 tftp서버로 사용

====================================================================


/etc/rc.d/init.d/xinetd restart   //페도라에서의 데몬 재시작

/etc/init.d/tftp-hpa restart   //우분투에서의 데몬 재시작

데몬을 재시작 하였으면 아래의 명령어로 확인할 수 있다.

netstat -au   //확인

2. Linux 커널 및 Ramdisk 이미지 포팅

Linux 커널 및 Ramdisk 이미지의 포팅을 위해서 MDS에서 제공해준 CD에서 각각의 파일을 TFTP 서비스를 이용하기 위해 생성한 tftpboot 폴더에 복사한다.


zImage-rebis   //커널 이미지

ramdisk-rebis.gz   //Ramdisk 이미지


minicom - 일종의 하이퍼터미널로 보드의 상태 확인 및 명령 입력이 하능토록 해준다.

만약 minicom이 설치되어 있지 않다면 설치해 주도록한다.

yum install minicom   //페도라에서의 설치 명령

apt-get install minicom   //우분투에서의 설치 명령


minicom 설치후 옵션을 변경해주기 위해 minicom -s 명령으로 옵션설정 모드로 들어간 후 serial port setup 으로 들어간다.


====================================================================

A - serial device              : /dev/ttyS0

B - lockfile locaton            : /var/lock

E - bps/par/bits               : 115200 8N1

F - hardware flow control     : no

G - software flow control     : no

====================================================================


위와 같이 설정해주고 save setup as dlf 으로 설정을 저장해준 후, exit로 빠져나온다.


부트로더 설정

보드의 전원을 킨후 BOOT 로더 상태로 들어가면 아래의 명령어를 이용해 보드와 서버의 IP를 설정해준다.

print   //설정상태 출력

set ipaddr   //보드의 ip 설정 명령

set serverip   //서버 PC의 ip 설정 명령

save   //설정 저장

이때 보드의 IP는 아직 부여되지 않았기 때문에 특별히 설정해주지 않아도 되지만 만약 이미지 포팅이 안될 경우에는 임의로 부여해준다.


리눅스 포팅 - Linux 커널과 Ramdisk 이미지를 보드의 RAM에 저장한다.

t 32000000 zImage-rebis   //Linux 커널 이미지 포팅

t 30800000 ramdisk-rebis.gz   //Ramdisk 이미지 포팅


RAM에 저장된 이미지는 보드를 재부팅하면 사라지기 때문에 아래의 명령어를 이용해서 NAND Flash에 저장해준다.

nandw 0 0xea000 0x32000000

nandw 100 0x2fa000 0x30800000


boot 커멘드 설정 - 보드를 전원을 켰을때 자동으로 리눅스로 부팅되게끔 설정해준다.

set bootcmd nandr 0 0xea000 0x32000000; nandr 100 0x2fa000 0x30800000;

go 32000000;

save


여기까지 완료후에 보드를 제부팅 시키면 자동으로 Linux로 부팅되는것을 확인 할 수 있다.



3. 크로스 컴파일 환경구축

프로그래밍한 파일을 gcc로 컴파일 하면 임배디드 보드에서 실행 할 수 없기 때문에 ARM용으로 크로스컴파일 하기위해 크로스 컴파일 환경을 구축해 주어야한다.


MSD에서 제공한 CD 내의 컴파일 tool을 /usr/local/arm/폴더를 생성한 뒤, 파일을 복사하고 압축을 풀어준다.


PATH 설정 - 어느위치에서든 크로스 컴파일을 하기위해 PATH를 설정해준다

/home/.bash_profile   //페도라의 profile

/home/사용자계정/.bash_profile   //우분투의 profile

위의 파일을 편집기로 열어서 아래의 명령어를 추가해주면 어느위치에서든 arm-linux-gcc를 이용하여 컴파일 할 수 있다.

exoprt PATH=/usr/local/arm/2.95.3/bin:$PATH



4. Test 환경구축

보드에서 프로그램을 구동시키는 방법은 두가지가 있는데 하나는 Ramdisk를 수정하는 방법이고 다른 하나는 nfs 서비스를 통해 파일을 공유시켜 실행시키는 방법이다. 여기서 Ramdisk를 수정하는 방법은 시간이 오래 걸리고 또 프로그램이 제대로 구동되는지 확인하지 않았기 때문에 보통 nfs 서비스를 이용한 방법으로 Test 한 후 Ramdisk를 수정하는 방법을 사용한다.


nfs 서비스를 이용하기 위해서는 아래와 같은 패키지가 설치되어 있어야한다.

apt-get install portmap

apt-get install nfs-kernel-server

apt-get install nfs-common


PC에서 보드를 인식하기 위해서 /etc/exports 파일을 아래와 같이 수정해 주어야한다.

/nfs 128.134.65.205(rw,no_root_squash,sync)

위에서 nfs는 파일을 공유하기 위한 폴더이고 IP주소는 보드의 IP주소이다.

아래의 명령으로 데몬은 재시작한 후 데몬의 가동여부를 확인할 수 있다.

/etc/init.d/portmap restart

/etc/init.d/nfs-kernel-server restart

showmount -e


PC의 설정이 완료됐으면 보드를 부팅시킨후 IP를 변경해준다.

ifconfig eth0 ip 128.134.65.205 netmask 255.255.255.0


보드에서 서버 PC로 mount 시키기 위해 nfs 디렉토리를 생성해준 후 mount 한다.

mount -t nfs 128.134.65.209:/nfs /nfs

위에서 IP주소는 서버 PC의 IP주소이다.



5. Ramdisk 이미지 수정

임베디드 보드를 부팅하면 보드는 NAND-Flash의 내용을 보드의 RAM에 리딩한 후 사용하기 때문에 보드를 재부팅하면 생성된 파일 및 설정된 셋팅은 모두 사라져버린다. 따라서 프로그래밍 한 파일을 보드에서 실행하기 위해서는 Ramdisk를 수정하는 방법을 통해 프로그래밍한 파일을 추가해 주어야한다.


아래의 명령을 통해 Ramdisk 이미지를 특정 폴더에 mount 시켜 내용을 수정 할 수 있다.

cd /tftpboot   //Ramdisk 이미지가 있는 폴더로 이동

mkdir ramdisk_dir   //Ramdisk 이미지를 마운트할 폴더 생성

gzip -d ramdisk-rebis.gz   //Ramdisk 이미지의 압축 해제

압축을 해제하면 기존의 ramdisk-rebis.gz 파일이 사라지고 ramdisk-rebis 라는 압축 해제된 파일이 생긴다

mount -t ext2 -o loop ramdisk-rebis ramdisk_dir

Ramdisk 이미지를 ramdisk_dir 폴더에 mount하는 명령으로 mount 후 df명령을 사용하면 mount내용을 확인할 수 있다.

cd ramdisk_dir   //ls명령으로 ramdisk의 내용을 확인할 수 있고 수정이 가능하다.


수정한 내용 재포팅

Ramdisk 이미지의 내용을 수정한 후 마운트된 폴더에서 빠져나온다.

umount ramdisk-rebis   //unmount - ramdisk_dir 에 마운트 됐던 내용이 사라진다.

gzip ramdisk-rebis   //ramdisk-rebis.gz 생성된 것을 확인 할 수 있다.

수정한 Ramdisk 이미지를 기존과 같은 방법으로 다시 포팅한 후 nandw 명령을 이용해

nand-flash에 써주는 것 까지 완료하면 보드 부팅후 수정한 내용이 반영된 것을 확인할 수 있다.





6. Ramdisk 이미지 크기 확장

MDS에서 제공된 Ramdisk의 크기는 8M인데 파일시스템이 7M를 차지하고 있기 때문에 Web서버 프로그램과 모듈제어를 위한 프로그램을 추가하기 위해서는 Ramdisk 이미지의 확장이 필요하다.

이 Ramdisk의 크기를 확장하기 위해서는 기존 Ramdisk의 이미지를 mount하여 파일을 집어 넣는

것만으로 불가능고 Ramdisk 파일을 재생성 한 후 기존의 Ramdisk 이미지의 파일을 복사하여야한다.


기존의 램 디스크 이미지를 마운트 하기

앞에 기술한 내용을 따랐다면 기존의 Ramdisk 이미지는 /tftpboot 에 있기 때문에 해당 폴더로 이동한다.

아래의 명령을 이용하여 압축을 해제한 후에 ramdisk_dir 이라는 폴더를 생성한 후 기존의 Ramdisk 이미지를 ramdisk_dir 폴더에 mount 해준다.

gzip -d ramdisk-rebis.gz   //압축 해제

mkdir ramdisk_dir   //Ramdisk 이미지를 mount 시킬 폴더 생성

mount -t ext2 -o loop ramdisk-rebis ramdisk_dir   //mount


새로운 Ramdisk 이미지 파일 생성

아래의 명령을 통해 10M 크기의 Ramdisk 이미지를 만들 수 있다. 

dd if=/dev/zero of=ramdisk2 bs=1k count=10240

of=ramdisk2는 생성할 파일이름이며 count=10240 은 크기 10M를 나타낸다 (10M=10*1024K)


ls -al ramdisk2 명령을 사용하면 아래와 같이 10M 크기의 새로 생성된 파일을 확인 할 수 있다.

-rw-r--r--    1 root     root     10485760 Apr 17 01:01 ramdisk2


다음은 이것을 loop 디바이스로 mount 하여 ext2 형식으로 포맷해준다.

/sbin/losetup /dev/loop1 ramdisk2   //loop 디바이스로 mount

/sbin/mke2fs /dev/loop1   //ext2 형식으로 ramdisk2 파일 포맷

/sbin/losetup -d /dev/loop1   //loop 디바이스로 mount된 파일 분리


새로운 Ramdisk 이미지 mount 및 기존 내용 복사

새로 만든 파일의 을 마운트할 디렉토리를 만든다.

mkdir ramdisk_dir2   //폴더 생성

mount -t ext2 -o loop ramdisk2 ramdisk_dir2   //mount

df 명령을 통해 mount된 ramdisk_dir과 ramdisk_dir2를 확인 할 수 있다.

cp -dp ramdisk_dir ramdisk_dir2   //ramdisk_dir의 모든 파일을 ramdisk_dir2로 복사



unmount 및 재압축

umount ramdisk_dir

umount ramdisk_dir2

gzip ramdisk-rebis

gzip ramdisk2

이렇게 해서 생긴 ramdisk2.gz가 새로 만들어 진 램 디스크 이미지이다.


Linux 커널 컴파일

Rebis 보드에서 제공되는 CD의 Linux 커널은 용량이 커진 Ramdisk 이미지를 인식하지 못하기때문에 소스를 이용해 새로 컴파일한 커널을 사용하여야한다.

Rebis 보드에서 제공되는 CD의 커널소스를 복사하여 압축을 해제한다.

커널 컴파일을 위해 아래의 패키지를 설치해준다.

apt-get install ssh

apt-get install gcc

apt-get install make

apt-get install libncurses5-dev


커널 컴파일을 하기 전에 10M의 Ramdisk를 인식하도록 설정하기 위해서 설정을 변경해 주기 위해서 소스가 시작되는 폴더로 이동해 make menuconfig를 실행한다.


Block devices 설정에 들어가면 Default RAM disk size를 볼수 있다.

이것이 8192 로 잡혀 있는데 이것을 10240 으로 바꿔주고 설정을 저장한다.


make dep를 실행하여 의존성 검사를 해준후

make zImage를 실행하여 커널을 컴파일한다.

커널 컴파일이 종료된 후 arch/arm/boot/ 폴더에 zImage 파일이 생성된 것을 확인 할수 있다.


앞서 기술한것과 같은 방법으로 Linux 커널과 Ramdisk 이미지를 보드에 포팅한 후 부팅시키면 df 명령으로 크기를 확장한 Ramdisk 이미지를 확인 할 수 있다.

출처 : Tong - nicesys님의 기본통

      ARM s3c2410  |  2007. 11. 8. 11:17



sokoban's Blog is powered by Daum & Tattertools