포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
오드로이드(ODROID)에 이더넷(유선랜) 기능이 없어 개발시 불편한 점이 한가지 있습니다.
커널이나 부트로더 개발은 USB 전송을 이용해서 편리하고 빠르게 할수 있으나
안드로이드 시스템이나 일반 리눅스 Root File System을 개발하기에는 좀 불편하다는 것입니다.
T-Flash를 빼서 PC에 연결해서 복사하고 다시 넣어 테스트 하는 과정을 반복하다보면 시간 소모가 많습니다.
그래서 NFS로 부팅할수 있는 방법을 찾아 보았습니다.
목표: Odroid의 USB Gadget Ethernet Driver를 이용하여 NFS 부팅을 가능하게 한다.
결론: 됩니다. 아주 고속으로 100M이더넷보다 훨씬 빠르고 안정적으로...
참고 자료
http://bec-systems.com/site/418/how-to-set-up-a-nfs-rootfs
http://elinux.org/Mount_BeagleBoard_Root_Filesystem_over_NFS_via_USB
커널 설정부터 수정합니다. 소스는 손댈필요 없으니 간단합니다.
make menuconfig
<1> NFS 기능 활성화 (모두 빌트인으로 체크 합니다)
File systems -> Network File System -> NFS client support 를 체크하고
NFS client support for NFS version 3 및 Root file system on NFS 를 선택
<2> 이더넷 가젯 활성화 (모두 빌트인으로 체크 합니다)
Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers를 선택하여
Ethernet Gadget (with CDC Ethernet support)로 변경 (빌트인 시켜야함)
* 기존에는 Android Composite(ADB+UMS)로 되어 있었음.
빠져나와서 커널 빌드
(빌드 및 커널 이미지를 전송하고 기록하는 방법은 아래 링크 참고)
http://dev.odroid.com/projects/linux/
수정된 커널만 적용하여 T-flash의 안드로이드로 부팅을 하고 Odroid와 개발 호스트(리눅스)가 USB로 연결되어 있다면
호스트 측에서 lsusb 명령으로 살펴보면 다음과 같은 새로운 장치가 붙어 있다는것을 확인할 수 있습니다.
Bus 001 Device 010: ID 0525:a4a2 Netchip Technology, Inc. Linux-USB Ethernet/RNDIS Gadget
그리고 ifconfig 해보면 아래와 같이 이더넷 장치가 보이죠~~
usb0 Link encap:Ethernet HWaddr ea:e9:0a:53:0f:1d
inet6 addr: fe80::e8e9:aff:fe53:f1d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
이제 Odroid와 Host PC에 각각 유선랜 이더넷 장치가 양쪽에 하나씩 생긴것 입니다.
물론 이렇게 가젯을 올리면 기존에 사용하던 안드로이드용 ADB+UMS 가젯이 없어지므로 다소 제약이 있긴하지만, 추후에 ADB+UMS+LAN 형식으로 Composite driver를 만들수 있을것 같습니다.
물론 다른 리눅스(Debian-ARM이나 ARM-Ubuntu)를 올릴때에는 문제가 없겠죠..
그럼 이제 호스트 PC에 루트 파일시스템을 준비하고, NFS server 설정을 하여 부팅을 시켜봅니다.
이미 개발 호스트에 nfs-kernel-server가 설치되어 있다고 가정합니다. 우분투기준으로 말씀드립니다.
없다면 # apt-get install nfs-kernel-server 를 통해 설치하시길...
NFS의 Root File System의 위치는 /nfsroot 라고 가정.. 나중에 여러가지 RootFS들이 올수도 있음.
# sudo mkdir /nfsroot
빌드한 Android Root File System의 위치는 ~/myandroid/rootfs 라고 가정하고 이것을 복사합니다.
# sudo mv ~/myandroid/rootfs /nfsroot/
옮기지 말고 symbolic-link를 걸어도 좋습니다. 제 생각에는 이 방법이 정석입니다.
하여간 루트파일 시스템은 /nfsroot/rootfs에 준비가 되었습니다.
다음과 같이 NFS Client에 노출될 디렉터리를 추가합니다.
#sudo gedit /etc/exports
편집창이 뜨면 아래 내용 추가
/nfsroot/rootfs *(no_root_squash,sync,rw)
그리고 위 편집한 내용이 NFS 서버에 영향이 미치도록 NFS server daemon 다시 기동시킵니다.
# sudo /etc/init.d/nfs-kernel-server restart
이제 마지막으로 Odroid의 u-boot 설정만 바꾸면 되겠죠.
현재 T-flash 기준의 bootargs는 다음과 같습니다.
bootargs=root=/dev/mmcblk0p2 rw rootfstype=ext3 mem=384m init=/init console=ttySAC0,115200
이 것을 NFS 환경에 맞게 다음과 같이 변경하여야 합니다. (savenv 필요)
setenv
bootargs 'root=/dev/nfs rw ip=192.168.0.133::255.255.255.0 mem=384m
init=/init console=ttySAC0,115200
nfsroot=192.168.0.250:/nfsroot/rootfs,nolock,rsize=1024,wsize=1024'
그리고 커널 부팅중 서버에서 USB가 인식 되자마자 호스트에서 다음과 같이 입력합니다.
# sudo ifconfig usb0 192.168.0.250
지금은 이 부분이 자동으로 안되지만... .. udev에 rules 추가하면 될것 같기는 합니다.
잘 아시는분께서 꼭 도와주시길 바랍니다. 꼭 !!!
하여간 이렇게 하고나면, 안드로이드가 부팅이 됩니다.. T-Flash보다 더 빠릅니다.
기존 100M급 이더넷보다도 훨씬 빠르고 편리합니다. 일명 "광속 USB 480MBPS 가상 이더넷"이라 부르겠습니다.
이제 앞으로 만들 보드에는 절대로 이더넷을 넣지 않을 생각입니다. 아래와 같은 이유로...
<1> 부트로더/커널/루트파일 시스템 개발이 모두 초고속 USB만으로 가능하므로...
<2> 어차피 보안장비나 네트웍장비는 저렴하고 강력한 전용 CPU들이 많아 범용 AP로는 경쟁력이 전혀 없으므로...
<3> 이더넷 칩과 RJ-45 수급이 상당히 귀찮고 생산도 번잡스러우니...
끝으로 이 USB Gadget 방법으로 NFS 부팅에 성공하신 분이나 실패하신분들 모두 댓글 부탁드립니다.
Angstrom이나 OpenEmbedded 등등 여러 종류의 시스템을 테스트하는데 생각보다 재미있습니다.
꼭 한번 사용해 보시고, 문제점 있으면 피드백 바랍니다.
추신: 이렇게 만들고 나서 호스트측에 Network Bridge 설정만 잘해주면 Odroid에서 무선랜 환경이 아니더라도 인터넷을 사용할수 있을것 같습니다. 정말 가제트 같네요..
USB에서 Ethernet을 에뮬레이팅해주는 기능은...
크게 ECM과 EEM, NCM 이렇게 3가지가 지원합니다.. ATM도 있지만 이더넷이라고 볼 수 없어서...
L사에서 Android 폰을 개발하는데 ECM 사용하고 있다고 들었습니다..
Linux Kernel 2.6.2x 버전 중반부터 ECM과 EEM 클래스 드라이버까지 포함이 되어 있는걸로 알고있습니다..
(제가 리눅스에 대한 정보를 확인하는걸 잘 못해서.. 정확한 버전을 말씀드리기가 어렵네요..
그리고 NCM은 현재 지원이 되는지는 모르겠습니다.. 가장 마지막에 나온 프로토콜이라서...)
제가 앞으로 해야할 일이 그 쪽 부분인데..
리눅스 개발을 해본적이 없어서 시간이 좀 걸리겠지만 도움을 드릴 수 있도록 노력하겠습니다.. ^^;
컴팩의 iPAQ H3630 초기 모델에 리눅스를 올려서 USB NET으로 연결했던 기억이 납니다.
PDA에서 잡히는 장치명은 usbnet 이었고 hotplug 가 지원되긴 했지만 IP설정을 위해서
스크립트를 작성했었습니다. 근데 이게 한번만 동작하고 USB케이블을 뺐다가 다시 끼우면
동작을 안해서, 그 이후로는 어떻게 처리했었는지 기억이 안나는군요. --;
NFS mount 도 잘 됬었고(부팅후 별도로 mount, NFS RootFS는 아니었음), VNC로 연결해서 리눅스 데스크탑에 화면을 띄울수도 있었습니다. 제가 기억나는건 여기까지로군요.
ECM -> EEM -> NCM 이런 순서로 나왔구요.. ECM은 Full Speed까지 지원하는 스펙입니다..
아마 ECM 최근 드라이버들은 High Speed도 지원할껍니다..
(그리고 USB.org 문서에 의하면 EEM 1.0(2005.02)이 ECM에서 페이로드를 줄인 스펙이고,
NCM이 ECM의 향상된 버전이라고 되어있습니다..)
EEM 드라이버가 커널 2.6.2x 중반부터인가 들어간 걸로 알고요..
ECM은 역사가 꽤 됐으니깐 훨씬 이전 버전부터 커널에 드라이버가 포함되었겠죠..
(EEM 정의한 것만도 5년인데..)
그러니 개발했다라기 보단 포팅이 더 가깝지 않을까 싶습니다..
그보다도 리눅스 개발이 처음이라.. 뭘 어찌해야하는지 참 막막하네요... =.=
현재 오드로이드 u-boot에서는 삼성에서 만든 조금은 이상한 프로토콜 "DNW" 라는 것을 사용해서 커널/부트로더 이미지를 USB를 통해 전송하고 있습니다.
그 뒤에 커널이 부팅되면서 ECM이 활성화되어 NFS 루트로 부팅되는 구조입니다.
참고로 DNW는 단순한 벌크 인터페이스로 24xx 시절부터 윈CE 개발용으로 사용했던것 같은데, 벤둑스께서 리눅스로 포팅을 하셨고, 이것을 박형관님께서 6410용으로 수정을 하셨는데... 이걸 오드로이드에서도 사용하고 있습니다.
이미 편하게 사용하고 있기에, 부트로더용 gadget 드라이버를 포팅하는 일은 생각하고 있지 않습니다..
수고하셨습니다...^^
내일 여러가지 정리가 끝나면 함 시도해봐야겠네요...
추신: iptables를 이용해서 NAT를 구성하면 인터넷도 상관이 없이 쓸 수 있습니다.
수요일 정도에 해보고 하우투 올리겠습니다.
그리고, opensimpad.org 에도 약간의 usb networking howto가 있었던 것으로 기억이 납니다....