上一篇推文講了怎么移植根文件系統(tǒng),并在i.MX6ULL開發(fā)板中運(yùn)行起來,但是會(huì)出現(xiàn)一些提示,現(xiàn)在來進(jìn)行根文件的完善;
|?完善根文件系統(tǒng)
創(chuàng)建/etc/init.d/rcS 文件 在 rootfs 中創(chuàng)建/etc/init.d/rcS 文件(前兩級(jí)的目錄都不存在,需要先創(chuàng)建目錄再創(chuàng)建文件),rcS 是個(gè) shell 腳本,Linux 內(nèi)核啟動(dòng)以后需要啟動(dòng)一些服務(wù),而 rcS 就是規(guī)定啟動(dòng)哪些文件的腳本文件。
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s腳本含義解析:
?
第 1 行,表示這是一個(gè) shell 腳本。
第 3 行,PATH 環(huán)境變量保存著可執(zhí)行文件可能存在的目錄,這樣我們?cè)趫?zhí)行一些命令或者可執(zhí)行文件的時(shí)候就不會(huì)提示找不到文件這樣的錯(cuò)誤。
第 4 行,LD_LIBRARY_PATH 環(huán)境變量保存著庫(kù)文件所在的目錄。
第 5 行,使用 export 來導(dǎo)出上面這些環(huán)境變量,相當(dāng)于聲明一些“全局變量”。
第 7 行,使用 mount 命令來掛載所有的文件系統(tǒng),這些文件系統(tǒng)由文件/etc/fstab 來指定,所以我們一會(huì)還要?jiǎng)?chuàng)建/etc/fstab 文件。
第 8 和 9 行,創(chuàng)建目錄/dev/pts,然后將 devpts 掛載到/dev/pts 目錄中。
第 11 和 12 行,使用 mdev 來管理熱插拔設(shè)備,通過這兩行,Linux 內(nèi)核就可以在/dev 目錄下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)。關(guān)于 mdev 的詳細(xì)內(nèi)容可以參考 busybox 中的 docs/mdev.txt 文檔。
給予可執(zhí)行權(quán)限
chmod 777 rcS? 創(chuàng)建/etc/fstab 文件 在 rootfs 中創(chuàng)建/etc/fstab 文件,fstab 在 Linux 開機(jī)以后自動(dòng)配置哪些需要自動(dòng)掛載的分區(qū),格式如下:
格式含義解析:
? 按照上述格式,在 fstab 文件中輸入如下內(nèi)容::要掛載的特殊的設(shè)備,也可以是塊設(shè)備,比如/dev/sda 等等。 :掛載點(diǎn)。 :文件系統(tǒng)類型,比如 ext2、ext3、proc、romfs、tmpfs 等等。 :掛載選項(xiàng),在 Ubuntu 中輸入“man mount”命令可以查看具體的選項(xiàng)。一般使用 defaults,也就是默認(rèn)選項(xiàng),defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。 :為 1 的話表示允許備份,為 0 不備份,一般不備份,因此設(shè)置為 0。 :磁盤檢查設(shè)置,為 0 表示不檢查。根目錄‘/’設(shè)置為 1,其他的都不能設(shè)置為 1,其他的分區(qū)從 2 開始。一般不在 fstab 中掛載根目錄,因此這里一般設(shè)置為 0。
#? 創(chuàng)建/etc/inittab 文件 inittab 的詳細(xì)內(nèi)容可以參考 busybox 下的文件 examples/inittab。init 程序會(huì)讀取/etc/inittab這個(gè)文件,inittab 由若干條指令組成。每條指令的結(jié)構(gòu)都是一樣的,由以“:”分隔的 4 個(gè)段組成,格式如下:proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0
格式含義解析:: : :
busybox 支持的動(dòng)作::每個(gè)指令的標(biāo)識(shí)符,不能重復(fù)。但是對(duì)于 busybox 的 init 來說, 有著特殊意義。對(duì)于 busybox 而言 用來指定啟動(dòng)進(jìn)程的控制 tty,一般我們將串口或者 LCD 屏幕設(shè)置為控制 tty。 :對(duì) busybox 來說此項(xiàng)完全沒用,所以空著。 :動(dòng)作,用于指定 可能用到的動(dòng)作。busybox 支持的動(dòng)作如下表; :具體的動(dòng)作,比如程序、腳本或命令等。
?
參考 busybox 的 examples/inittab 文件,創(chuàng)建一個(gè)/etc/inittab,在里面輸入如下內(nèi)容:
#etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a腳本含義解析:
?
第 2 行,系統(tǒng)啟動(dòng)以后運(yùn)行/etc/init.d/rcS 這個(gè)腳本文件。
第 3 行,將 console 作為控制臺(tái)終端,也就是 ttymxc0。
第 4 行,重啟的話運(yùn)行/sbin/init。
第 5 行,按下 ctrl+alt+del 組合鍵的話就運(yùn)行/sbin/reboot,看來 ctrl+alt+del 組合鍵用于重啟系統(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)建好以后就可以重啟開發(fā)板即可,至此!根文件系統(tǒng)要?jiǎng)?chuàng)建的文件就已經(jīng)全部完成了。 ? |?根文件系統(tǒng)其他功能測(cè)試 ? 軟件運(yùn)行測(cè)試 ? 使用 Linux 的目的就是運(yùn)行自己的軟件,編譯的應(yīng)用軟件一般都使用動(dòng)態(tài)庫(kù),使用動(dòng)態(tài)庫(kù)的話應(yīng)用軟件體積就很小,但是得提供庫(kù)文件,庫(kù)文件已經(jīng)添加到了根文件系統(tǒng)中,通過編寫一個(gè)測(cè)試軟件測(cè)試一下庫(kù)文件是否工作正常; 在根文件系統(tǒng)下創(chuàng)建一個(gè)名為“drivers”的文件夾,以后我們?Linux 驅(qū)動(dòng)的時(shí)候就把所有的實(shí)驗(yàn)文件放到這個(gè)文件夾里面。
? 在drivers中新建一個(gè)hello.c文件,在 hello.c 里面輸入如下內(nèi)容: ?
#include? 用交叉編譯器去編譯,命令如下: ?int main(void) { while(1) { printf("hello world! "); //打印 sleep(2); //休眠2秒 } }
arm-linux-gnueabihf-gcc hello.c -o hello?
?
使用“file”命令查看文件類型以及編碼格式: ?
file hello //查看 hello 的文件類型以及編碼格式?
?
hello 是個(gè) 32 位的 LSB 可執(zhí)行文件,ARM 架構(gòu)的,并且是動(dòng)態(tài)鏈接的,所以編譯出來的 hello 文件沒有問題,在串口軟件中輸入命令運(yùn)行編譯出來的可執(zhí)行文件hello:
./hello?
?
運(yùn)行正常,說明根文件系統(tǒng)中的動(dòng)態(tài)庫(kù)沒有問題,按下“ctrl+c”組合鍵即可中止該程序。 hello 執(zhí)行的時(shí)候終端是沒法用的,除非使用“ctrl+c”來關(guān)閉 hello,如果想要hello正常運(yùn)行并且不影響控制臺(tái)使用,那么就可以讓hello進(jìn)入后臺(tái)運(yùn)行,運(yùn)行軟件的時(shí)候加上“&”即可命令如下:
./hello &? 注意:hello進(jìn)入后臺(tái)運(yùn)行,控制臺(tái)也能使用,但是hello輸出會(huì)打斷輸入; 在后臺(tái)運(yùn)行的軟件可以使用,使用“ps”命令查看要關(guān)閉的軟件 PID,再通過“kill”命令關(guān)閉后臺(tái)軟件,操作如下:
// 查看所有當(dāng)前正在運(yùn)行的進(jìn)程 ps //?關(guān)閉進(jìn)程 kill?-9?104? ?
?
? 開機(jī)自啟動(dòng)測(cè)試 一般做好產(chǎn)品以后都是需要開機(jī)自動(dòng)啟動(dòng)相應(yīng)的軟件,并不會(huì)每次啟動(dòng)后再手動(dòng)輸入相關(guān)命令;進(jìn)入根文件系統(tǒng)的時(shí)候會(huì)運(yùn)行/etc/init.d/rcS 這個(gè) shell 腳本,因此可以在這個(gè)腳本里面添加自啟動(dòng)相關(guān)內(nèi)容:
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #開機(jī)自啟動(dòng) cd /drivers ./hello & cd /?
?
? ? 外網(wǎng)連接測(cè)試 ? 這里的外網(wǎng)是相對(duì)于局域網(wǎng)而言的,主要測(cè)試開發(fā)板能不能ping通百度來判斷開發(fā)板能否正常聯(lián)網(wǎng),命令如下:
ping www.baidu.com?
?
? 訪問外網(wǎng)是需要域名解析的,需要配置域名解析服務(wù)器的 IP 地址,一般域名解析地址可以設(shè)置為所處網(wǎng)絡(luò)的網(wǎng)關(guān)地址,比如 192.168.2.1。也可以設(shè)置為 114.114.114.114,這個(gè)是運(yùn)營(yíng)商的域名解析服務(wù)器地址。 在 rootfs 中新建文件/etc/resolv.conf,然后在里面輸入如下內(nèi)容: ?
nameserver 114.114.114.11 nameserver 192.168.1.1? nameserver 表示這是個(gè)域名服務(wù)器,設(shè)置了兩個(gè)域名服務(wù)器地址;
?
? 至此!我們的根文件系統(tǒng)就徹底的制作完成,這個(gè)根文件系統(tǒng)最好打包保存一下,防止以后做實(shí)驗(yàn)不小心破壞了根文件系統(tǒng)而功虧一簣,又得從頭制作根文件系統(tǒng)。uboot、Linux kernel、rootfs 這三個(gè)共同構(gòu)成了一個(gè)完整的Linux 系統(tǒng),現(xiàn)在的系統(tǒng)至少是一個(gè)可以正常運(yùn)行的系統(tǒng),后面我們就可以在這個(gè)系統(tǒng)上完成Linux 驅(qū)動(dòng)開發(fā)的學(xué)習(xí)。
審核編輯:湯梓紅
評(píng)論