一、 步驟
1. 搭建NFS服務器
(1) 安裝
# sudo apt-get install nfs-kernel-server
(2) 配置
# vi /etc/exports,添加一行:
/share_path ip(rw,sync,no_root_squash)
Eg. /home/ubuntu/nfsroot 192.168.1.*(rw,sync,no_root_squash)
(3) 重啓NFS
# sudo /etc/init.d/nfs-kernel-server restart
(4) 測試
# mount pc_ip:/share_path /mnt 或
# mount 127.0.0.1:/share_path /mnt
2. 修改內核或init進程,使設備只運行shell,詳見注1、2
3. 設備啓動後,設置環境變量
#export PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
# exportLD_LIBRARY_PATH=/vendor/lib:/system/lib
4. 加載wifi驅動,並配置網絡
# insmod /system/module/bcmdhd.ko "firmware_path=/system/etc/wifi/fw-bcmdhd.bin nvram_path=/system/etc/wifi/nvram-bcmdhd.txt"
# chmod 4777 /system/bin/wpa_supplicant
# busybox ifconfig wlan0 192.168.1.199
# busybox route add default gw 192.168.1.1
# netcfg
5. 連接wifi,參見注3
# /system/bin/wpa_supplicant -B -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
6. 掛載NFS
# busybox mount -t nfs -o nolock192.168.1.190:/home/ubuntu/nfsroot/ /mnt/nfs
7. 卸載已掛載的虛擬文件系統,並設置新的根目錄
# umount /sys
# umount /proc
# umask 000
# cd /
# busybox chroot /mnt/nfs /system/bin/sh
8. 運行init
# ./init
二、可能問題
1. mount nfs時,提示no such device。
內核需配置nfs支持
2. mount nfs時。提示invalid argument
需要使用busybox mount。
3. 使用wpa_supplicant.conf連接wifi時,提示deamon錯誤
需要先掛載sys,proc,dev。
依賴的設備節點爲/dev/urandom,/dev/null
4. 運行init時大量進程無法啓動
修改/etc/exports加入no_root_squash字段,確保nfs客戶端有寫權限
三、注
注1:只運行shell,可修改內核,註釋掉init執行代碼,並添加執行shell的代碼
Eg: + run_init_process("/system/bin/sh");
這種情況下,需要手動掛載sys和proc並手動創建相應設備節點
mount [-t vfstype] [-o options] device dir
注2:在init內掛載虛擬文件系統、fork shell進程後停止,修改init的main函數:
Mount函數傳入參數註釋:
(1)掛載類型
(2)掛載路徑
(3)掛載設備
(4)指定文件系統的讀寫訪問標誌
(5)設備掛載選項(exp:”mode=0777”)
mount("proc","/proc", "proc", 0, NULL);
mount("sysfs","/sys", "sysfs", 0, NULL);
//以下是添加
if ((pid = fork()) < 0) {
ERROR("forkfail\n");
}
if (!pid) {
if (execl("/system/bin/sh","/system/bin/sh", (char *) NULL)) {
ERROR("shexec fail\n");
return-1;
}
ERROR("Data Call Should never gethere!\n");
}else {
if (execl("/sbin/ueventd","/sbin/ueventd", (char *) NULL)) {
ERROR("ueventexec fail\n");
return-1;
}
}
while(1);
注3:連接wifi使用的配置文件是/data/misc/wifi/wpa_supplicant.conf,裏面需要有待連接wifi的參數。可從已連接過此wifi的設備提取wpa_supplicant.conf文件。內容:
ctrl_interface=wlan0
update_config=1
network={
ssid="VANSTONE-RD"
psk="van12345"
key_mgmt=WPA-PSK
priority=2
}