2011年01月25日
KZM-A9-DualボードでNFSブートする
KZM-A9-DualボードのubootではカーネルのイメージをNFSでロードすることができます。
昔はカーネルはtftpでロードして、ルートファイルシステムはNFSでマウントすることが多かったのですが、これだとNFSサーバとTFTPサーバの2つを設定する必要がありました。
カーネルもNFSでよくなったので、TFTPサーバが不要になりました。
NFSサーバにファイルを置く
NFSサーバの設定方法はこちらが参考になります。
NFSサーバの /export/android/root にルートファイルシステムを展開し、/export/android/boot にuImageを置きます。
$ sudo mkdir -p /export/android/root $ sudo tar xvpf android-root.tar.bz2 -C /export/android/root $ sudo mkdir -p /export/android/boot $ sudo cp uImage /export/android/boot/
U-bootの設定
ターゲットのIPアドレスを192.168.1.100
NFS server のIPアドレスを192.168.1.26 とすると
KZM-A9-Dual# setenv ipaddr 192.168.1.100 KZM-A9-Dual# setenv serverip 192.168.1.26 KZM-A9-Dual# setenv rootpath /export/android/root KZM-A9-Dual# setenv cfg_ddr mem=135M@0x40000000\ mem=256M@0x50000000 KZM-A9-Dual# setenv nfsboot setenv bootargs root=/dev/nfs noinitrd init=/init cons ole=ttyS1,115200n8n \$(cfg_ddr) rw nfsroot=\$(serverip):\$(rootpath),timeo=30 ip=\$(ipaddr): \$(serverip):\$(gatewayip):\$(netmask):\$(hostname):eth0:off\;nfs /export/android/boot/uIm age\;bootm KZM-A9-Dual# setenv bootcmd run nfsboot KZM-A9-Dual# saveenv
ブートログ
U-Boot 2009.03-rc1 (Jan 21 2011 - 14:14:43) Booted Device: NOR Flash Board: EM/EV ES2 (Rev.ffffff20) Core: 1.15v DRAM: 512 MB Flash: 64 MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 DRIVER_VERSION : 110, DATECODE : 080408 LAN9x18 (0x92210000) detected. Read mac address: 00:0A:A3:02:12:AF start Auto negotiation... (take ~2sec) Auto negotiation complete, 100BaseTX, full duplex File transfer via NFS from server 192.168.1.26; our IP address is 192.168.1.100 Filename '/export/android/boot/uImage'. Load address: 0x40007fc0 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################################### done Bytes transferred = 3896512 (3b74c0 hex) ## Booting kernel from Legacy Image at 40007fc0 ... Image Name: Linux-2.6.29-00253-g00298d9-dirt Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3896448 Bytes = 3.7 MB Load Address: 40008000 Entry Point: 40008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... Linux version 2.6.29-00253-g00298d9-dirty (koba@koba-linux2) (gcc version 4.4.1 (Sourcery G ++ Lite 2009q3-67) ) #8 SMP PREEMPT Fri Jan 21 14:18:27 JST 2011 CPU: ARMv7 Processor [411fc092] revision 2 (ARMv7), cr=10c57c7f CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine: KZM9D Memory policy: ECC disabled, Data cache writealloc Built 2 zonelists in Zone order, mobility grouping on. Total pages: 99314 Kernel command line: bootargs root=/dev/nfs noinitrd init=/init console=ttyS1,115200n8n mem =135M@0x40000000 mem=256M@0x50000000 rw nfsroot=192.168.1.26:/export/android/root,ti meo=30 ip=192.168.1.100:192.168.1.26::::eth0:off PID hash table entries: 2048 (order: 11, 8192 bytes) Console: colour dummy device 80x30 Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 135MB 256MB = 391MB total Memory: 391936KB available (3520K code, 768K data, 128K init) ....
ビルドしたときに自動的に/exportのファイルを更新するようにしておけば、ビルドした後にすぐに実行してみることができます。SDカードなどの抜き差しが不要なので便利です。
2011.4.27 追記
ターゲット内の /system/etc/init.kzm9d.sh の中でdhcpサーバによるIPアドレスの取得を前提としているところがありました。今回の記事のようにIPアドレスをカーネルのブートパラメータで固定的に設定する場合には一番後ろの netcfg の行をコメントアウトしてください。
... case ${ret} in 0) insmod /lib/modules/pvrsrvkm.ko chmod 666 /dev/pvrsrvkm /system/bin/pvrsrvinit ;; esac #netcfg eth0 up dhcp
ソースツリーの中ではこのファイルは以下の場所にあります。
device/kmc/kzm9d/init.kzm9d.sh
この修正をしないと以下のように、一度NFSマウントに成功しながら途中で途切れてしまいます。
net eth0: SMSC911x/921x identified at 0xe0840000, IRQ: 167 IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete: device=eth0, addr=192.168.150.10, mask=255.255.255.0, gw=255.255.255.255, host=192.168.150.10, domain=, nis-domain=(none), bootserver=255.255.255.255, rootserver=192.168.150.1, rootpath= Looking up port of RPC 100003/2 on 192.168.150.1 Looking up port of RPC 100005/1 on 192.168.150.1 VFS: Mounted root (nfs filesystem). Freeing init memory: 128K Warning: unable to open an initial console. # enabling adb adb_open nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying nfs: server 192.168.150.1 not responding, still trying