用BusyBox製作根文件系統

用BusyBox製作根文件系統


前言 :
  文件系統的製作其實並沒有想像中那麼難。一個基本的文件系統應該包括: busybox (提供 shell 命令集)、配置文件(用來初始化和佈局你的文件系統)、設備文件(如果是用 devfs 的話這個就免了)、必要的庫文件系統(如果 busybox 是靜態編譯的話,那根本不用爲 busybox 用到的庫文件而煩。在我製作的文件系統裏,只是爲了用戶程序和 qt 的運行才放置了一些庫文件)。

正文 :
一、 首先說一下 busybox 的配置和編譯問題
其 實搞好 busybox 後,可以說你的文件系統已經完成了一半了。 Busybox 之所以比較難編譯,主要是 busybox 和交叉編譯工具的版本搭配問題。在文壇上不乏因爲 busybox 某些命令不能編譯通過而煩的人,在這裏我推薦一個搭配: busybox-1.1.3+arm-linux-gcc-3.3.2 (在文壇上看到過有人說 busybox-1.0.1+arm-linux-gcc-3.4.1 也可以正常編譯通過,你自己看着辦吧)。
Busybox 的配置很簡單,詳細過程可以參考《基於 S3C2410 的 Linux 全線移植文檔》的文件系統部分,我剛開始的時候就是按照這個來做出一個很簡單的文件系統的。

不過有一點要特別注意的 (shell 的配置問題 ) :
1、要這樣配置:
          Shells  --->   
      Choose your default shell (ash)  --->     
2、如果是這樣配置的話,雖然可以生成ash,但不能生成sh:
        Choose your default shell (none)  --->                         
        * ash 
另外,按照他的這種方法做出來的文件系統,運行的時候 shell 並不好有,沒有歷史記錄、自動補全、刪除字符的功能,下面介紹如何爲它添加這些功能:
              Shells  --->
            ---  Bourne Shell Options                                         
              [ ]  Hide message on interactive shell startup     
              [ ]  Standalone shell                                             
              *  command line editing                                         
                *    vi-style line editing commands                             
              (15)    history size                                               
                *  history saving                                             
                  *  tab completion                                             
                  *  username completion                                     
              [ ]    Fancy shell prompts

這是我自己試驗出來的,網上沒有看到過這方面的介紹,在此奉獻給大家。

二、 再來說一下配置文件的問題

在 文件系統中,配置文件主要存放在 /etc 目錄裏面。《基於 S3C2410 的 Linux 全線移植文檔》裏面介紹的文件系統由於需要加載文件系統的時候把 /mnt/etc 目錄拷貝到 /etc ,所以不得不使用 /linuxrc 腳本,不過如果是這樣的話需要在內核傳遞參數裏設置 init=/linuxrc ,因爲默認是啓動 /sbin/init 初始化腳本的( busybox 編譯安裝以後生成的 linuxrc 文件是指向 /bin/busybox 的符號文件,應該把它刪掉,自己重寫腳本)。在我做的文件系統裏不採用這種方法,所以不用設置 init=/linuxrc 。

Busybox init 的流程在《構建嵌入式 linux 系統》這本書裏面有介紹,我在這簡單的說一下:如果不採用 linuxrc 的話就會執行 /sbin/init 腳本( busybox init ),它會去分析 /etc/inittab 腳本(如果沒有的話就使用它默認的來代替,一般沒必要自己爲它編寫這個腳本,用它默認的就行),然後會執行 /etc/init.d/rcS 命令(在我製作的文件系統裏就把配置都寫入了這個文件)。

至於 rcS 這個目錄的編寫主要是安排哪些目錄掛載哪些次級文件系統,比如 /proc 要掛載 proc 文件系統、 /sys 要掛載 sysfs 、 /dev/shm 要掛載 tmpfs 、 /tmp 要掛載 ramfs 等等。此外,還可以讓內核重新掛載根文件系統也行,具體可以參考 rcS 這個腳本里面的內容,我的是參考友善的那個來寫的。另外,可以在這個腳本里執行一些命令,比如設置 ip 地址、建立符號鏈接(我爲 usb 設備的掛載特意建立了 /dev/sda1 的符號鏈接)、設置主機名等等。 Busybox init 還會調用 /etc/profile 來設置 PATH ,具體請看文件。

在《構建嵌入式 linux 系統》提到了怎樣建立和建立哪些設備文件,但因爲 devfs 這個東西的存在,我們可以不再爲這些設備文件而費心了。因爲內核在申請設備的同時會向 devfs 申請相應的設備文件,然後 devfs 會幫我們在 /dev 目錄建立相應的設備文件,做到內核使用多少設備就建立多少設備文件,不像以前那樣要預先建立一大堆可以你不會用到的設備文件(不過從 2.6.12 內核開始,這個 devfs 選項從內核配置中刪除,好像是用 udevfs 之類來代替了,不過很多人還是喜歡用回 devfs ,而且按現在看來起碼它用得還挺不錯的)。

好像沒什麼好講了,至於 /lib 目錄應該放哪些庫文件,我也沒有底。如果不運行應用程序,只是運行 busybox 的話根本不用放任何的庫,因爲我們的 busybox 是靜態鏈接的還記得吧?我在自己的文件系統中存放了 helloworld 應用程序和模塊,另外還有一個 led 模塊,是用 ioctl 來控制 led 燈的亮和滅的,所以我才加載了一些庫,而且是從原來友善的文件系統裏面拷過來的。以後如果要運行 qt 的話,還要把 qt 用到的庫文件也放進去,這樣文件系統就變得挺大的了。

總結 :
好了,一個簡單的文件系統就是如此簡單的就可以做出來。不過 要做出一個合理的文件系統的話相信還有很多東西要注意,比如根文件系統各目錄應該使用什麼次級文件系統、配置文件的設計、選用哪些庫文件、如何增加用戶管 理和網絡功能 (boa) 等等。網上關於文件系統製作的介紹很少,不過有個不錯的方法就是參考人家文件系統的做法來做,我就是參考友善文件系統的做法來做的。在這裏提供一個下載文 件系統的好地方,裏面有很多的文件系統可以給你參考:
http://husaberg.toby-churchill.com/balloon/releases/v0.7/roots/
好了,總結如此,希望對你有幫助。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章