Android NFS文件系统挂载遇到的问题解决方法
在网上他人博客中方法都大同小异,但是却无法解决我遇到的问题。我随意挑选一个网友的方法http://blog.csdn.net/zjg555543/article/details/7792984当然我的虚拟机的NFS是配置好的,Linux挂载没有问题。这里我就不详细说明网上存在的相同的东西了,主要是要注意Android的nfs文件系统与Linux不一样,构建Android的文件系统需要A
在网上他人博客中方法都大同小异,但是却无法解决我遇到的问题。
我随意挑选一个网友的方法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信息如下:
明显不一样,这就说明了问题,当然注释掉之后就没问题了。
到此,该问题已经解决了。
更多推荐
所有评论(0)