日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 5.x系统nfs挂载系统启动记录 nfs挂载文件记录

發(fā)布時間:2024/9/5 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 5.x系统nfs挂载系统启动记录 nfs挂载文件记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

應(yīng)該有不少開發(fā)Android系統(tǒng)的人有這樣的感覺,修改好了hal或者jni后,編譯,驗證的時候需要把編譯的文件發(fā)到機器上去,那么發(fā)送的時候使用什么方式,應(yīng)該是adb吧,我也是使用該方法。可是實際使用的時候是很煩心的,比如,adb有時候的識別問題,這次發(fā)送成功了下次可能就出點毛病,再搗鼓搗鼓,幾分鐘過去了,程序還沒驗證,毫無效率;還比如識別還好,在一次發(fā)送過程中識別的速度也并不快,如果驗證的文件需要重啟機器,那么下次發(fā)送還是需要慢的識別。總之調(diào)試起來不是很舒服。不知道大神是怎么玩這個的,如果有好的方法,告訴我一下。


于是為了方便的調(diào)試編譯結(jié)果,就想使用nfs方式掛載Android系統(tǒng),這樣就不需要往機器上頻繁的發(fā)送文件了。想法是美好的,現(xiàn)實是骨感的。

思路上是可以的,可是問題是,Android使用nfs怎么跑起來呢。

網(wǎng)上搜索了很多的資料,大多都是一個意思,在out的板級目錄下,找到rootfs和system組合成文件系統(tǒng)目錄,然后放到建立的nfs文件下,在Android開發(fā)板上設(shè)置u-boot的啟動環(huán)境,來掛載nfs。思路上沒問題,然而這樣的思路只是在跑Linux的過程中有用,開始啟動Android的時候就掛了,網(wǎng)絡(luò)中斷。

下面是我使用的環(huán)境設(shè)置:

setenv bootargs root=/dev/nfs console=ttyAMA0,115200 androidboot.hardware=s5p4418_realv1c androidboot.console=ttyAMA0 androidboot.serialno=0123456789abcdef init=/init nfsroot=172.16.24.7:/wsh-space/nfsboot/4418/android/system ip=172.16.24.6:172.16.24.7:172.16.24.254:255.255.255.0::eth0:oninit.rc文件內(nèi)容需要注釋掉下面

# once everything is setup, no need to modify /#mount rootfs rootfs / ro remount

注意在init.rc文件中務(wù)必確定有下面兩句,一般在on boot下:

class_start core #star core class class_start main #star main class這兩個是用來表示啟動的類型,每一個服務(wù)下都有一個class字段,后邊跟的就是類型,一般為core、main。如下:

service vold /system/bin/voldclass coresocket vold stream 0660 root mountioprio be 2service netd /system/bin/netdclass mainsocket netd stream 0660 root systemsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inet


fstab.s5p4418_realv1c中只需要留下下面那一行,其他注釋掉:

/dev/block/platform/dw_mmc.0/by-num/p7 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check這里說明一下為什么這樣,剛開始我是全部注釋掉,直接使用nfs文件系統(tǒng)目錄下的data文件夾,可是由于權(quán)限的問題,在修改和寫入數(shù)據(jù)時總是報告無權(quán)限錯誤,原因不詳,無奈之下就使用了開發(fā)板原本掛載的data目錄。由于data目錄為系統(tǒng)啟動后的目錄,對于系統(tǒng)的原文件無影響,所以使用開發(fā)板的也是可以的,一般調(diào)試的文件都在system目錄下,以及以下.rc文件。


做了上面的修改后理論上應(yīng)該可以掛載了,可是實際上是不行的,前面也說了,走Linux啟動部分時掛載正常無問題,可是走到Android啟動各種服務(wù)后就掛掉了,網(wǎng)絡(luò)失去聯(lián)系。經(jīng)過各種跟蹤排查(接觸的不夠深刻,開始不知道從哪里查起,走了不少的彎路),總算是定位到問題所在了,是netd服務(wù)的問題。


找到netd服務(wù)很不容易,走了很多的彎路,不過也值得,認(rèn)識的更多了。

在查找的時候有個問題,怎么查看Android系統(tǒng)的日志,也就是想看Android啟動的log,進而查看死在了什么地方,由于Android系統(tǒng)未啟動,在啟動過程中卡主了,那么logcat命令也就無法輸入了,怎么辦呢。于是想使用重定位的功能,把log輸出到文件,可是行不通,因為讀取的main日志為空,不知道為什么,可能是外部獨立的進程無法讀取。這個行不通就想使用往文件寫入數(shù)據(jù)來代替log,也就是使用open、read、write函數(shù)實現(xiàn)的,這個方法確實可以,可以得到想要的輸出,但是需要修改源碼不少,目前還不想這么整,因為偶然想到了另外的方法,不過該方法在其他都不可使用時用來調(diào)試jni和hal(僅限系統(tǒng)無法啟動的過程,能夠啟動就不需要了)還是可以的,很笨的方法。

那么偶然想到的方法是什么呢。Linux系統(tǒng)啟動部分nfs掛載是沒問題的,在加載Android庫和虛擬機的時候會有一個時間差,大概有幾秒的時間吧,應(yīng)該不超過五秒,這個時候是可以接受終端輸入的命令的,這時候手動或者直接粘貼的方式,輸入logcat命令就可以打印log信息了,即使是卡主也不會影響日志的輸出了。試了一下果然可以,嘿嘿。

隨著系統(tǒng)的啟動發(fā)現(xiàn)啟動netd服務(wù)后Android的nfs就掛掉了,看來是netd服務(wù)修改了Linux的網(wǎng)絡(luò)數(shù)據(jù),導(dǎo)致ip等信息改變,進而使網(wǎng)絡(luò)中斷,無法進行系統(tǒng)的掛載。

既然這樣那么試試不讓netd啟動,看看結(jié)果是什么,做如下修改:

service netd /system/bin/netd#class mainsocket netd stream 0660 root systemsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inet注釋掉class main那一行,重啟后發(fā)現(xiàn)可以過了,而且進入了Android啟動的界面,在更新app,當(dāng)然了,沒有netd服務(wù)Android系統(tǒng)是無法啟動的,因為網(wǎng)絡(luò)的相關(guān)服務(wù)netd是必須的,Android系統(tǒng)就卡在了更新完app狀態(tài)下,打印logcat,日志提示網(wǎng)絡(luò)服務(wù)的相關(guān)問題,再次以失敗告終。


離目標(biāo)很近了,看來是需要修改netd的源碼了,不過沒精力搞了,以后再研究吧。


需要補充一下,如果可以實現(xiàn)了應(yīng)該還需要做如下的工作:

在調(diào)試過程中為了保證Android啟動后網(wǎng)絡(luò)就是打開的,修改了源碼EthernetServiceImpl.java(路徑/frameworks/opt/net/ethernet/java/com/android/server/ethernet)中的star函數(shù),添加了下面的一行,來默認(rèn)開啟以太網(wǎng):

Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ETHERNET_ON,EthernetManager.ETH_STATE_ENABLED);另外還需要一個配置文件ipconfig.txt,路徑為data/misc/ethernet/ipconfig.txt,該文件用來設(shè)置Android啟動后為靜態(tài)IP,讓其與u-boot中的IP一致。

ipconfig.txt文件的獲得方法就不多說了,可以按照源碼的格式寫一個出來(源碼位置frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java),函數(shù)是readIpAndProxyConfigurations。也可以在Android系統(tǒng)中設(shè)置為靜態(tài)保存,然后把文件拷貝出來。

以上為nfs掛載的記錄,有了解的朋友可以一起交流。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面為另外一種相對來說調(diào)試方便的方法。應(yīng)該可以對以太網(wǎng)和wifi網(wǎng)絡(luò)都有效,我只使用了以太網(wǎng)方式。

該方法是使用nfs掛載PC上的一個目錄,把編譯的文件復(fù)制到pc的nfs目錄,在開發(fā)板上再執(zhí)行一個復(fù)制命令拷貝到指定位置即可完成傳輸,相對使用adb應(yīng)該快一些,但是弊端是網(wǎng)絡(luò)換得好,以及支持局域網(wǎng),也就是需要有wifi或者以太網(wǎng)。

在使用nfs之前我們需要一個工具,就是busybox,原因是Android自帶的mount工具是閹割版,功能不全,nfs的文件系統(tǒng)無法掛載,所以只能使用busybox工具來實現(xiàn)了,busybox自帶mount命令和umount命令。把busybox通過adb方式push到/system/xbin目錄下,并修改為777權(quán)限,保證可執(zhí)行。

掛載的命令如下,注意在執(zhí)行下面命令前確保網(wǎng)絡(luò)是通的。

busybox mount -t nfs -o nolock 172.16.24.7:/work-space/nfsboot/4418/android/workspace_nfs /data/work其中/data/work為開發(fā)板上的目錄,可以自由設(shè)置,不過最好在data目錄下,避免因為權(quán)限引起的問題。

這樣在開發(fā)板操作/data/work目錄即是在操作PC上的目錄,拷貝文件什么的就很方便了。也無需USB連接的需要,沒有識別不穩(wěn)定的問題了。

為了掛載和卸載方便,可以做成.sh腳本的形式,比如:

my_mount.sh

#!/bin/sh busybox mount -t nfs -o nolock 172.16.24.7:/work-space/nfsboot/4418/android/workspace_nfs /data/work</span>my_umount.sh
#!/bin/sh busybox umount /data/work把這兩個文件放到/system/xbin目錄下即可直接調(diào)用了,更加方便,對于調(diào)試的庫文件,也可以寫成腳本的形式,編譯完直接執(zhí)行腳本即可完成傳輸。

記錄完畢。





總結(jié)

以上是生活随笔為你收集整理的Android 5.x系统nfs挂载系统启动记录 nfs挂载文件记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。