摘 要:在嵌入式Linux系統中,根文件系統是構建嵌入式Linux系統的重要組成部分,是Linux/Unix系統不可或缺的組件。這里從Linux根文件系統底層出發,詳細分析根文件系統的組成和如何利用Busybox配置完整的根文件系統,并給出了啟動腳本和配置文件以實現簡單的根文件系統,并且以Cramfs和Jffs 2為例詳述了根文件系統的制作過程,為其他文件系統的制作提供參考。
關鍵詞:嵌入式Linux;Jffs 2;Cramfs;根文件系統
中圖分類號:TP311文獻標識碼:A
文章編號:1004-373X(2010)04-073-03
Research of Embedded Linux Root File System
CHEN Haiyan,REN Songyan
(Harbin University of Science and Technology,Harbin,150080,China)
Abstract:In the embedded Linux system,root file system as an important part of building embedded Linux system,which is the indispensable component of Linux/UNIX system.Starting from the foundation of Linux root file system,the composition of root file system and how to use Busybox configuration to complete the root file system is analysed in detail,and the startup script and configuration files in order to achieve simple root file system,and elaborate the production process of root file system are proposed,taking Cramfs and Jffs 2 for example,reference for the production of other file systems is provided.
Keywords:embedded Linux;Jffs 2;Cramfs;root file system
0 引 言
隨著數字技術的發展,近年來嵌入式系統技術發展迅猛,已廣泛應用于工業控制、國防、通信、辦公自動化、消費電子等多種領域.而Linux作為一款優秀的源碼開放、功能強大、高效穩定、開發環境成熟的多任務操作系統,具有許多商業操作系統不可比擬的優勢,成為了最有潛力的嵌人式操作系統[1]。根文件系統是嵌入式Linux的重要組件,是內核啟動加載的第一個文件系統,主要為內核的啟動提供各種工具軟件、庫文件、腳本和配置文件等等,并且可以作為數據的存取區域,是決定系統能否正常啟動的關鍵[2,3]。在此以Cramfs和Jffs 2文件系統為例,詳述Linux根文件系統的制作過程。
1 文件系統層次標準
為了規范Linux的文件系統,促進Linux快速發展,Linux的開發者出臺了所謂的文件系統層次標準(Filesystem Hierarchy Standard,FHS),它規范了在根目錄“/”下面各個主要的目錄應該放置什么樣的文件。FHS定義了兩層規范,第一層是“/”下面的各個目錄應該要放什么文件數據,例如 /etc應該要放置配置文件,/bin與/sbin則應該要放置可執行文件等。第二層則是針對 /usr及 /var這兩個目錄的子目錄來定義。例如 /var/log放置系統登錄文件、/usr/share放置共享數據等。
在根文件系統的最頂層目錄中,每一個目錄都有其具體的目的和用途,表1提供了一個完整的FHS定義的根文件系統頂層目錄[4,5]。
嵌入式Linux是標準Linux的裁剪,可以根據不同的用途對FHS進行必要的裁剪。例如/home,/root是在多用戶時才有作用,在嵌入式系統中,如手持式智能終端等單用戶設備是不需要這些目錄的。
2 FLASH文件系統
FLASH是目前嵌入式系統中廣泛采用的主流存儲儲裝置,它是一種電擦除的非易失性存儲器,具有低功耗、高密度、小體積等優點。FLASH存儲器可以分為若干塊,每塊又由若干頁組成,對FLASH的擦除操作以塊為單位進行,而讀和寫操作以頁為單位進行。FLASH 存儲器在進行寫入操作之前必須先擦除目標塊[6]。目前FLASH中常見的文件系統有Romfs,Cramfs,Jffs 2,Yaffs2等,不同的文件系統有不同的特點。
表1 根文件系統頂層目錄
目錄名內容
bin提供基本的用戶命令庫
boot用于BootLoader的靜態文件
dev設備或其他的特殊文件
etc系統配置文件
home多個用戶的主目錄
lib基本的系統庫
mnt用于臨時掛載的文件系統
opt可選擇的軟件包
proc內核虛擬文件系統和進程信息
root根用戶的主目錄
sbin基本的系統管理命令庫
tmp臨時文件
usr它的二級目錄里包含許多應用程序和許多有用的文檔
var一些變化的實例和工具
2.1 Cramfs文件系統
Cramfs被設計為簡單并且非常小的可壓縮的文件系統,它主要用于ROM較小的嵌入式系統。在Cramfs文件系統中,每一頁(4 KB)被單獨壓縮,可以隨機頁訪問,其壓縮比高達2∶1,為嵌入式系統節省大量的FLASH存儲空間,同時在運行的時無需一次性地將文件系統中的任何內容都解壓縮到內存之中,而是在系統需要訪問某個位置的數據時,立即計算出該數據在Cramfs 中的位置,將其實時地解壓縮到內存之中,然后通過對內存的訪問來獲取文件系統中需要讀取的數據,其速度快,效率高。它的只讀的特點有利于保護文件系統免受破壞,提高了系統的可靠性,但是它的只讀屬性同時又是一大缺陷,使得用戶無法對其內容對進擴充[7]。
2.2 Jffs 2文件系統
Jffs 2是FLASH嵌入式系統上應用最廣的一個日志結構的文件系統。它提供的垃圾回收機制,使得不需要馬上對擦寫越界的塊進行擦寫,而只需要為其設置一個標志,標明為塊。當可用的塊數不足時,垃圾回收機制才開始回收這些節點。同時,由于Jffs 2基于日志型結構,在意外掉電后仍然可以保持數據的完整性,而不會丟失數據。當文件系統已滿或接近滿時,因為垃圾收集的關系而使Jffs 2的運行速度大大放慢[8]。
3 Busybox的配置
Busybox是一個集成了一百多個最常用Linux 命令和工具的軟件,具有實用、短小、穩定等特點。Busybox 利用Linux 實用工具中代碼大量重復的事實,將重復的代碼重新整理,放到一個文件中,減少了多次包含,這樣就可以節省系統的空間和提高程序的執行速度,很適合對于資源比較緊張的嵌入式系統使用[9]。
Busybox的源碼可以從官方網站www.busybox.net/下載,然后解壓源碼包進行配置安裝,具體操作如下:
#tar-xjvf busybox-1.7.0.tar.bz2
#cd busybox-1.7.0
#make menuconfig
#make
#make install
最常用的配置命令是make menuconfig,也可以根據自己的需要來配置busybox,如果希望選擇盡可能多的功能,可以直接用make defconfig,它會自動配置為最大通用的配置選項,從而使得配置過程變得更加簡單、快速。在執行make命令之前應該修改頂層Makefile文件(ARCH=arm,CROSSCOMPLIE=arm-linux-)。執行完make install命令后會在當前目錄的install目錄下生成bin,sbin,linuxrc三個文件。
4 創建根文件系統
Busybox已經生成了根文件系統的三個重要的文件,其他的根目錄文件要根據嵌入式設備的具體功能來對FHS進行裁剪,具體步驟如下:
(1) 創建根目錄myrootfs,把Busybox生成的三個文件復制到myrootfs目錄下,并在此目錄下分別建立dev,lib,mnt,etc,sys,proc,usr,home,tmp,var等目錄(只有dev,lib,sys,usr,etc是不可或缺的,其他的目錄可根據需要選擇)。在etc目錄下建立init.d目錄。
(2) 建立系統配置文件inittab,fstab,rcS,其中inittab,fstab放在etc目錄下,rcS放在/etc/init.d目錄中,下面給出這些文件的簡單配置:
inittab文件(init進程根據它來創建其他子進程)
# This is run first except when booting
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
#Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a-r
fstab 文件(定義了文件系統的各個“掛載點”,需要與實際的系統相符合):
none/proc proc defaults 0 0
none/dev /pts devpts mode=0622 0 0
tmpfs/dev/shm tmpfs defaults 0 0
sysfs/sys sysfs defaults 0 0
rcS文件
#! /bin/sh
/bin/mount-a
/bin/mkdir/dev/pts
/bin/mkdir-p/var/log
/bin/mkdir-p /var/run
/bin/mount-t devpts devpts/dev/pts
mdev-s
(3) 創建必須的設備節點,該文件必須在/etc目錄下創建
#mknod console c 5 1
#mknod 1 c 1 3
(4) 如果Busybox 采用動態鏈接的方式編譯,還需要把busybox 所需要的動態庫: libcrypt.so.1,libc.so.6,ldlinux.so.2放到lib目錄中。為了節約嵌入式設備的FLASH空間,通常會采用動態鏈接方式,而不采用靜態鏈接方式。
(5) 改變rcS的屬性
#chmod +x /etc/init.d/rcS
5 創建根文件系統映像
所謂創建某種格式的根文件系統,就是將根文件系統內容轉換成選用的這種文件系統格式,或將根文件系統內容安裝在具有這種文件系統格式的設備上。在嵌入式設備中常用的文件類型有Romfs,Jffs 2,Yaffs 2,Ramdisk,Ramfs,Cramfs等,下面主要介紹Jffs 2和Cramfs文件類型。
5.1 Jffs 2根文件系統映像
上面已經建立了根文件目錄myrootfs,然后用命令mkfs.Jffs 2生成Jffs 2文件系統映像,命令源碼包可以從http://sources.redhat.com/Jffs 2/處下載。
#mkfs.Jffs 2-n-s 512-e 16KiB-d myrootfs-o myrootfs.Jffs 2
其中“-n” 表示不要在每個擦除塊上都加上清除標志;“-s 512” 指明一頁大小為512 B;“-e 16 KB”指明一個擦除塊大小為16 KB;“-d” 表示根文件系統目錄;“-o” 表示輸出文件。
5.2 cramfs根文件系統映像
使用命令mkcramfs創建根文件系統映像,這個工具在Linux 源碼包里。
#mkcramfs myrootfs myrootfs.cramfs
6 結 語
Linux支持很多不同的文件系統,在具體使用時應根據設備的用途和配置來選擇文件系統,也可以在一個設備上用多種文件系統。以Cramfs和Jffs 2為例介紹了Linux的根文件系統的制作過程,為其他文件系統的制作過程提供參考,也為Linux下應用程序的開發奠定基礎。
參考文獻
[1]楊潔潔.嵌入式Linux系統的移植及其根文件系統的實現[J].漳州師范學院學報,2005(2):46-48.
[2]陳立定,楊俊輝,陳偉欣.使用Busybox制作Cramfs根文件系統[J].計算機技術與發展,2009,19(4):146-148.
[3]耿增濤,史永宏.Jffs 2文件系統在嵌入式Linux根文件系統中的應用研究[J].微型電腦應用,2008,24(2):44-46.
[4]李亞鋒,歐文盛.ARM嵌入式Linux系統開發從入門到精通[M].北京:清華大學出版社,2007.
[5]查啟鵬,姚國良,張萌.嵌入式Linux下大容量NAND FLASH的Yaffs 2文件系統構建[J].現代電子技術,2007,30(18):55-58.
[6]張勇,裘雪紅.嵌入式Linux下Jffs 2文件系統的實現[J].計算機技術與發展,2006,16(4):138-140.
[7]賴于樹.ARM微處理器與應用開發[M].北京:電子工業出版社,2007.
[8]王集森,劉昊,胡晨.嵌入式Linux中多文件系統的構建[J].單片機與嵌入式系統應用,2003(12):12-15.
[9]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.