前言:
文件系統(tǒng)的制作其實并沒有想像中那么難。一個基本的文件系統(tǒng)應該包括:busybox (提供 shell命令集)、配置文件(用來初始化和布局你的文件系統(tǒng))、設備文件(如果是用 devfs的話這個就免了)、必要的庫文件系統(tǒng)(如果 busybox是靜態(tài)編譯的話,那根本不用為 busybox用到的庫文件而煩。在我制作的文件系統(tǒng)里,只是為了用戶程序和 qt的運行才放置了一些庫文件)。
正文:
一、首先說一下 busybox 的配置和編譯問題
其實搞好busybox 后,可以說你的文件系統(tǒng)已經(jīng)完成了一半了。 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全線移植文檔》的文件系統(tǒng)部分,我剛開始的時候就是按照這個來做出一個很簡單的文件系統(tǒng)的。
不過有一點要特別注意的(shell 的配置問題 ) :
1、要這樣配置:
| | Shells--->
| | Choose your default shell (ash)--->
2、如果是這樣配置的話,雖然可以生成ash,但不能生成sh:
│ │Choose your default shell (none) ---> │ │
│ │ [*] ash
另外,按照他的這種方法做出來的文件系統(tǒng),運行的時候shell 并不好有,沒有歷史記錄、自動補全、刪除字符的功能,下面介紹如何為它添加這些功能:
Shells --->
--- BourneShell Options │ │
[ ] Hide message on interactive shellstartup │ │
[ ] Standaloneshell │ │
[*] command lineediting │ │
[*] vi-style line editingcommands ││
(15) historysize │ │
[*] historysaving │ │
[*] tabcompletion │ │
[*] usernamecompletion │ │
[ ] Fancy shell prompts
這是我自己試驗出來的,網(wǎng)上沒有看到過這方面的介紹,在此奉獻給大家。
二、再來說一下配置文件的問題
在文件系統(tǒng)中,配置文件主要存放在/etc 目錄里面。《基于 S3C2410 的 Linux全線移植文檔》里面介紹的文件系統(tǒng)由于需要加載文件系統(tǒng)的時候把 /mnt/etc目錄拷貝到 /etc ,所以不得不使用 /linuxrc腳本,不過如果是這樣的話需要在內(nèi)核傳遞參數(shù)里設置 init=/linuxrc,因為默認是啟動 /sbin/init 初始化腳本的(busybox 編譯安裝以后生成的 linuxrc文件是指向 /bin/busybox的符號文件,應該把它刪掉,自己重寫腳本)。在我做的文件系統(tǒng)里不采用這種方法,所以不用設置init=/linuxrc 。
Busyboxinit 的流程在《構建嵌入式 linux系統(tǒng)》這本書里面有介紹,我在這簡單的說一下:如果不采用 linuxrc的話就會執(zhí)行 /sbin/init 腳本( busyboxinit ),它會去分析 /etc/inittab腳本(如果沒有的話就使用它默認的來代替,一般沒必要自己為它編寫這個腳本,用它默認的就行),然后會執(zhí)行/etc/init.d/rcS 命令(在我制作的文件系統(tǒng)里就把配置都寫入了這個文件)。
至于 rcS這個目錄的編寫主要是安排哪些目錄掛載哪些次級文件系統(tǒng),比如 /proc 要掛載proc 文件系統(tǒng)、 /sys 要掛載sysfs 、 /dev/shm 要掛載tmpfs 、 /tmp 要掛載ramfs 等等。此外,還可以讓內(nèi)核重新掛載根文件系統(tǒng)也行,具體可以參考 rcS這個腳本里面的內(nèi)容,我的是參考友善的那個來寫的。另外,可以在這個腳本里執(zhí)行一些命令,比如設置 ip地址、建立符號鏈接(我為 usb 設備的掛載特意建立了/dev/sda1 的符號鏈接)、設置主機名等等。 Busybox init還會調(diào)用 /etc/profile 來設置 PATH,具體請看文件。
在《構建嵌入式linux 系統(tǒng)》提到了怎樣建立和建立哪些設備文件,但因為 devfs這個東西的存在,我們可以不再為這些設備文件而費心了。因為內(nèi)核在申請設備的同時會向 devfs申請相應的設備文件,然后 devfs 會幫我們在/dev目錄建立相應的設備文件,做到內(nèi)核使用多少設備就建立多少設備文件,不像以前那樣要預先建立一大堆可以你不會用到的設備文件(不過從2.6.12 內(nèi)核開始,這個devfs 選項從內(nèi)核配置中刪除,好像是用 udevfs之類來代替了,不過很多人還是喜歡用回 devfs,而且按現(xiàn)在看來起碼它用得還挺不錯的)。
好像沒什么好講了,至于/lib 目錄應該放哪些庫文件,我也沒有底。如果不運行應用程序,只是運行busybox 的話根本不用放任何的庫,因為我們的 busybox是靜態(tài)鏈接的還記得吧?我在自己的文件系統(tǒng)中存放了 helloworld應用程序和模塊,另外還有一個 led 模塊,是用ioctl 來控制 led燈的亮和滅的,所以我才加載了一些庫,而且是從原來友善的文件系統(tǒng)里面拷過來的。以后如果要運行 qt的話,還要把 qt 用到的庫文件也放進去,這樣文件系統(tǒng)就變得挺大的了。
總結:
好了,一個簡單的文件系統(tǒng)就是如此簡單的就可以做出來。不過要做出一個合理的文件系統(tǒng)的話相信還有很多東西要注意,比如根文件系統(tǒng)各目錄應該使用什么次級文件系統(tǒng)、配置文件的設計、選用哪些庫文件、如何增加用戶管理和網(wǎng)絡功能(boa)等等。網(wǎng)上關于文件系統(tǒng)制作的介紹很少,不過有個不錯的方法就是參考人家文件系統(tǒng)的做法來做,我就是參考友善文件系統(tǒng)的做法來做的。在這里提供一個下載文件系統(tǒng)的好地方,里面有很多的文件系統(tǒng)可以給你參考:
http://husaberg.toby-churchill.com/balloon/releases/v0.7/roots/。
原文地址http://hi.baidu.com/boshenshen/blog/item/29af38b13f09c050092302f4.html