用NFS作为rootfs来启动内核在开发中的必备的,用nfs启动android,也就免去频繁的对nand烧写操作。网上有很多文章,可惜都是互相copy,参考性不强。下面来说明如何用NFS来启动android,具体的操作就不细说了。通常的嵌入式linux使用NFS启动,需要启动NFS的文件系统和相关网络支持,这是第一步,至少内核在最后阶段能mount到FS,而mount之前网络协议也必须是支持的。

1.内核启用NFS文件系统支持,网络里面支持IP_PNP下的BOOTP,DHCP,RARP

2.android内核在最后阶段,是执行RAMDISK中的init进程来remount分区,system和data也是在这个时候才挂载上的。使用NFS启动时,要关闭内核中的ramdisk功能。这样,内核启动后,mount到NFS的目录,然后直接执行NFS目录下的init进程

3.准备android的文件系统。编译aosp代码,最终生成system, data, root目录,分别copy到NFS目录下,配置NFS允许网络访问该目录。在nfsroot目录下,需要修改init.rc文件。里面会对system重新挂载,可以注释掉该内容,修改如下:

#on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
#mount yaffs2 mtd@system /system
#mount yaffs2 mtd@system /system ro remount
#mount yaffs2 mtd@userdata /data nosuid nodev
#mount yaffs2 mtd@cache /cache nosuid nodev

on post-fs
# once everything is setup, no need to modify /
mount rootfs rootfs / rw remount

这里,我关闭也on fs的action操作,记得把on fs也注释掉。

4.内核启动参数

mem=128M console=ttyS0,115200 androidboot.console=ttyS0 root=/dev/nfs nfsroot=192.168.1.200:/srv/sam9x5_androidfs ip=192.168.1.190:192.168.1.200:192.168.1.1:255.255.255.0::eth0:off init=/init rootdelay=5

挂载NFS来说并不难,主要是android使用了ramdisk来启动,结果花了一天半时间才搞定。