摘 要:在嵌入式Linux系統(tǒng)中,根文件系統(tǒng)是構(gòu)建嵌入式Linux系統(tǒng)的重要組成部分,是Linux/Unix系統(tǒng)不可或缺的組件。這里從Linux根文件系統(tǒng)底層出發(fā),詳細分析根文件系統(tǒng)的組成和如何利用Busybox配置完整的根文件系統(tǒng),并給出了啟動腳本和配置文件以實現(xiàn)簡單的根文件系統(tǒng),并且以Cramfs和Jffs 2為例詳述了根文件系統(tǒng)的制作過程,為其他文件系統(tǒng)的制作提供參考。
關(guān)鍵詞:嵌入式Linux;Jffs 2;Cramfs;根文件系統(tǒng)
中圖分類號: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 引 言
隨著數(shù)字技術(shù)的發(fā)展,近年來嵌入式系統(tǒng)技術(shù)發(fā)展迅猛,已廣泛應(yīng)用于工業(yè)控制、國防、通信、辦公自動化、消費電子等多種領(lǐng)域.而Linux作為一款優(yōu)秀的源碼開放、功能強大、高效穩(wěn)定、開發(fā)環(huán)境成熟的多任務(wù)操作系統(tǒng),具有許多商業(yè)操作系統(tǒng)不可比擬的優(yōu)勢,成為了最有潛力的嵌人式操作系統(tǒng)[1]。根文件系統(tǒng)是嵌入式Linux的重要組件,是內(nèi)核啟動加載的第一個文件系統(tǒng),主要為內(nèi)核的啟動提供各種工具軟件、庫文件、腳本和配置文件等等,并且可以作為數(shù)據(jù)的存取區(qū)域,是決定系統(tǒng)能否正常啟動的關(guān)鍵[2,3]。在此以Cramfs和Jffs 2文件系統(tǒng)為例,詳述Linux根文件系統(tǒng)的制作過程。
1 文件系統(tǒng)層次標準
為了規(guī)范Linux的文件系統(tǒng),促進Linux快速發(fā)展,Linux的開發(fā)者出臺了所謂的文件系統(tǒng)層次標準(Filesystem Hierarchy Standard,F(xiàn)HS),它規(guī)范了在根目錄“/”下面各個主要的目錄應(yīng)該放置什么樣的文件。FHS定義了兩層規(guī)范,第一層是“/”下面的各個目錄應(yīng)該要放什么文件數(shù)據(jù),例如 /etc應(yīng)該要放置配置文件,/bin與/sbin則應(yīng)該要放置可執(zhí)行文件等。第二層則是針對 /usr及 /var這兩個目錄的子目錄來定義。例如 /var/log放置系統(tǒng)登錄文件、/usr/share放置共享數(shù)據(jù)等。
在根文件系統(tǒng)的最頂層目錄中,每一個目錄都有其具體的目的和用途,表1提供了一個完整的FHS定義的根文件系統(tǒng)頂層目錄[4,5]。
嵌入式Linux是標準Linux的裁剪,可以根據(jù)不同的用途對FHS進行必要的裁剪。例如/home,/root是在多用戶時才有作用,在嵌入式系統(tǒng)中,如手持式智能終端等單用戶設(shè)備是不需要這些目錄的。
2 FLASH文件系統(tǒng)
FLASH是目前嵌入式系統(tǒng)中廣泛采用的主流存儲儲裝置,它是一種電擦除的非易失性存儲器,具有低功耗、高密度、小體積等優(yōu)點。FLASH存儲器可以分為若干塊,每塊又由若干頁組成,對FLASH的擦除操作以塊為單位進行,而讀和寫操作以頁為單位進行。FLASH 存儲器在進行寫入操作之前必須先擦除目標塊[6]。目前FLASH中常見的文件系統(tǒng)有Romfs,Cramfs,Jffs 2,Yaffs2等,不同的文件系統(tǒng)有不同的特點。
表1 根文件系統(tǒng)頂層目錄
目錄名內(nèi)容
bin提供基本的用戶命令庫
boot用于BootLoader的靜態(tài)文件
dev設(shè)備或其他的特殊文件
etc系統(tǒng)配置文件
home多個用戶的主目錄
lib基本的系統(tǒng)庫
mnt用于臨時掛載的文件系統(tǒng)
opt可選擇的軟件包
proc內(nèi)核虛擬文件系統(tǒng)和進程信息
root根用戶的主目錄
sbin基本的系統(tǒng)管理命令庫
tmp臨時文件
usr它的二級目錄里包含許多應(yīng)用程序和許多有用的文檔
var一些變化的實例和工具
2.1 Cramfs文件系統(tǒng)
Cramfs被設(shè)計為簡單并且非常小的可壓縮的文件系統(tǒng),它主要用于ROM較小的嵌入式系統(tǒng)。在Cramfs文件系統(tǒng)中,每一頁(4 KB)被單獨壓縮,可以隨機頁訪問,其壓縮比高達2∶1,為嵌入式系統(tǒng)節(jié)省大量的FLASH存儲空間,同時在運行的時無需一次性地將文件系統(tǒng)中的任何內(nèi)容都解壓縮到內(nèi)存之中,而是在系統(tǒng)需要訪問某個位置的數(shù)據(jù)時,立即計算出該數(shù)據(jù)在Cramfs 中的位置,將其實時地解壓縮到內(nèi)存之中,然后通過對內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù),其速度快,效率高。它的只讀的特點有利于保護文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性,但是它的只讀屬性同時又是一大缺陷,使得用戶無法對其內(nèi)容對進擴充[7]。
2.2 Jffs 2文件系統(tǒng)
Jffs 2是FLASH嵌入式系統(tǒng)上應(yīng)用最廣的一個日志結(jié)構(gòu)的文件系統(tǒng)。它提供的垃圾回收機制,使得不需要馬上對擦寫越界的塊進行擦寫,而只需要為其設(shè)置一個標志,標明為塊。當(dāng)可用的塊數(shù)不足時,垃圾回收機制才開始回收這些節(jié)點。同時,由于Jffs 2基于日志型結(jié)構(gòu),在意外掉電后仍然可以保持數(shù)據(jù)的完整性,而不會丟失數(shù)據(jù)。當(dāng)文件系統(tǒng)已滿或接近滿時,因為垃圾收集的關(guān)系而使Jffs 2的運行速度大大放慢[8]。
3 Busybox的配置
Busybox是一個集成了一百多個最常用Linux 命令和工具的軟件,具有實用、短小、穩(wěn)定等特點。Busybox 利用Linux 實用工具中代碼大量重復(fù)的事實,將重復(fù)的代碼重新整理,放到一個文件中,減少了多次包含,這樣就可以節(jié)省系統(tǒng)的空間和提高程序的執(zhí)行速度,很適合對于資源比較緊張的嵌入式系統(tǒng)使用[9]。
Busybox的源碼可以從官方網(wǎng)站www.busybox.net/下載,然后解壓源碼包進行配置安裝,具體操作如下:
#tar-xjvf busybox-1.7.0.tar.bz2
#cd busybox-1.7.0
#make menuconfig
#make
#make install
最常用的配置命令是make menuconfig,也可以根據(jù)自己的需要來配置busybox,如果希望選擇盡可能多的功能,可以直接用make defconfig,它會自動配置為最大通用的配置選項,從而使得配置過程變得更加簡單、快速。在執(zhí)行make命令之前應(yīng)該修改頂層Makefile文件(ARCH=arm,CROSSCOMPLIE=arm-linux-)。執(zhí)行完make install命令后會在當(dāng)前目錄的install目錄下生成bin,sbin,linuxrc三個文件。
4 創(chuàng)建根文件系統(tǒng)
Busybox已經(jīng)生成了根文件系統(tǒng)的三個重要的文件,其他的根目錄文件要根據(jù)嵌入式設(shè)備的具體功能來對FHS進行裁剪,具體步驟如下:
(1) 創(chuàng)建根目錄myrootfs,把Busybox生成的三個文件復(fù)制到myrootfs目錄下,并在此目錄下分別建立dev,lib,mnt,etc,sys,proc,usr,home,tmp,var等目錄(只有dev,lib,sys,usr,etc是不可或缺的,其他的目錄可根據(jù)需要選擇)。在etc目錄下建立init.d目錄。
(2) 建立系統(tǒng)配置文件inittab,fstab,rcS,其中inittab,fstab放在etc目錄下,rcS放在/etc/init.d目錄中,下面給出這些文件的簡單配置:
inittab文件(init進程根據(jù)它來創(chuàng)建其他子進程)
# 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 文件(定義了文件系統(tǒng)的各個“掛載點”,需要與實際的系統(tǒng)相符合):
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) 創(chuàng)建必須的設(shè)備節(jié)點,該文件必須在/etc目錄下創(chuàng)建
#mknod console c 5 1
#mknod 1 c 1 3
(4) 如果Busybox 采用動態(tài)鏈接的方式編譯,還需要把busybox 所需要的動態(tài)庫: libcrypt.so.1,libc.so.6,ldlinux.so.2放到lib目錄中。為了節(jié)約嵌入式設(shè)備的FLASH空間,通常會采用動態(tài)鏈接方式,而不采用靜態(tài)鏈接方式。
(5) 改變rcS的屬性
#chmod +x /etc/init.d/rcS
5 創(chuàng)建根文件系統(tǒng)映像
所謂創(chuàng)建某種格式的根文件系統(tǒng),就是將根文件系統(tǒng)內(nèi)容轉(zhuǎn)換成選用的這種文件系統(tǒng)格式,或?qū)⒏募到y(tǒng)內(nèi)容安裝在具有這種文件系統(tǒng)格式的設(shè)備上。在嵌入式設(shè)備中常用的文件類型有Romfs,Jffs 2,Yaffs 2,Ramdisk,Ramfs,Cramfs等,下面主要介紹Jffs 2和Cramfs文件類型。
5.1 Jffs 2根文件系統(tǒng)映像
上面已經(jīng)建立了根文件目錄myrootfs,然后用命令mkfs.Jffs 2生成Jffs 2文件系統(tǒng)映像,命令源碼包可以從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” 表示根文件系統(tǒng)目錄;“-o” 表示輸出文件。
5.2 cramfs根文件系統(tǒng)映像
使用命令mkcramfs創(chuàng)建根文件系統(tǒng)映像,這個工具在Linux 源碼包里。
#mkcramfs myrootfs myrootfs.cramfs
6 結(jié) 語
Linux支持很多不同的文件系統(tǒng),在具體使用時應(yīng)根據(jù)設(shè)備的用途和配置來選擇文件系統(tǒng),也可以在一個設(shè)備上用多種文件系統(tǒng)。以Cramfs和Jffs 2為例介紹了Linux的根文件系統(tǒng)的制作過程,為其他文件系統(tǒng)的制作過程提供參考,也為Linux下應(yīng)用程序的開發(fā)奠定基礎(chǔ)。
參考文獻
[1]楊潔潔.嵌入式Linux系統(tǒng)的移植及其根文件系統(tǒng)的實現(xiàn)[J].漳州師范學(xué)院學(xué)報,2005(2):46-48.
[2]陳立定,楊俊輝,陳偉欣.使用Busybox制作Cramfs根文件系統(tǒng)[J].計算機技術(shù)與發(fā)展,2009,19(4):146-148.
[3]耿增濤,史永宏.Jffs 2文件系統(tǒng)在嵌入式Linux根文件系統(tǒng)中的應(yīng)用研究[J].微型電腦應(yīng)用,2008,24(2):44-46.
[4]李亞鋒,歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學(xué)出版社,2007.
[5]查啟鵬,姚國良,張萌.嵌入式Linux下大容量NAND FLASH的Yaffs 2文件系統(tǒng)構(gòu)建[J].現(xiàn)代電子技術(shù),2007,30(18):55-58.
[6]張勇,裘雪紅.嵌入式Linux下Jffs 2文件系統(tǒng)的實現(xiàn)[J].計算機技術(shù)與發(fā)展,2006,16(4):138-140.
[7]賴于樹.ARM微處理器與應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2007.
[8]王集森,劉昊,胡晨.嵌入式Linux中多文件系統(tǒng)的構(gòu)建[J].單片機與嵌入式系統(tǒng)應(yīng)用,2003(12):12-15.
[9]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2008.