一步一步製作yaffs/yaffs2根檔案系統(四)---構建etc、dev等剩餘目錄
開發環境:Ubuntu 12.04
開發板:mini2440 256M NandFlash 64M SDRAM
交叉編譯器:arm-linux-gcc 4.4.3 點此可下載
BusyBox版本:busybox-1.13.3 點此可下載
yaffs製作工具:mkyaffsimage
yaffs2製作工具:mkyaffs2image(適合64M)、mkyaffs2image-128(適合128M以上)
前面兩節介紹瞭如何安裝Busybox、C庫,建立了 bin/、sbin/、usr/sbin、usr/bin、lib/等目錄,最小根檔案系統的大部分目錄、檔案已經建好,本節介紹剩下的部分。
構建 /etc目錄
19、執行命令:mkdir etc 建立一個etc目錄
執行命令:cd etc 進入該目錄
20、執行命令:vim mdev.conf 建立mdev.conf。前邊已經介紹mdev是一個udev的簡化版本,主要用來支援一些熱插拔裝置。我們可以通過檔案mdev.conf自定義一些裝置節點的名稱或連結來滿足特定的需要,但在此處讓它為空。
21、在啟動過程中bootloader會傳遞引數init=/linuxrc給核心的main( )函式,所以在檔案系統被掛載後,執行的第一個程式是linuxrc,而linuxrc是一個指向/bin/busybox的連結檔案,也就是說檔案系統被掛在後執行的第一個程式是busybox。Busybox首先會解析檔案/etc/inittab,這個檔案中存放的是系統的配置資訊,這些配置資訊指明瞭接下來將要啟動那些程式。
執行命令:vim inittab 建立 inittab檔案
內容如下:
#/etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
/etc/inittab 檔案中每個條目用來定義一個子程序,並確定它的啟動方法,格式如下
<id>:<runlevels>:<action>:<process>
<id>:表示這個程序要使用的控制檯(即標準輸入、標準輸出、標準錯誤裝置)。如果省 略,則使用與init程序一樣的控制檯。
<runlevels>:對於Busybox init程式,這個欄位滑意義,可以省略。
<action>:表示init程式如何控制這個子程序,
<process>: 要執行的程式,它可以是可執行程式,也可以是指令碼
檔案etc/inittab配置條目說明如下:
::sysinit:/etc/init.d/rcS 啟動系統初始化檔案/etc/init.d/rcS。欄位sysinit表明檔案/etc/init.d/rcS在系統啟動後最先執行,並且只執行一次,init程序等待它結束才繼續執行其它動作。(指令碼檔名一般為rc,字尾S代表單使用者執行級別指令碼)
s3c2410_serial0::askfirst:-/bin/sh 在串列埠s3c2410_serial0上啟動askfirst動作的shell。S3C2410的串列埠名在/dev下是s3c2410_serialx。在mini2440移植核心時定義的串列埠名為s3c2410_serial0。需要注意的是,開發板上通過mdev生成的/dev目錄中,S3C2410、S3C2440的串列埠名是s3c2410_serial0、s3c2410_serial1、s3c2410_serial2,不是 ttySAC0、ttySAC1、ttySAC2。當靜態建立裝置檔案時,這裡要將s3c2410_serial0 修改為 ttySAC0 。askfirst表明init程序先輸出“Please press Enter to actvie this console”,等使用者輸入回車鍵之後才啟動-/bin/sh。
::ctrlaltdel:/sbin/reboot 當按下Ctrl+Alt+Delete組合鍵時,init重啟執行程式。欄位ctrlaltdel表明當按下Ctrl+Alt+Delete組合鍵時,執行相應的程序。
::shutdown:/bin/umount -a -r 告訴init在關機時執行umount命令解除安裝所有的檔案系統,如果解除安裝失敗,試圖以只讀方式重新掛載。欄位shutdown表明在重啟關閉系統命令時執行相應程序。
22、當解析完檔案etc/inittab後就將啟動這些程序,首先要執行的是啟動指令碼etc/init.d/rcS。
執行命令:mkdir init.d 建立一個init.d資料夾
執行命令:cd init.d 進入該資料夾
23、執行命令:vim rcS 編寫rcS可執行檔案,這是一個指令碼檔案,可以在裡面新增想自動執行的命令。
內容如下
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
詳解:
#!/bin/sh #用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #shell命令的搜尋路徑
runlevel=S #執行在單使用者模式
prevlevel=N #前一個級別,為N則表示沒有前一個級別
umask 022 #許可權位掩碼
export PATH runlevel prevlevel #將環境的變數匯出到環境中
mount -a #將檔案 /etc/fstab 中指明的檔案掛載到對應的掛載點上
echo /sbin/mdev>/proc/sys/kernel/hotplug #當有熱插拔事件產生時, 核心就會呼叫位於/sbin目錄的 mdev。 這時 mdev通過環境變數中的 ACTION 和 DEVPATH,(這兩個變數是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys 中的那個目錄。接著會看看這個目錄中是否有“dev”的屬性檔案,如果有就利用這些資訊為 這個裝置在/dev 下建立裝置節點檔案。
mdev -s #建立dev目錄。以‘-s’為引數呼叫位於/sbin 目錄寫的 mdev(其實是個連結,作用是傳遞引數給/bin目錄下的busybox 程式並呼叫它) ,mdev掃描 /sys/class和/sys/block中所有的類裝置目錄,如果在目錄中含有名為“dev”的檔案,且檔案中包含的是裝置號,則 mdev 就利用這些資訊為這個裝置在/dev下建立裝置節點檔案。一般只在啟動時才執行一次 “mdev -s” 。
24、執行命令:chmod +x rcS 改變rcS的屬性,使它可執行。
25、執行命令:cd .. 返回上一級目錄
執行命令:vim fstab ,建立fstab檔案。
內容如下
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
編寫好之後,儲存退出。
26、執行命令:cd .. 返回根檔案系統目錄
27、執行命令: mkdir dev 建立dev目錄
28、執行命令:cd dev 進入該目錄,準備建立裝置節點
29、先後執行命令:sudo mknod console c 5 1
sudo mknod null c 1 3
因為mdev是通過init程序來啟動的,在使用mdev構造 /dev 目錄之前,init 程序至少要用到裝置檔案 /dev/console、/dev/null,所以要建立這兩個裝置檔案。
30、執行命令:cd ../ 返回上一級目錄
31、執行命令:mkdir proc mnt tmp sys root home 建立剩餘的目錄
到這裡,在rootfs下就是一個非常小的根檔案系統。我將這個根檔案系統打包傳上去了,如有需要,請自行下載