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

我随意挑选一个网友的方法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文件系统挂载遇到的问题解决方法_第1张图片

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

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

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

开发板的system信息如下:

Android NFS文件系统挂载遇到的问题解决方法_第2张图片

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

Android NFS文件系统挂载遇到的问题解决方法_第3张图片


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


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

更多相关文章

  1. android小功能实现之xml文件解析(Pull)
  2. android中下载文件到sdcard和进度条小结
  3. Android R文件丢失解决办法
  4. Android init.rc文件解析过程分析
  5. Android 数据存储02之文件读写
  6. Android XML文件解析
  7. Android 如何在XML文件中定义动画

随机推荐

  1. Android单元测试(二)
  2. Android(安卓)Volley 详解 Google发布的
  3. android防新闻循环轮播图效果
  4. 整理 酷炫 Android、Flutter开源UI框架
  5. android轻量级开源缓存框架——ASimpleCa
  6. Android(安卓)连续多次点击事件的实现
  7. 分析各种Android设备屏幕分辨率与适配 -
  8. Android(安卓)开发中使用 SQLite 数据库
  9. android framework 源码流程分析技巧
  10. Android(安卓)LinearGradient的使用