1. 完善根檔案系統
在用 BusyBox 建構根檔案系統一文中介紹了根檔案系統的制作,rootfs制作完成後測試時,提示無法運作“/etc/init.d/rcS”這個檔案,說明rootfs仍然不夠完善,下面将介紹如何完善根檔案系統。
1.1 建立 /etc/init.d/rcS 檔案
rcS 是個 shell腳本,Linux核心啟動後需要啟動一些服務,rcS就是規定啟動哪些檔案的腳本檔案。在 rootfs中建立 /etc/init.d/rcS檔案,指令如下:
mkdir -p etc/init.d/
cd etc/init.d/
touch
然後在rcS檔案中輸入如下内容:
1 #!/bin/sh
2
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH
6
7 mount -a
8 mkdir /dev/pts
9 mount -t devpts devpts /dev/pts
10
11 echo /sbin/mdev > /proc/sys/kernel/hotplug
12
- 第 1 行,表示這是一個 shell 腳本
- 第 3 行,PATH 環境變量儲存着可執行檔案可能存在的目錄
- 第 4 行,LD_LIBRARY_PATH 環境變量儲存着庫檔案所在的目錄
- 第 5 行,使用 export 來導出上面這些環境變量,相當于聲明“全局變量”
- 第 7 行,使用 mount 指令來挂載所有的檔案系統,這些檔案系統由檔案 /etc/fstab來指定,是以後續還要建立 /etc/fstab檔案
- 第 8 和 9 行,建立目錄/dev/pts,然後将 devpts挂載到 /dev/pts目錄中
- 第 11 和 12 行,使用 mdev 來管理熱插拔裝置,通過這兩行,核心就可以在 /dev 目錄下自動建立裝置節點
建立好rcS檔案後,賦予其可執行權限:
chmod 777
1.2 建立 /etc/fstab 檔案
fstab檔案是在 Linux開機以後自動配置哪些需要自動挂載的分區,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
- file system:要挂載的特殊的裝置,也可以是塊裝置,比如/dev/sda 等
- mount point:挂載點必須為已經存在的目錄
- type:檔案系統類型,比如 ext2、ext3、proc、romfs、tmpfs 等
options:挂載選項,用于設定挂載參數,一般使用 defaults預設選項
– defaults:rw, suid, dev, exec, auto, nouser, and async
– auto:系統自動挂載,fstab預設就是這個選項
– noauto :開機不自動挂載
– nouser:隻有超級使用者可以挂載
– ro:按隻讀權限挂載
– rw:按可讀可寫權限挂載
– user:任何使用者都可以挂載
- dump:為 1 表示允許備份,為 0 不備份,一般設定為 0
- pass:磁盤檢查設定,為 0 表示不檢查。根目錄‘/’設定為 1,其他的都不能設定為 1,其他的分區從 2 開始。一般不在 fstab 中挂載根目錄,是以這裡一般設定為 0
在 rootfs根檔案系統中建立 /etc/fstab檔案:
cd etc/
touch
fstab檔案内容如下:
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
1.3 建立/etc/inittab檔案
inittab 的詳細内容可以參考 busybox 下的檔案 examples/inittab。init 程式會讀取/etc/inittab這個檔案,inittab 由若幹條指令組成。每條指令的結構都是一樣的,由以“ : ”分隔的 4 個段組成,格式如下:
<id>:<runlevels>:<action>:<process>
- id:每個指令的辨別符,不能重複。對于 busybox的 init而言是用來指定啟動程序的控制 tty,一般将序列槽或者 LCD螢幕設定為控制 tty
- runlevels:對 busybox 來說此項完全沒用,是以空着
- action:動作關鍵字,用于指定 process 可能用到的動作
- process:具體的動作,比如程式、腳本或指令等
參考 busybox的 examples/inittab檔案,在 rootfs根檔案系統中建立 /etc/inittab檔案:
cd etc
touch
inittab檔案内容如下:
1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7
- 第 2 行,系統啟動以後運作/etc/init.d/rcS 這個腳本檔案
- 第 3 行,将 console 作為控制台終端,也就是 ttymxc0
- 第 4 行,重新開機的話運作/sbin/init
- 第 5 行,按下 ctrl+alt+del 組合鍵就運作/sbin/reboot,用于重新開機系統
- 第 6 行,關機的時候執行/bin/umount,也就是解除安裝各個檔案系統
- 第 7 行,關機的時候執行/sbin/swapoff,也就是關閉交換分區
/etc/inittab 檔案建立好以後重新開機開發闆即可,至此!根檔案系統要建立的檔案就已經全部完成了。接下來就要對根檔案系統進行其他的測試,比如我們自己編寫的軟體運作是否正常、是否支援軟體開機自啟動、中文支援是否正常以及能不能連結等
2. 根檔案系統其他功能測試
根檔案系統已經完善了,接下來繼續測試根檔案系統是否好用
2.1 軟體運作測試
編寫一個簡單的c語言程式運作一下,驗證庫檔案是否能用
⏩ 在ubuntu的 rootfs中建立一個hello.c
#include <stdio.h>
int main(void){
while(1){
printf("hello world!\r\n"); //列印
sleep(2); //休眠2秒
}
}
⏩ 使用交叉編譯鍊來編譯程式
arm-linux-gnueabihf-gcc hello.c -o hello
⏩ 編譯後會生成名為hello的可執行檔案,可以使用
file
指令檢視檔案類型以及編碼格式,見下圖
可見 hello是個32位的 LSB可執行檔案,ARM架構的,并且是動态連結的
⏩ 重新開機開發闆,在開發闆上運作hello檔案,程式每隔2秒列印一次,運作正常,說明根檔案系統中的動态庫沒有問題,“ctrl+c”可中止程式
程式運作起來後,會占用互動視窗,可在運作時加上“&”,即
./hello&
,讓其進入背景運作
程式在背景運作時,互動序列槽仍是有列印的,隻是這時可以敲Enter鍵來輸入指令了,與程式的輸出互不影響,唯一的影響是程式的輸出會打斷我們的輸入,但可以不理會打斷,繼續輸入仍可執行指令的
背景運作的程式,可通過
ps
指令檢視程序id,然後使用
kill -9 pid
(程序ID)指令來關閉背景運作的程式。如下圖,輸入ps指令,可見 hello程式的程序ID為92,輸入kill -9 92(不用理會被打斷)後回車,就可看到hello程序被關閉了
2.2 中文字元測試
在Ubuntu中的 rootfs目錄下建立一個“中文測試”檔案夾,并建立一個“測試文檔.txt”,裡面輸入任意中文,下載下傳到開發闆後,在開發闆指令行模式中,使用
cat
指令檢視中文是否顯示正确
2.3 開機自啟動測試
一般做好産品以後都是需要開機自動啟動相應的軟體,實作開機自啟動的原理也很簡單,linux在啟動時,有一個預設的開機啟動腳本(/etc/init.d/rcS這個shell檔案),修改這個腳本,添加自啟動相關内容即可
########## /etc/init.d/rcS 檔案代碼 ##########
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
#開機自啟動,先進入hello所在檔案夾再執行
cd /drivers
./hello &
cd
自啟動代碼添加完成以後,重新開機開發闆,可以看到hello這個軟體已經開機時自動運作了:
2.4 外網連接配接測試
這裡的外網是相對于區域網路這個内外而言的,即測試闆子是否能通路百度、QQ這樣的網站,先使用ping指令來測試一下:
在網絡連接配接正常的情況下,無法ping通這些網址,是因為缺少域名解析服務,需要配置域名解析伺服器的IP位址。一般域名可以設定為所處網絡的網關位址,比如我的區域網路的網關是192.168.10.1,也可以設定為營運商的域名解析伺服器位址:114.114.114.114
在rootfs中建立檔案/etc/resolv.conf,然後在裡面輸入如下内容:
nameserver 114.114.114.114
nameserver 192.168.10.1
修改儲存退出,再次ping一下百度網站,可以看出 ping成功了!