劉二鋼
(海南大學 信息科學技術學院,海南 海口 570228)
一種構建嵌入式Linux根文件系統的方法
劉二鋼
(海南大學 信息科學技術學院,海南 海口570228)
根文件系統是構建嵌入式Linux系統的非常重要的組成部分。文中主要以制作Yaffs2根文件系統為例,研究如何使用BusyBox構建嵌入式Linux的根文件系統,包括BusyBox的配置、編譯和安裝,以及在嵌入式Linux環境下生成根文件系統映像文件的方法。文中所介紹的方法能夠成功地在ARM開發板中移植和運行,為嵌入式系統的開發提出了一種簡單易行的研究思路。
BusyBox;Yaffs2;嵌入式Linux;文件系統
在嵌入式系統中如果引入操作系統,研發人員可以根據需求直接在操作系統基礎上設計開發而不必從頭開始。這樣會使研發工作變得簡單方便,因此帶操作系統的開發模式正逐步成為嵌入式系統開發的主流。Linux操作系統由于其開源穩定,安全高效,一直是嵌入式操作系統的應用首選。應用Linux操作系統,必須構建Linux根文件系統。但是大多數開發板所提供的構建Linux根文件系統的文獻資料都非常簡單,甚至未提及應用方法,許多用戶難以理解和掌握。本文就Linux根文件系統做了簡單介紹,并提出一種切實可行構建根文件系統的方法。
由于Linux嵌入式產品成本低廉,開發資源豐富,因此其越來越受到重視,應用也越來越廣泛。對于Linux操作系統來說,并沒有類似于WINDOWS中盤符的概念,而是將分區掛載到目錄上,被掛載的目錄就稱之為掛載點(mount point),然后通過目錄來訪問分區上的文件。常見的根文件系統都呈倒掛狀樹形層次結構,主要目錄及含義如圖1所示。

圖1 根文件目錄結構
對于操作系統而言,存儲在上面的文件和目錄必須遵循一定的格式,這種格式就稱之為文件系統類型,Linux操作系統常見的文件系統類型有 Ext2、Ext3、Jffs2、Cramfs、Yaffs、Yaffs2等。這些文件系統各有自己的特點,主要區別在于是否可寫、是否能夠壓縮及是否具有日志功能等。根文件系統是嵌入式Linux的重要組成部分,是內核啟動加載的第一個文件系統,并為內核的啟動提供各種工具軟件、庫文件、腳本和配置文件,而且可以作為數據的存取區域,是決定系統能否正常啟動的關鍵[1]。
制作根文件系統就是生成上述各種文件目錄的過程。常見的制作根文件系統的方法是利用工具BusyBox制作根文件系統,用這種方法制作根文件系統可以做到短小精悍且效率較高。文中主要以制作Yaffs2根文件系統為例,論述利用BusyBox工具制作根文件系統的整個過程。系統宿主機是PC機,操作系統是Ubuntu10.04,目標板是基于ARM9-S3C2440微控制器的開發板,內核是Linux2.6.30.4,Bootloader是U-boot。
BusyBox是一個集成多個Linux命令和工具的軟件,具有實用穩定、短小精悍等特點,因此BusyBox常常被稱作“The Swiss Army Knife of Embedded Linux”[2]。它將許多常用的Unix命令和工具集合到一個單獨的可執行程序中,雖然與相應的GUN工具比較,其所提供的功能和參數略少,但在比較小的嵌入式系統中已經夠用[3]。BusyBox利用Linux實用工具中代碼大量重復的事實,將重復的代碼重新整理放到一個文件中,減少了多次包含,這樣就可以節省系統的空間并提高程序的執行速度[4]。
首先要到其官方網站 http://www.busybox.net/downloads/下載BusyBox源碼,本文下載的版本為BusyBox-1.13.0.tar. bz2,下載后將其解壓,隨后修改頂層目錄下的MakeFile文件。由于硬件環境是ARM平臺,需要修改編譯工具和系統架構為:
CROSS_COMPILE=arm-linux-
ARCH=arn
下面進行菜單配置,在終端中輸入make menuconfig,選擇需要添加的命令和文件。一般保留默認配置即可,這里不再詳細論述。
設定好配置菜單并保存退出后就可以進行BusyBox的安裝了。在安裝之前首先設定安裝目錄,這里假設安裝在/ home/rootbox下。創建目錄rootbox,然后安裝BusyBox到此目錄下。具體命令如下:
sudo mkdir/home/rootbox/*建立目錄rootbox*/
cd~/busybox-1.13.0/*進入到BusyBox目錄*/
make
make CONFIG PREFIX=/home/rootbox install/*安裝到rootbox目錄*/
編譯結束后會在rootbox目錄下面生成構建根文件系統所需要的一些文件和目錄,分別為bin目錄、sbin目錄、usr目錄以及linuxrc文件。如果沒有指定路徑,則會在BusyBox目錄下生成_install目錄并包含上述目錄和文件。雖然產生的文件并不是很多,但大部分都是經常用到的一些命令,這也正體現出BusyBox的短小精悍。
通過這個步驟,已經實現了BusyBox的安裝,從而完成了最基本的Linux文件框架,下面開始制作根文件系統。
進入目錄rootbox,在此路徑下繼續建立所需的dev,etc, home,lib,mnt,proc,root,sys,tmp,bin,opt,web,udisk,sddisk,var等目錄。
4.1創建etc目錄下的文件
系統所需的配置文件存放于/home/rootbox/etc這個目錄。配置文件主要依賴于系統中所擁有的應用程序以及這些程序的配置方式。文中主要創建了inittab、init.d/rcS和fstab文件。
4.1.1創建etc/inittab文件
init最主要的功能就是準備軟件執行的環境,包括系統的主機名、網絡設置、語系處理、文件系統格式及其他服務的啟動等[5],而這些操作主要是根據/etc/inittab這個配置文件進行規劃的。
在BusyBox源碼下面存在一個 “examples/inittab”文件,可以參考這個文件內容設定inittab代碼:
#/etc/inittab
::sysint:/etc/init.d/rcs/*定系統啟動的腳本*/
::respawn:-/bin/sh/*打開一個登錄會話*/
S3C2440_seria10:askfirst:-/bin/sh/*指定打開一個無需登陸驗證的*/
shell,以s3c2440_seria10作為控制臺*/
::ctrlaltdel:/sbin/reboot/*指定當按下ctrl+alt+del時執行命令*/
::shutdown:/bin/umount-a-r/*關機時執行的操作*/
4.1.2創建etc/init.d/rcS文件
這個文件是一個腳本文件,主要作用是添加可以自動運行的程序及其執行權限。文中添加的命令是配置IP地址以及掛接下面4.1.3所述/etc/fstab指定的文件系統,也可根據需要添加其它命令。命令內容如下:
#!/bin/sh
ifconfig eth0 192.168.1.10
mount-a
chmod+x etc/init.d/rcs
4.1.3創建etc/fstab文件
Linux將硬盤,分區及可移動磁盤等設備都作為一種文件目錄進行管理,etc/fstab文件就是專門用來配置這些文件目錄進行自動掛載的過程,相當于將mount掛載過程變為自動執行。因此fstab對于文件系統來說非常重要,是Linux系統開機自動引導掛載時所依賴的唯一配置標準。文中創建代碼如下:
#devicemount-pointtypeoptionsdump fsck order
proc/procprocdefaults 00
tmpfs/tmptmpfs defaults 00
sysfs/syssysfsdefaults 00
tmpfs/devtmpfs defaults 00
文件中各字段的含義表示如下:
1)device:掛接設備文件名或設備 Label,比如/dev/ mtdblock1;
2)mount-point:掛載點;
3)type:掛載文件系統類型;
4)options:文件系統參數,如只讀、可執行等,中間以逗號隔開;
5)dump和fsck order:控制dump備份與fsck扇區檢驗。
4.2構建dev目錄
從Linux-2.6.12內核開始,設備管理系統的devfs選項已經從內核配置中刪除[6]。新版本的udev是一個應用層的管理文件,已經不再屬于內核,在內核啟動時并不能自動創建設備節點,必須進行手動創建。這里主要需要兩個設備,一個是用于終端連接的console控制臺,另一個則是用于處理垃圾文件的null。可以采用變通的辦法,利用BusyBox中內置的mdev文件生成一個簡化的udev版本。
s mknod dev/console c 5 1
s mknod dev/nullc 1 3
如果上述操作沒有執行,文件系統在啟動時將不能夠連接控制臺,從而出現錯誤信息。
4.3安裝glibc庫
在嵌入式目標板上還需動態庫和加載器,因此執行命令如下:
scd/hone/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib scp*.so*/home/rootbox/lib
由于文件系統的啟動依賴于嵌入式Linux系統內核,因此必須要在Linux系統內核中添加對于文件系統的支持。
首先需要下載Yaffs文件系統補丁cvs-root.tar.gz,讀者可以在網上搜索下載。下載之后將其解壓,并將這個補丁打在Linux系統內核目錄中,具體命令如下:
star xvfx cvx-root.tar.gz
scd cvs/yaffs2/
s./patch-ker.shc/home/linux-2.6.30.4/
執行之后就會在Linux內核的“fs/”目錄下面看到新添加了一個名為 “yaffs2/”的目錄,同時在“fs/”目錄下面的“Makefile”文件和“Kconfig”文件也添加了 yaffs2的配置和編譯條件。然后編譯配置內核,在內核中添加硬件ECC校驗和YAFFS文件系統的選項,否則yaffs2文件系統可能會掛載不成功。
下面就可以制作文件系統映像了。在http://www.yaffs.net/可以得到yaffs文件系統的源碼壓縮包,在yaffs源碼中可以找 到 utils目 錄 ,里 面 包 含 Makefile、mkyaffsimage和mkyaffs2image三個文件。其中mkyaffsimage和mkyaffs2image這兩個文件主要是用來做系統映像,二者的區別是前者用來制作yaffs文件映像,后者用來制作yaffs2文件映像[7]。另外再加入兩個文件:nand-ecc.c和yaffs_packedtags1.c,具體文件這里不列出,源碼可參見文獻[8]。
因為yaffs_packedtags1.c和nand-ecc.c文件是后加上去的,可以增加制作好的文件系統支持大容量磁盤等功能,但是這樣文件數目及內容發生了變化,必須修改Makefile文件 。在 MKYAFFS2SOURCES=mkyaffs2image.c后 面 加yaffs_packedtags1.c nand-ecc.c,將這兩個文件也載入系統映像。然后執行make命令后重新生成mkyaffs2image工具,復制此工具到PC機usr/local/bin目錄下,利用makyaffs2image工具執行命令:
scd/home
smkyaffsimage2 rootbox rootbox.bin
之后就可以生成文件系統映像文件名稱為rootbox.bin。至此,整個根文件系統就制作完成。
最后需要完成的是將制作好的Linux內核映像和根文件系統映像下載到目標開發板,本文中使用的是基于S3C2440微處理器的開發板,這個步驟可以借助于Windows提供的超級終端工具進行下載。
#tftp 30008000 zImage.bin/*下載Linux內核映像到目標板內存*/
#tftp 30800000 rootbox.bin/*下載根文件系統映像到目標板內存*/
#go30008000/*啟動目標板Linux*/
下載成功后在超級終端中顯示的結果如圖2所示,可見系統已經正常啟動,從而成功生成了根文件系統所必須的文件目錄結構。

圖2 根文件運行結果
根文件系統是Linux嵌入式系統中重要的部分,好的文件系統可以更好的利用軟硬件資源,提高系統性能。Linux嵌入式文件系統種類多樣,在選取時需要根據系統的Flash容量、SDRAM大小以及對文件系統讀寫的需求而定。文中通過對文件系統的制作以及移植的闡述,為Linux嵌入式研究者提供了一種借鑒方法。
[1]陳海燕,任松巖.嵌入式Linux根文件系統的研究[J].現代電子技術,2010(4):73-75.
[2]Erik Andersen.BusyBox:The Swiss Army Knife of Embedded Linux[EB/OL].(2008)[2014-12-11],http://www.busybox.net/about.html.
[3]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式Linux系統構建[J].現代電子技術,2007(24):55-57.
[4]陳立定,楊俊輝,陳偉欣.使用Busybox制作Cramfs根文件系統[J].計算機技術與發展,2009(4):146-148,153.
[5]鳥哥.鳥哥的linux私房菜-基礎學習篇(第三版)[M].北京:人民郵電出版社,2010.
[6]王磊,謝維波.AdHoc網絡在嵌入式Linux上的實現[J].華僑大學學報自然科學版,2011(3):161-164.
[7]龍亞春,黃璞,吳勝.超大容量NAND Flash文件系統-YAFFS2 在Linux下的實現 [J].北京電子科技學院學報,2007,15(2):81-84.
[8]小龍.利用BusyBox做yaffs根文件系統 [EB/OL].(2009-01)[2014-12-11],http://blog.mcuol.com/User/longren/Article/9633_1. htm.
A method of building embedded Linux root file system
LIU Er-gang
(College of Information Science&Technology,Hainan University,Haikou 570228,China)
The root file system is a very important part of building the embedded Linux system.This paper mainly makes Yaffs2 root file system as an example of studying how to use the BusyBox to build embedded Linux root file system,including the BusyBox configuration,compilation and installation,and generates the system image files of root file in the embedded Linux environment.The method introduced in the paper is able to transplant and run successfully in the ARM development board,and puts forward a kind of feasible research ideas for the development of embedded system.
BusyBox;Yaffs2;Embedded Linux;file system
TN99
A
1674-6236(2016)09-0160-03
2015-05-29稿件編號:201505255
海南省自然科學基金資助項目(614225)
劉二鋼(1980—),男,山西長治人,碩士研究生,講師。研究方向:嵌入式系統、圖像處理。