Linux支持多種文件系統,同樣,嵌入式Linux也支持多種文件系統。雖然在嵌入式系統中,由于資源受限的原因,它的文件系統和PC上的Linux的文件系統有較大的區別,但是,它們的總體架構是一樣的,都是采用目錄樹的結構。在嵌入式系統中常見的文件系統有cramfs、romfs、jffs、yaffs等,這里就以制作cramfs文件系統為例進行講解。cramfs文件系統是一種經過壓縮的、極為簡單的只讀文件系統,因此非常適合嵌入式系統。要注意的是,不同的文件系統都有相應的制作工具,但是其主要的原理和制作方法是類似的。
在嵌入式Linux中,busybox是構造文件系統常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統中的“瑞士軍刀”,因為它將許多常用的Linux命令和工具結合到了一個單獨的可執行程序(busybox)中。雖然與相應的GNU工具比較,busybox所提供的功能和參數略少,但在比較小的系統(如啟動盤)或者嵌入式系統中已經足夠了。
busybox在設計上就充分考慮了硬件資源受限的特殊工作環境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個可執行文件中,在實際應用過程中通過不同的符號鏈接來確定到底要執行哪個操作。例如,終生成的可執行文件為busybox,當為它建立一個符號鏈接ls時,就可以通過執行這個新命令實現列出目錄的功能。采用單一執行文件的方式大限度地共享了程序代碼,甚至連文件頭、內存中的程序控制塊等其他系統資源都共享了,對于資源比較緊張的系統來說,真是合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,后的符號鏈接也可以由編譯系統自動生成。
下面用busybox構建FS2410開發板的cramfs文件系統。
(1)從busybox網站下載busybox源碼(本實例采用busybox-1.00)并解壓,接下來,根據實際需要進行busybox的配置。
$ tar jxvf busybox-1.00.tar.bz2
$ cd busybox-1.00
$ make defconfig /* 首先進行默認配置 */
$ make menuconfig
此時,需要設置與平臺相關的交叉編譯選項,操作步驟為:先選中“Build Options”項的“Do you want to build BusyBox with a Cross Complier?”選項,然后將“Cross Compiler prefix”設置為“/usr/local/arm/3.3.2/bin/arm-linux-”(這是在實驗主機中的交叉編譯器的安裝路徑),如圖1.7所示。
圖1.7 busybox配置畫面
(2)編譯并安裝busybox。
$ make
$ make install PREFIX=/home/david/fs2410/cramfs
其中,PREFIX用于指定安裝目錄,如果不設置該選項,則默認在當前目錄下創建_install目錄。創建的安裝目錄的內容如下:
$ ls
bin linuxrc sbin usr
(3)由此可知,使用busybox軟件包所創建的文件系統還缺少很多東西。
(4)通過創建系統所需的目錄和文件來完善文件系統的內容。
$ mkdir mnt root var tmp proc boot etc lib
$ mkdir /var/{lock,log,mail,run,spool}
(5)將所需的交叉編譯鏈接庫復制到lib目錄中,這些庫文件位于/usr/local/arm/3.3.2/lib下。在復制時應該注意采用打包后解包的方式,以保證符號鏈接的正確性和完整性。刪除所有目錄和靜態庫文件,并使用arm-linux-strip工具剝除庫文件中的調試段信息,從而減少庫的體積。
(6)創建一些重要文件。inittab是Linux啟動之后第一個被訪問的腳本文件。
# This is run first except when booting
::sysinit:/etc/init.d/rcS
# Start an “askfirst” shell on the console
#::askfirst:-/bin/bash
::askfirst:/bin/bash
# Stuff to do when restarting the init process
::restart:/sbin/init
#::once:/sbin/raja.sh
#::respawn:/sbin/iom
::once:/usr/etc/rc.local
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
建立init.d目錄,進入init.d目錄,建立rcS文件,文件內容如下:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
exec /usr/etc/rc.local
建立/etc/profile文件:
# /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
其中,profile用于設置shell的環境變量,shell啟動時會讀取/etc/profile文件來設置環境變量。以下是/etc/rc.local文件:
#!/bin/sh
#add user specified script
cd /dev
ln -s /dev/fb/0 fb0
ln -s vc/0 tty0
ln -s vc/1 tty1
ln -s vc/2 tty2
mknod –m 660 mtd0 c 90 0
mknod –m 660 mtd1 c 90 2
mknod –m 660 mtd2 c 90 4
mknod –m 660 mtdblock0 b 31 0
mknod –m 660 mtdblock1 b 31 1
mknod –m 660 mtdblock2 b 31 2
fstab文件定義了文件系統的各個“掛接點”,需要與實際的系統相配合。
none /proc proc defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
后要創建用戶和用戶組文件等其他文件,以上用busybox構造了文件系統的內容。
下面創建cramfs文件系統映像文件,制作cramfs映像文件需要用到的工具是mkcramfs。此時可以采用兩種方法,一種方法是使用我們所構建的文件系統(在目錄“/home/david/fs2410/cramfs”中),另一種方法是在已經做好的cramfs映像文件的基礎上進行適當的改動。下面的示例使用第二種方法,因為這個方法包含了第一種方法的所有步驟(假設已經做好的映像文件名為“fs2410.cramfs”)。
首先用mount命令將映像文件掛載到一個目錄下,打開該目錄并查看其內容。
$ mkdir cramfs
$ mount fs2410.cramgs cramfs –o loop
$ ls cramfs
bin dev etc home lib linuxrc proc Qtopia ramdisk sbin testshell tmp
usr var
因為cramfs文件系統是只讀的,所以不能在這個掛載目錄下直接進行修改,因此需要將文件系統中的內容復制到另一個目錄中,具體操作如下所示:
$ mkdir backup_cramfs
$ tar cvf backup.cramfs.tar cramfs/
$ mv backup.cramfs.tar backup_cramfs/
$ umount cramfs
$ cd backup_cramfs
$ tar xvf backup.cramfs.tar
$ rm backup.cramfs.tar
此時就像用busybox所構建的文件系統一樣,可以在backup_cramfs的cramfs子目錄中任意進行修改。例如,可以添加用戶自己的程序:
$ cp ~/hello backup_cramfs/cramfs/
在用戶的修改工作結束之后,用下面的命令可以創建cramfs映像文件:
$ mkcramfs backup_cramfs/cramfs/ new.cramfs
接下來,就可以將新創建的new.cramfs映像文件燒入到開發板的相應位置了。
評論