天天看點

rootfs 根檔案系統完善

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​

​指令檢視檔案類型以及編碼格式,見下圖

rootfs 根檔案系統完善
可見 hello是個32位的 LSB可執行檔案,ARM架構的,并且是動态連結的

⏩ 重新開機開發闆,在開發闆上運作hello檔案,程式每隔2秒列印一次,運作正常,說明根檔案系統中的動态庫沒有問題,“ctrl+c”可中止程式

rootfs 根檔案系統完善

程式運作起來後,會占用互動視窗,可在運作時加上“&”,即​

​./hello&​

​,讓其進入背景運作

rootfs 根檔案系統完善

程式在背景運作時,互動序列槽仍是有列印的,隻是這時可以敲Enter鍵來輸入指令了,與程式的輸出互不影響,唯一的影響是程式的輸出會打斷我們的輸入,但可以不理會打斷,繼續輸入仍可執行指令的

背景運作的程式,可通過​

​ps​

​​指令檢視程序id,然後使用 ​

​kill -9 pid​

​(程序ID)指令來關閉背景運作的程式。如下圖,輸入ps指令,可見 hello程式的程序ID為92,輸入kill -9 92(不用理會被打斷)後回車,就可看到hello程序被關閉了

rootfs 根檔案系統完善

2.2 中文字元測試

在Ubuntu中的 rootfs目錄下建立一個“中文測試”檔案夾,并建立一個“測試文檔.txt”,裡面輸入任意中文,下載下傳到開發闆後,在開發闆指令行模式中,使用​

​cat​

​指令檢視中文是否顯示正确

rootfs 根檔案系統完善

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這個軟體已經開機時自動運作了:

rootfs 根檔案系統完善

2.4 外網連接配接測試

這裡的外網是相對于區域網路這個内外而言的,即測試闆子是否能通路百度、QQ這樣的網站,先使用ping指令來測試一下:

rootfs 根檔案系統完善

在網絡連接配接正常的情況下,無法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成功了!

rootfs 根檔案系統完善

繼續閱讀