1. 程式人生 > >一步一步製作yaffs/yaffs2根檔案系統(四)---構建etc、dev等剩餘目錄

一步一步製作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下就是一個非常小的根檔案系統。我將這個根檔案系統打包傳上去了,如有需要,請自行下載