1. 完善根文件系統(tǒng)
在用 BusyBox 構(gòu)建根文件系統(tǒng)一文中介紹了根文件系統(tǒng)的制作,rootfs制作完成后測(cè)試時(shí),提示無(wú)法運(yùn)行“/etc/init.d/rcS”這個(gè)文件,說(shuō)明rootfs仍然不夠完善,下面將介紹如何完善根文件系統(tǒng)。
1.1 創(chuàng)建 /etc/init.d/rcS 文件
rcS 是個(gè) shell腳本,Linux內(nèi)核啟動(dòng)后需要啟動(dòng)一些服務(wù),rcS就是規(guī)定啟動(dòng)哪些文件的腳本文件。 在 rootfs中創(chuàng)建 /etc/init.d/rcS文件,命令如下:
mkdir -p etc/init.d/
cd etc/init.d/
touch rcS
然后在rcS文件中輸入如下內(nèi)容:
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 行,表示這是一個(gè) shell 腳本
- 第 3 行,PATH 環(huán)境變量保存著可執(zhí)行文件可能存在的目錄
- 第 4 行,LD_LIBRARY_PATH 環(huán)境變量保存著庫(kù)文件所在的目錄
- 第 5 行,使用 export 來(lái)導(dǎo)出上面這些環(huán)境變量,相當(dāng)于聲明“全局變量”
- 第 7 行,使用 mount 命令來(lái)掛載所有的文件系統(tǒng),這些文件系統(tǒng)由文件 /etc/fstab來(lái)指定,所以后續(xù)還要?jiǎng)?chuàng)建 /etc/fstab文件
- 第 8 和 9 行,創(chuàng)建目錄/dev/pts,然后將 devpts掛載到 /dev/pts目錄中
- 第 11 和 12 行,使用 mdev 來(lái)管理熱插拔設(shè)備,通過(guò)這兩行,內(nèi)核就可以在 /dev 目錄下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)
創(chuàng)建好rcS文件后,賦予其可執(zhí)行權(quán)限:
chmod 777 rcS
1.2 創(chuàng)建 /etc/fstab 文件
fstab文件是在 Linux開(kāi)機(jī)以后自動(dòng)配置哪些需要自動(dòng)掛載的分區(qū),格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
- file system:要掛載的特殊的設(shè)備,也可以是塊設(shè)備,比如/dev/sda 等
- mount point:掛載點(diǎn)必須為已經(jīng)存在的目錄
- type:文件系統(tǒng)類(lèi)型,比如 ext2、ext3、proc、romfs、tmpfs 等
- options:掛載選項(xiàng),用于設(shè)置掛載參數(shù),一般使用 defaults默認(rèn)選項(xiàng)
– defaults:rw, suid, dev, exec, auto, nouser, and async
– auto:系統(tǒng)自動(dòng)掛載,fstab默認(rèn)就是這個(gè)選項(xiàng)
– noauto :開(kāi)機(jī)不自動(dòng)掛載
– nouser:只有超級(jí)用戶(hù)可以?huà)燧d
– ro:按只讀權(quán)限掛載
– rw:按可讀可寫(xiě)權(quán)限掛載
– user:任何用戶(hù)都可以?huà)燧d - dump:為 1 表示允許備份,為 0 不備份,一般設(shè)置為 0
- pass:磁盤(pán)檢查設(shè)置,為 0 表示不檢查。 根目錄‘/’設(shè)置為 1,其他的都不能設(shè)置為 1,其他的分區(qū)從 2 開(kāi)始。 一般不在 fstab 中掛載根目錄,因此這里一般設(shè)置為 0
在 rootfs根文件系統(tǒng)中創(chuàng)建 /etc/fstab文件:
cd etc/
touch fstab
fstab文件內(nèi)容如下:
#
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
1.3 創(chuàng)建/etc/inittab文件
inittab 的詳細(xì)內(nèi)容可以參考 busybox 下的文件 examples/inittab。 init 程序會(huì)讀取/etc/inittab這個(gè)文件,inittab 由若干條指令組成。 每條指令的結(jié)構(gòu)都是一樣的,由以“ : ”分隔的 4 個(gè)段組成,格式如下:
:::
- id:每個(gè)指令的標(biāo)識(shí)符,不能重復(fù)。 對(duì)于 busybox的 init而言是用來(lái)指定啟動(dòng)進(jìn)程的控制 tty,一般將串口或者 LCD屏幕設(shè)置為控制 tty
- runlevels:對(duì) busybox 來(lái)說(shuō)此項(xiàng)完全沒(méi)用,所以空著
- action:動(dòng)作關(guān)鍵字,用于指定 process 可能用到的動(dòng)作
- process:具體的動(dòng)作,比如程序、腳本或命令等
參考 busybox的 examples/inittab文件,在 rootfs根文件系統(tǒng)中創(chuàng)建 /etc/inittab文件:
cd etc
touch inittab
inittab文件內(nèi)容如下:
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 行,系統(tǒng)啟動(dòng)以后運(yùn)行/etc/init.d/rcS 這個(gè)腳本文件
- 第 3 行,將 console 作為控制臺(tái)終端,也就是 ttymxc0
- 第 4 行,重啟的話(huà)運(yùn)行/sbin/init
- 第 5 行,按下 ctrl+alt+del 組合鍵就運(yùn)行/sbin/reboot,用于重啟系統(tǒng)
- 第 6 行,關(guān)機(jī)的時(shí)候執(zhí)行/bin/umount,也就是卸載各個(gè)文件系統(tǒng)
- 第 7 行,關(guān)機(jī)的時(shí)候執(zhí)行/sbin/swapoff,也就是關(guān)閉交換分區(qū)
/etc/inittab 文件創(chuàng)建好以后重啟開(kāi)發(fā)板即可,至此! 根文件系統(tǒng)要?jiǎng)?chuàng)建的文件就已經(jīng)全部完成了。 接下來(lái)就要對(duì)根文件系統(tǒng)進(jìn)行其他的測(cè)試,比如我們自己編寫(xiě)的軟件運(yùn)行是否正常、是否支持軟件開(kāi)機(jī)自啟動(dòng)、中文支持是否正常以及能不能鏈接等
2. 根文件系統(tǒng)其他功能測(cè)試
根文件系統(tǒng)已經(jīng)完善了,接下來(lái)繼續(xù)測(cè)試根文件系統(tǒng)是否好用
2.1 軟件運(yùn)行測(cè)試
編寫(xiě)一個(gè)簡(jiǎn)單的c語(yǔ)言程序運(yùn)行一下,驗(yàn)證庫(kù)文件是否能用
在ubuntu的 rootfs中創(chuàng)建一個(gè)hello.c
#include
int main(void){
while(1){
printf("hello world!\\r\\n"); //打印
sleep(2); //休眠2秒
}
}
使用交叉編譯鏈來(lái)編譯程序
arm-linux-gnueabihf-gcc hello.c -o hello
編譯后會(huì)生成名為hello的可執(zhí)行文件,可以使用“file”命令查看文件類(lèi)型以及編碼格式,見(jiàn)下圖
可見(jiàn) hello是個(gè)32位的 LSB可執(zhí)行文件,ARM架構(gòu)的,并且是動(dòng)態(tài)鏈接的
重啟開(kāi)發(fā)板,在開(kāi)發(fā)板上運(yùn)行hello文件,程序每隔2秒打印一次,運(yùn)行正常,說(shuō)明根文件系統(tǒng)中的動(dòng)態(tài)庫(kù)沒(méi)有問(wèn)題,“ctrl+c”可中止程序
程序運(yùn)行起來(lái)后,會(huì)占用交互窗口,可在運(yùn)行時(shí)加上“&”,即:./hello&,讓其進(jìn)入后臺(tái)運(yùn)行
程序在后臺(tái)運(yùn)行時(shí),交互串口仍是有打印的,只是這時(shí)可以敲回車(chē)鍵來(lái)輸入命令了,與程序的輸出互不影響,唯一的影響是程序的輸出會(huì)打斷我們的輸入,但可以不理會(huì)打斷,繼續(xù)輸入仍可執(zhí)行命令的
后臺(tái)運(yùn)行的程序,可通過(guò) ps命令查看進(jìn)程id,然后使用 kill -9 pid(進(jìn)程ID)命令來(lái)關(guān)閉后臺(tái)運(yùn)行的程序。 如下圖,輸入ps命令,可見(jiàn) hello程序的進(jìn)程ID為92,輸入kill -9 92(不用理會(huì)被打斷)后回車(chē),就可看到hello進(jìn)程被關(guān)閉了
2.2 中文字符測(cè)試
在Ubuntu中的 rootfs目錄下新建一個(gè)“中文測(cè)試”文件夾,并新建一個(gè)“測(cè)試文檔.txt”,里面輸入任意中文,下載到開(kāi)發(fā)板后,在開(kāi)發(fā)板命令行模式中,使用cat命令查看中文是否顯示正確
2.3 開(kāi)機(jī)自啟動(dòng)測(cè)試
一般做好產(chǎn)品以后都是需要開(kāi)機(jī)自動(dòng)啟動(dòng)相應(yīng)的軟件,實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng)的原理也很簡(jiǎn)單,linux在啟動(dòng)時(shí),有一個(gè)默認(rèn)的開(kāi)機(jī)啟動(dòng)腳本(/etc/init.d/rcS這個(gè)shell文件),修改這個(gè)腳本,添加自啟動(dòng)相關(guān)內(nèi)容即可
########## /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
#開(kāi)機(jī)自啟動(dòng),先進(jìn)入hello所在文件夾再執(zhí)行
cd /drivers
./hello &
cd /
自啟動(dòng)代碼添加完成以后,重啟開(kāi)發(fā)板,可以看到hello這個(gè)軟件已經(jīng)開(kāi)機(jī)時(shí)自動(dòng)運(yùn)行了:
2.4 外網(wǎng)連接測(cè)試
這里的外網(wǎng)是相對(duì)于局域網(wǎng)這個(gè)內(nèi)外而言的,即測(cè)試板子是否能訪(fǎng)問(wèn)百度、QQ這樣的網(wǎng)站,先使用ping指令來(lái)測(cè)試一下:
在網(wǎng)絡(luò)連接正常的情況下,無(wú)法ping通這些網(wǎng)址,是因?yàn)槿鄙儆蛎馕龇?wù),需要配置域名解析服務(wù)器的IP地址。 一般域名可以設(shè)置為所處網(wǎng)絡(luò)的網(wǎng)關(guān)地址,比如我的局域網(wǎng)的網(wǎng)關(guān)是192.168.10.1,也可以設(shè)置為運(yùn)營(yíng)商的域名解析服務(wù)器地址:114.114.114.114
在rootfs中新建文件/etc/resolv.conf,然后在里面輸入如下內(nèi)容:
nameserver 114.114.114.114
nameserver 192.168.10.1
修改保存退出,再次ping一下百度網(wǎng)站,可以看出 ping成功了!
至此! 根文件系統(tǒng)就徹底的制作完成。 uboot、kernel、rootfs這三個(gè)共同構(gòu)成了一個(gè)完整的 Linux系統(tǒng),這個(gè)系統(tǒng)是一個(gè)可以正常運(yùn)行的系統(tǒng),可以在這個(gè)系統(tǒng)上進(jìn)行 Linux驅(qū)動(dòng)開(kāi)發(fā)。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40290 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209521 -
busybox
+關(guān)注
關(guān)注
0文章
21瀏覽量
11294 -
根文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
25瀏覽量
11981 -
rootfs
+關(guān)注
關(guān)注
0文章
19瀏覽量
4666
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論