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