노무현 대통령 배너


2006. 8. 30. 13:59

[Embedded Tip] 타겟보드에서 NFS root부팅하기!

드디어..타겟보드에서 NFS root부팅하는 데 성공했다..별로 어려운 것도 아닌데
이런저런 삽질도 무진장 많았고..시간도 없는데..이리저리 돌긴 했지만..T.T
그래서 전혀 기쁘지 않다-.-;;

환경
CPU : AMD Mips
Compiler : Montavista 3.1
Linux : Redhat 9.0
Kernel : 2.4.20-8
bootloader : YAMON

1) 커널 설정
커널은 nfs서버가 될 부분이랑 클라이언트가 될부분이랑 동시에 다 봐줘야 한다.서버는 nfs파일시스템 지원을 하든 안하든 상관없지만 클라이언트는 반드시 지원해야한다.그리고 서버단에서는 NFS server support를 선택해주자.일반적인 배포판을 사용하는 경우에는 대부분의 옵션이 선택되어 있으므로 문제가 없다. 다음은 서버단과 클라이언트단에서 반드시 필요한 커널 설정이다.

Networking options --->
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: BOOTP support

File systems --->
<*> NFS file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS

이외의 설정이 필요없다는 게 아니므로 요건만 빼고 다 삭제하는 일과 같은 열성은 보이지 않아도 된다.

client> cat /proc/filesystems
nodev rootfs
nodev bdev
nodev proc
nodev sockfs
nodev tmpfs
nodev shm
nodev pipefs
ext3
ext2
nodev ramfs
msdos
vfat
nodev devfs
nodev nfs
jffs2
romfs
nodev autofs
reiserfs
nodev devpts

없으면 filesystem->network file system에서 nfs를 선택해주자.

또 서버단에서 할일이 bootp를 설정해주는 것이다. 이는 실제 타겟보드가 부팅하면
서 자신의 IP를 가져오는 역할을 하게 된다.

2) nfs 데몬 설정
nfs를 사용하려면 일단 공유하려는 폴더의 권한 등을 설정해주어야 한다.
이 설정 파일은 /etc/exports에 들어있다.

/opt/montavista/pro/devkit/mips/fp_le/target *(rw,sync,no_root_squash,no_all_squash)
/nfs_share *(rw,sync,no_root_squash)

왼쪽은 공유할 폴더의 이름이고 오른쪽은 권한 및 옵션을 설정하는 것이다.보면
알겠지만

rw : read-write해주겠다는 얘기고,
sync : nfs간에 지속적으로 싱크를 맞춰주겠단 얘기고 ,
root_squash, no_root_squash : NFS 서버에도 root 사용자가 있을 것이고, NFS 클라이언트에도 root가 있을 것이다. 그러나 두 root가 같은 root가 될 순 없다. NFS 클라이언트의 root가 NFS 서버의 root 권한을 가질 수 없다. 따라서 기본값은 root_squash로 클라이언트 root는 nobody와 같은 사용자로 맵핑되어 버린다. 서버와 클라언트의 root 사용자를 일치하도록 하려면 no_root_squash라고 적으면 된다.
all_squash, no_all_squash : 기본값은 no_all_squash로서 root를 제외한 일반 사용자 ID에 대해서는 서버와 클라이언트 UID가 동일한 사용자이며 동일한 권한을 갖는다고 생각한다. 이는 root에 대한 기본 처리값과 반대이다. 그러나 all_squash를 해버리면 모든 UID, GID를 무조건 익명 사용자 ID로 매핑해 버린다.

상큼하게 설정 적용해주자. exportfs는 /etc/exports를 보여주기도 한다.

host>exportfs -ra

좀 더 안전하게 갈사람은 nfs도 다시 시작해주자.
host>/etc/init.d/nfs restart

3) DHCP 설정

#/etc/dhcpd.conf

deny unknown-clients;
ddns-update-style none;
allow bootp;

option routers xxx.xxx.xxx.xxx;//게이트웨이 설정

subnet a.b.c.d netmask e.f.g.h {//네트웍 설정. host pc의 subnet과 netmask
default-lease-time 1209600; # two weeks
max-lease-time 31557600; # one year

#range 192.168.126.100 192.168.126.200;

group {
host name.your.domain {/etc/hosts에 등록되어 있다면 도메인으로 사용가능
//보드는 기본적으로 mac어드레스가 없다고 한다.
//부트로더에서 임의로 설정한 값과 동일해야한다.
hardware ethernet xx:xx:xx:xx:xx:xx;

//보드에게 할당할 ip 역시 부트로더에서 임의로 설정한
//값과 동일해야 한다.
fixed-address m.n.o.p;

//루트 파일시스템으로 쓸 폴더
// /etc/exports에 설정된 폴더여야 한다.
option root-path "/opt/montavista/pro/devkit/mips/fp_le/target";
}
}
}
이부분은 타겟보드의 부트로더에서 설정한 것과 동일해야한다.

dhcpd 서버 재실행
host> /etc/init.d/dhcpd restart

4) Bootptab 설정
/etc/bootptab설정을 해주자.
.default:
:hd=/opt/montavista/pro/devkit/mips/fp_le/target:bf=null:
:sm=255.255.255.0

.PMG:
:ha=00.02.69.10.10.13:tc=.default:ip=xxx.xxx.xxx.xxx:

5) Bootp 확인
bootp가 올라와있나 확인해보자.
host> netstat -a | grep bootps

안올라와있으면 xinetd를 다시 실행해보자
host> /etc/init.d/xinetd restart

6) root 파일 시스템이 될 곳의 fstab 설정
보드에서 커널이 로딩되면 호스트 pc의 공유폴더/etc/fstab의 정보를 가지고 마운트
를 한다. 따라서 /etc/fstab에다가 mount정보를 써주자.

host>/etc/fstab
# /etc/fstab: static file system information.
#
#
xxx.xxx.xxx.xxx:/opt/montavista/pro/devkit/mips/fp_le/target / nfs defaults 0 0
#none /dev devpts gid=5,mode=620 0 0 i
none /proc proc defaults 0 0

이런 식으로..안 그러면 로딩할때 기본적으로 read-only가 되어버린다.T.T

7) 보드에서 - YAMON 설정
YAMON으로 들어가서 설정을 해주자.
보드의 이더넷은 ip주소 및 mac어드레스가 할당이 안되있다고 한다
확인해서 호스트 pc의 정보와 bootloader의 정보를 매핑하자.

YAMON> setenv -> 설정값들 확인

YAMON> setenv bootserver xxx.xxx.xxx.xxx -> host 서버의 ip주소
YAMON> setenv ipaddr xxx.xxx.xxx.xxx. -> 보드(client)의 ip주소
YAMON> setenv netmask xxx.xxx.xxx.xxx ->보드(client)의 netmask

8)보드에서 - 커널 로딩
커널은 tftp설정할 때 알아서 잘 놓고..
tftp설정 파일은 /etc/xinetd.d/tftp이다. 설정한뒤 /etc/init.d/xinetd restart.

YAMON>load
YAMON>go -> 주의..root=/dev/mtdblock1이런식으로 root를 플래시 메모리로
잡으면 안된다. 걍 go만 치자! 이것 땜시..T.T

이렇게 하면 공유폴더를 루트 디렉토리로 인식해서 부팅을 하게 된다..
질문 사항 있으시면 답글로-.-;;