在网上他人博客中方法都大同小异,但是却无法解决我遇到的问题。

我随意挑选一个网友的方法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参数也是可行的。这里记录一下,网友遇到这类问题时可参考一下。



修正上面的一个问题,关于init.rc的。

看来还是需要修改该文件的,不同开发板,不同的Flash恐怕都要修改该文件。

具体如下:

主要是下图所示的位置:


下面红框是Android默认的,上面的红框是开发板添加,由于要使用nfs,所以都要给注释掉。

原因是:系统默认是挂载的是emmc的ext4分区,如果不注释掉,那么访问的system目录并非构建的根文件系统下的system文件。

不注释上图的代码是情况如下:

开发板的system信息如下:


而nfs文件系统的system信息如下:



明显不一样,这就说明了问题,当然注释掉之后就没问题了。


到此,该问题已经解决了。

Logo

更多推荐