u-boot 프롬프트까지 띄웠다면 u-boot 커맨드에 익숙해질때이다. u-boot 프롬프트 상에서 'help'를 타이핑하니 커맨드 목록이 약간의 도움말과 함께 디스플레이 된다.(나는 익숙하지 않다.) 다음과 같이 타겟의 네트웍 설정을 한다.
u-boot>setenv ethaddr 12:23:56:78:99:ab -> target MAC address
u-boot>setenv ipaddr 10.10.10.11 -> target IP
u-boot>setenv serverip 10.10.10.10-> host IP
u-boot>saveenv-> 위 설정을 저장
u-boot>printenv-> 설정된 값 확인
u-boot>tftp 21400000 9260kernel.img-> host의 tftp 서버에 접속하여 타겟의 0x21400000 주소에 커널 이미지 다운
u-boot>tftp 21100000 9260ramdisk.gz-> host의 tftp 서버에 접속하여 타겟의 0x21100000 주소에램디스크 이미지 다운
u-boot>bootm 21400000-> 0x21400000 주소의 커널 시작
커널과 램디스크 이미지는 호스트의 /tftpboot 폴더에 위치하고 있다. 위 내용은 어느 리눅스 포팅 관련 책에서나 볼 수 있다. 여튼 9260-ek 관련 specific한 작업이므로 적어 보았다.이렇게 하면 SDRAM에 다운 받은 리눅스 커널과 루트 파일시스템구동을 확인할 수 있다. 그러나 어플리케이션 개발 시 매번 램디스크 이미지를 만들어 네트웍을 통해 다운 받는 과정 보다는 NFS-mounted root filesystem을 사용하는것이 편하다고들 한다. (나도 초짜라 얼마나 어떻게 편한지는 아직 모르겠다) 그래서 NFS 환경을 구축하기로 했다.
호스트에서 NFS 서버를 구축하기 위한 자료를 찾아 설정을 하였다. 다음은 호스트에서 수행 된 일련의 작업이다.
1. 호스트의 NFS 서비스를 위해 portmap, rpc.mountd, rpc.nfsd 데몬이 수행되어야 한다. 다음 명령어로 RPC 원격 서비스를 위한
portmap 데몬을 수행한다.
$/etc/init.d/portmap start
2. NFS 서비스를 위해 rpc.mountd와 rpc.nfsd 두 데몬을 수행한다.
$/etc/init.d/nfs start
3. gz으로 압축된 타겟용 램디스크 이미지를 NFS가 가능하도록 호스트의 디렉토리에 압축을 풀고 마운트 해 놓는다.
$gunzip 9260ramdisk.gz
$mkdir /mnt/TargetRamdisk
$mount -o loop 9260ramdisk /mnt/TargetRamdisk
$chmod -R 777 /mnt/TargetRamdisk
사용이 끝나면
$umount /mnt/TargetRamdisk
$gzip 9260ramdisk
4. 3번 항목에 설정 된 디렉토리를 NFS 서버와 연동하기 위해 정보 세팅을 두가지 방법 중 하나로 수행한다.
/etc/exports 파일에 text 기반으로 정보를 세팅하거나 XWindow에서 Desktop->System Settings->Server Settings->NFS
선택하여 GUI로 설정한다. (호스트의 상용 리눅스마다 경로가 틀릴 수 있다.)
마운트될 디렉토리클라이언트주소 옵션
/mnt/TargetRamdisk10.10.10.11*(rw,sync)
5. /etc/exports 파일 설정 후 NFS 데몬 재실행을 해야 설정된 정보로 서비스가 수행된다.
$/etc/init.d/nfs restart
6. 호스트 리셋 시 NFS 데몬 자동 수행을 위해 ntsysv나chkconfig 명령어를 이용하여 세팅을 해 놓는다.
$ntsysv
pop-up된 옵션창에서 nfs와 portmap 선택한다. 또는
$chkconfig --level 345 nfs on
$chkconfig --list
우~왕 팔아프다.리눅스 책 보면 다 나오는 내용인데...여튼 문제(?)는 이제 부터이다.
일반적으로 포팅 관련 된 책자에는 타겟에서 호스트에 구축된 루트파일시스템에 마운트하기 위한 커맨드가 소개되어 있다. 무지했던 나는 이해가 가질 않는다.커널만 다운 받아 어떻게NFS를 사용하는가~루트파일 시스템이 정의되지 않은 커널은 부팅하자마자panic 상태가 되는데...ㅋㅋ 상용으로 제공되는 레퍼런스 보드의 커널들은 이미 NFS 관련된 커널 설정이 포함되어 제공되기 때문에 특별히 언급을 하지 않는것 같다.또한 커널의 부트 옵션에 대해서도~ 이쪽 분야의 엔지니어에게는 기본상식이었나 보다. 여튼 나는 커널 설정 메뉴에서 NFS 관련 모듈을 포함하겠다고 선택을 한 뒤 커널 컴파일을 다시 해야 된다는 사실을 알았다. 그리고 커널의 부트옵션과 u-boot의 bootargs의 역할까지도~
호스트의 타켓 커널 소스 폴더에서
$make ARCH=arm menuconfig($make ARCH=arm gconfig or xconfig etc.을 사용해보자)
하여 커널 메뉴 화면을 띄운다. 여기서 File systems -> Network File systems 항목에 들어가
<*> NFS file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
체크 한뒤 Boot option에 가보자. default kernel command란에 값은 다음처럼 기록되어 있다.
(mem=64M console=ttyS0,115200 initrd=0x21100000, 17000000 root=/dev/ram0 rw)
이 값을 변경하여 커널이 수행될 시 NFS가 되도록 할 수 있으나 아래와 같은 이유로 변경하지 않았다. 부트로더는 커널 수행을 위해 몇가지 정보를 제공해야 되는데 아래와 같은 방법들이 사용될 수 있다.
1. u-boot 프롬프트 상에서 setenv bootargs ~ -> 동적인 방법
2. u-boot 헤더파일의 #define CONFIG_BOOTARGS ~ -> 정적인 방법
3. 커널의 메뉴구성 중 default kernel command string -> 정적인 방법
당연 동적인 방법을 선택해야 하며 위 순번이 곧 우선순위를 갖기 때문에 1, 2번이 없을 경우 3번으로 수행된다. 따라서 커널 메뉴상의 부트옵션 값은 그대로 두고 u-boot의 bootarags 파라미터에 NFS 수행을 위한 정보를 입력하기로 했다. 일단 커널을 컴파일 한다. (다시 읽어 보니 뭔말인지 의도한바와 기술한바가 약간 엇박자)
$make ARCH=arm CROSS_COMPILE=arm-softfloat-linux-gnu-
$mkimage -A arm -O linux -C none -T kernel -a 20008000 -e 20008000 -n linux-2.6 -d arch/arm/boot/Image 9260kernel.img
mkimage는 u-boot에 의해 bootable 한 이미지를생성하도록 하는 툴이다. 옵션이 길지만 의미는 직관적이다. 차례로 적어 보면 "Architecture는 arm, OS는 linux, Compression은 none, 이미지 Type은 kernel, 로딩될 address는 20008000, entrypoint는 20008000, 이미지 name은 linux-2.6, 이미지 data를 /arch/boot/Image를 사용해라" 이다.
이렇게 해서 일단 NFS 가능한 커널 이미지가 준비 되었다. 이제 다시 u-boot로 돌아가 보자. 좀전에 이야기 했듯이 우선순위가 1위이며 동적인 방법인 u-boot bootargs를 이용하여 커널에 nfs 정보를 전달하도록 하겠다. 다음과 같이 u-boot bootargs 파라미터 값을 입력한다.
u-boot>setenv bootargs root=dev/nfs rw nfsroot=10.10.10.10:/mnt/TargetRamdisk ip=10.10.10.11:10.10.10.10:10.10.10.1:255.255.255.0::eth0:off console=ttyS0,115200 mem=64M
위 세팅값의 의미는 다음과 같다. 타겟마운트위치 속성 nfsroot=서버ip:서버nfs디렉토리 ip=타겟ip:서버ip:gateway:subnetmask
이렇게 하면 NFS 접속이 가능하도록 컴파일 된 커널이 초기 수행 시 부트로더로 부터 전달 받은 정보를이용하여 NFS로루트파일 시스템을마운트하게 된다. 다음과 같은u-boot 파라미터의 세팅으로 타이핑의 수고를 완전히 덜 수 있다.
u-boot>setenv bootcmd tftp21400000 9260kernel.img\;bootm 21400000
이제타겟보드는 시스템 리셋과 함께 자동으로 u-boot 수행 후 tftp로 커널 이미지를 sdram에 다운 받고 호스트에구축된 NFS로 마운트 할 수 있게 된다. 8Mbyte의 데이타플래쉬에 커널을 사전에 writing하고 bootcmd를 이용하여 진행하는 방법도 있으나 길어진다. 사실 지금은 점심시간이다. 원래는 낮잠을 자곤 했는데 이왕 시작한 블로그 잘 해보려고 지금 열심히 작성 마무리 했다. 초두에 말했듯이 리눅스 초짜이다. 하지만 이러한 정보를 통해 많은 이들에게 조금이나마 도움이 되길 바라는 맘으로 개인시간을 조금은 포기했다. 아니 내 자신을 혹독하게 훈련시키고 있는지도 모르겠다.
다음 포스트에서는 커널, 패치 획득과 빌드, 램디스크 활용에 대해 기술하도록 하겠다. 지금 고민은 64Mbyte의 nand 플래쉬를 어떤 파일 시스템으로 적용하는가이다. yaffs란 것이 성능과 안정성이 좋다고 하는데 ㅋ 이걸 어떻게 적용해야 되는지 무쟈게 또 공부해야 될 것 같다.