前言 :
文件系統的製作其實並沒有想像中那麼難。一個基本的文件系統應該包括: 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/ 。
好了,總結如此,希望對你有幫助。