在网上他人博客中方法都大同小异,但是却无法解决我遇到的问题。
我随意挑选一个网友的方法http://blog.csdn.net/zjg555543/article/details/7792984
当然我的虚拟机的NFS是配置好的,Linux挂载没有问题。
这里我就不详细说明网上存在的相同的东西了,主要是要注意Android的nfs文件系统与Linux不一样,构建Android的文件系统需要Android编译源码out板级目录下的三个文件夹的文件(/out/target/product/***/),即root、data、system。
看下面三条命令
$cp -rf $OUTPUTDIR/root/* /nfsroot
$cp -rf $OUTPUTDIR/system /nfsroot
$cp -rf $OUTPUTDIR/data /nfsroot
由上面三条命令拷贝文件到nfsroot目录下即可,这里一定要注意第一条的拷贝,并非拷贝root文件夹,而是拷贝root目录下的所有文件。
可以确定我的nfs服务器,目录的构建都没有问题,可是死活起不来。网上还有说修改init.rc文件的,可是修改还需要对Android源码做操作,就没干。
虽然说网上说修改init.rc的方法我没用,但是给我提供了思路。Linux内核起来后会加载ramdisk文件,把该文件下的所有文件拷贝到文件系统中,而init.rc就在里面,内核会去加载它,做一些初始化的工作,其中就有对系统目录的操作,进而决定使用的根文件系统位置。
存在加载ramdisk.img时的情况如下:
[ 2.704625] dm9000 dm9000: eth0: link down
[ 2.707371] ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 2.889699] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 2.904730] IP-Config: Complete:
[ 2.906471] device=eth0, addr=192.168.1.21
[ 2.910836] dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
[ 2.917844] , mask=255.255.255.0, gw=192.168.1.1,
[ 2.922244] host=192.168.1.21, domain=, nis-domain=(none),
[ 2.928158] bootserver=192.168.1.22, rootserver=192.168.1.22, rootpath=
[ 2.935580] Freeing init memory: 192K
[ 2.950182] init: could not import file /system/etc/init.local.rc
[ 2.955826] init: /init.smdkv210.rc: 93: invalid command ‘rmmod‘
由上分析发现,在内核加载完init.rc对于nfs的挂载设置就给忽略了,这可以说明,在init.rc文件中对根文件系统做了设置,而且覆盖传递给内核的nfs的设置参数,进而虽然nfs设置正确也无法挂载。
既然加载ramdisk.img会影响nfs的挂载,那么把它删了就好了。可以把之前存放该文件的空间擦除即可,这么做之后成功挂载了。成功挂载后打印的应该是下面的信息:
[ 2.684659] dm9000 dm9000: eth0: link down
[ 2.687409] ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 2.889733] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 2.904765] IP-Config: Complete:
[ 2.906504] device=eth0, addr=192.168.1.21
[ 2.910869] dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
[ 2.917878] , mask=255.255.255.0, gw=192.168.1.1,
[ 2.922277] host=192.168.1.21, domain=, nis-domain=(none),
[ 2.928317] bootserver=192.168.1.22, rootserver=192.168.1.22, rootpath=
[ 2.945327] VFS: Mounted root (nfs filesystem) on device 0:11.
由此延伸,发现这个ramdisk的加载与u-boot有关,我的板子是realarm210的EMMC版本。默认的加载内核环境变量是:
setenv bootcmd "movi read kernel 30008000;movi read rootfs 40800000 180000;bootm 30008000 40800000"
可以看到会有rootfs的加载,这时如果把rootfs给删掉呢,是不是ramdisk.img在emmc中就不用删除了,该成的命令如下:
setenv bootcmd "movi read kernel 30008000;bootm 30008000"
回头试试。
已测试了,修改u-boot参数也是可行的。这里记录一下,网友遇到这类问题时可参考一下。
原文地址:http://blog.csdn.net/wang_shuai_ww/article/details/39498091