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
然后在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 mdev -s
- 第 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 rcS
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
fstab文件內容如下:
#
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:每個指令的標識符,不能重復。 對于 busybox的 init而言是用來指定啟動進程的控制 tty,一般將串口或者 LCD屏幕設置為控制 tty
- runlevels:對 busybox 來說此項完全沒用,所以空著
- action:動作關鍵字,用于指定 process 可能用到的動作
- process:具體的動作,比如程序、腳本或命令等
參考 busybox的 examples/inittab文件,在 rootfs根文件系統中創建 /etc/inittab文件:
cd etc
touch inittab
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 ::shutdown:/sbin/swapoff -a
- 第 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
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&,讓其進入后臺運行
程序在后臺運行時,交互串口仍是有打印的,只是這時可以敲回車鍵來輸入命令了,與程序的輸出互不影響,唯一的影響是程序的輸出會打斷我們的輸入,但可以不理會打斷,繼續輸入仍可執行命令的
后臺運行的程序,可通過 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成功了!
至此! 根文件系統就徹底的制作完成。 uboot、kernel、rootfs這三個共同構成了一個完整的 Linux系統,這個系統是一個可以正常運行的系統,可以在這個系統上進行 Linux驅動開發。
-
內核
+關注
關注
3文章
1372瀏覽量
40278 -
Linux
+關注
關注
87文章
11292瀏覽量
209328 -
busybox
+關注
關注
0文章
21瀏覽量
11294 -
根文件系統
+關注
關注
0文章
25瀏覽量
11979 -
rootfs
+關注
關注
0文章
19瀏覽量
4665
發布評論請先 登錄
相關推薦
評論