Android NFS文件系统挂载遇到的问题解决方法
在網上他人博客中方法都大同小異,但是卻無法解決我遇到的問題。
我隨意挑選一個網友的方法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信息如下:
明顯不一樣,這就說明了問題,當然注釋掉之后就沒問題了。
到此,該問題已經解決了。
總結
以上是生活随笔為你收集整理的Android NFS文件系统挂载遇到的问题解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子进程 post-installatio
- 下一篇: 关于Android的硬件抽象层添加进An