一、 檔案系統簡介
嵌入式系統中常用檔案系統包括有cramfs、JFFS2、NFS、initrd、yaffs2 以及squashfs。它們的特點如下:
(1)、cramfs 和JFFS2 具有好的空間特性,很适合嵌入式産品應用。
(2)、cramfs 與squashfs 為隻讀檔案系統。
(3)、squashfs 壓縮率最高。
(4)、JFFS2 為可讀寫檔案系統。
(5)、NFS 檔案系統适用于開發初期的調試階段。
(6)、yaffs2 檔案系統隻用于NAND Flash。
(7)、initrd 采用cramfs 檔案系統,為隻讀。
1、 cramfs
cramfs 是針對Linux 核心2.4 之後的版本所設計的一種新型檔案系統,使用簡單,加載容易,速度快。
cramfs 的優缺點如下:
優點:将檔案資料以壓縮形式存儲,在需要運作時進行解壓縮,能節省Flash 存儲空間。
缺點:由于它存儲的檔案是壓縮的格式,是以檔案系統不能直接在Flash 上運作。同時,檔案系統運作時需要解壓資料并拷貝至記憶體中,在一定程度上降低讀取效率。另外cramfs 檔案系統是隻讀的。如果想要在單闆運作的Linux 中提供cramfs 的能力,必須要在編譯核心時把cramfs 的選項加入。在make menuconfig 後,進入“File>systems”,選擇“miscellaneousfilesystems”,最後選中其中的“Compressed ROM file system support”。
mkfs.cramfs 是用來制作cramfs 檔案系統映象的工具。通過這個工具處理已經制作好的根檔案系統,就可以生成cramfs 檔案系統的映象(這類似于我們把CD光牒制作成ISO 檔案映像)。具體操作如下所示:
$ mkfs.cramfs ./rootbox ./cramfs-root.img
其中,rootbox 是之前已經制作好的根檔案系統,cramfs-root.img 是生成的cramfs 檔案系統映像檔案。
2、JFFS2
JFFS2 是RedHat 的David Woodhouse 在JFFS 基礎上改進的檔案系統,是用于微型嵌入式裝置的原始閃存晶片的實際檔案系統。JFFS2 檔案系統是日志結構化的可讀寫的檔案系統。
JFFS2 的優缺點如下:
優點:使用了壓縮的檔案格式。最重要的特性是可讀寫操作。
缺點:JFFS2 檔案系統挂載時需要掃描整個JFFS2 檔案系統,是以當JFFS2 檔案系統分區增大時,挂載時間也會相應的變長。使用JFFS2 格式可能帶來少量的Flash 空間的浪費。這主要是由于日志檔案的過度開銷和用于回收系統的無用存儲單元,浪費的空間大小大緻是若幹個資料段。JFFS2 的另一缺點是當檔案系統已滿或接近滿時,JFFS2 運作速度會迅速降低。這是因為垃圾收集的問題。
加載JFFS2 檔案系統時的步驟如下:
步驟 1. 掃描整個晶片,對日志節點進行校驗,并且将日志節點全部裝入記憶體緩存。
步驟 2. 對所有日志節點進行整理,抽取有效的節點并整理出檔案目錄資訊。
步驟 3. 找出檔案系統中無效節點并且将它們删除。
步驟 4. 最後整理記憶體中的資訊,将加載到緩存中的無效節點釋放。
由此可以看出雖然這樣能有效地提高系統的可靠性,但是在一定程度上降低了系統的速度。尤其對于較大的閃存晶片,加載過程會更慢。為了使核心支援JFFS2 檔案系統,必須在編譯核心時把JFFS2 的選項加入。在make menuconfig 後,進入“File>systems”,選擇“miscellaneous filesystems”,最後選中其中的“Journalling Flash File System v2 (JFFS2)support”選項。
JFFS2 的制作方法為:
$ mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img
其中,mkfs.jffs2 工具可以從網際網路中下載下傳,也可以在SDK 包中找到。rootbox 為之前已經制作好的根檔案系統。參數說明如下表 所示。
參數 | 說明 |
d | 指定根檔案系統 |
l | little-endian 小端模式 |
e | Flash 的塊大小 |
o | 輸出映像檔案 |
3、 yaffs2
yaffs2 是專門為NAND Flash 設計的嵌入式檔案系統。它是日志結構的檔案系統,提供了損耗平衡和掉電保護,可以有效地避免意外掉電對檔案系統一緻性和完整性的影響。
yaffs2 的優缺點如下:
優點
− 專門針對 NAND Flash,軟體結構得到優化,速度快。
− 使用硬體的 spare area 區域存儲檔案組織資訊,啟動時隻需掃描組織資訊,啟動比較快。
− 采用多政策垃圾回收算法,能夠提高垃圾回收的效率和公平性,達到損耗平衡的目的。
缺點
沒有采用壓縮的檔案格式。當包含的内容相同時,yaffs2 鏡像檔案要比jffs2 鏡像檔案大。yaffs2 檔案系統在SDK 中作為一個子產品提供。隻需在yaffs2 代碼中的Makefile 中加入所依賴的核心代碼路徑,進行編譯,即可生成yaffs2 檔案系統子產品。yaffs2 鏡像檔案的制作和cramfs 相同,即通過工具制作,隻需簡單的幾個參數,具體如下:
$ mkyaffs2image ./rootbox yaffs2-root.img pagesize ecctype
其中,rootbox 是之前已經制作好的根檔案系統,yaffs2-root.img 是生成的yaffs2 檔案系統鏡像檔案,pagesize 是單闆上焊接NAND Flash 器件的頁大小,ecctype 是單闆上焊接NAND Flash 器件的ecc 類型。
4、 initrd
initrd 相當于存儲媒體,它支援的檔案系統格式有ext2、cramfs 等,是以核心除了支援initrd 之外,還要支援cramfs 檔案系統。核心需要做如下配置,initrd 才可以正常工作:
進入“Device Drivers->Block devices”,選擇支援“RAM disk support” 和“InitialRAM disk (initrd) support”。
進入“File>systems”,選擇“miscellaneous filesystems”,最後選中其中的“Compressed ROM file system support”。
制作initrd的步驟如下:
步驟 1. 制作cramfs 鏡像檔案,具體制作方法請參見“4.3.1 cramfs”。
步驟 2. 以步驟1 制作的鏡像檔案作為輸入,制作initrd 檔案,制作指令為:
“mkimage -A arm -Tramdisk -C none -a 0 -e 0 -n cramfs-initrd -d ./cramfs-image cramfs-initrd”。
5、Squashfs
squashfs 檔案系統是一套基于Linux 核心使用的壓縮隻讀檔案系統,壓縮率高。
squashfs 具有如下特點:
(1)、資料(data),節點(inode)和目錄(directories)都被壓縮
(2)、 儲存了全部的 32 位 UID/GIDS 和檔案的建立時間
(3)、 最大支援 4G 檔案系統
(4)、檢測并删除重複檔案
使用squashfs 檔案系統步驟:
步驟 1. 制作支援squashfs 的核心鏡像;
步驟 2. 制作squashfs 檔案系統鏡像。mksquashfs 為制作squashfs 檔案系統工具。使用方法如下:
./mksquashfs rootfs ./ rootfs.squashfs.img -b 64K –comp xz
其中,rootfs 是之前已經制作好的根檔案系統,rootfs.squashfs.img 是生成的squashfs 檔案系統映像檔案。-b 64K 指定squashfs 檔案系統的塊大小為64K(決定于實際spi flash塊大小)。-comp 指定檔案系統壓縮方式為xz。請根據實際情況修改參數。
二、根檔案系統簡介
Linux 的目錄結構的最頂層是一個被稱為“/”的根目錄。系統加載Linux 核心之後,就會挂載一個裝置到根目錄上。存在于這個裝置中的檔案系統被稱為根檔案系統。所有的系統指令、系統配置以及其他檔案系統的挂載點都位于這個根檔案系統中。
根檔案系統通常存放于記憶體和Flash 中,或是基于網絡的檔案系統。根檔案系統中存放了嵌入式系統使用的所有應用程式、庫以及其他需要用到的服務。 下面列出了根檔案系統的頂層目錄。
/ -------------- 根目錄
bin --------- 基本指令的可執行檔案
boot -------- 核心映像已經啟動時需要用到的一些檔案
dev --------- 裝置檔案
etc --------- 系統配置檔案,包括啟動檔案
home -------- 使用者目錄
lib --------- 基本庫,例如C庫和核心子產品
lost+found -- 在檔案系統修複時恢複的檔案
mnt --------- 臨時檔案系統的挂載點
nfsroot ----- nfs檔案夾,一般不使用
opt --------- 添加的軟體包
proc -------- 核心以及程序資訊的虛拟檔案系統
root -------- root使用者目錄
sbin -------- 用于系統管理的可執行程式
share ------- 共享檔案目錄
sys --------- 系統裝置和檔案層次結構,向使用者提供詳細的核心資料資訊
tmp --------- 臨時檔案
usr --------- 該目錄的二級目錄包含許多對使用者很有用的應用程式和文檔
var -------- 存放系統日志或一些服務程式的臨時檔案
通用的Linux 系統的根檔案系統中會包括根檔案系統頂層目錄結構圖中所有的目錄,不過在嵌入式系統中,需要精簡根檔案系統。部分可以被忽略的目錄如下表
目錄名稱 | 描述 |
/home、/mnt、/opt 和/root | 所有适合提供給多使用者擴充的目錄,都可以被忽略。 |
/var 和/tmp | /var是存放系統日志或一些服務程式的臨時檔案。 /tmp 是存放使用者的一些臨時檔案,可以被忽略。 |
/boot | /boot 目錄一般用于存放核心映像,PC 機啟動時一般會從該位置加載核心,但在嵌入式系統中,為了節省空間,核心映像存在于Flash 或網絡伺服器中,而不是在根檔案系統中。是以也可以忽略這個目錄。 |
注:空目錄并不會增大檔案系統的體積,如果沒有特殊原因,建議保留這些目錄。
三、利用busybox 制作根檔案系統
利用busybox 制作根檔案系統需要先擷取busybox 源代碼,然後配置、編譯和安裝busybox,操作成功後開始制作根檔案系統。
1、擷取busybox 源代碼
busybox 源代碼也可以從網站http://www.busybox.net 下載下傳源碼。
2、 配置busybox
進入busybox 所在目錄,進行配置操作需要輸入如下指令:
(1)、生成.config 配置檔案
(2)、$ make menuconfig
busybox 的配置界面和核心配置相似,其功能選項容易了解,可以根據自己的需求選擇配置。在Busybox Settings ---> Build Options 中注意下面兩個選項:
[*]Build BusyBox as a static binary (no shared libs)
[*] Build with Large File Support (for accessing files > 2 GB)
(arm-hisiv300-linux-) Cross Compiler prefix
() Path to sysroot
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional CFLAGS
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional
LDFLAGS
() Additional LDLIBS
其中:
− 第一個選項選擇是否把 busybox 編譯成靜态連結的可執行檔案。如果選擇該選項,編譯出來的busybox 就是靜态連結的,運作時不依賴于動态庫,但體積較大;清除該選項将得到動态連結的busybox,體積較小,但需要動态庫的支援。
− 第二個選項是用于選擇 SDK 推薦的交叉編譯器,配置好後儲存并退出。欲了解busybox 各選項含義請參考busybox 配置幫助。
3、編譯和安裝busybox
編譯和安裝busybox 的具體操作如下:
$ make
$ make install
編譯并安裝成功後,在busybox 目錄下的_install 目錄下生成以下目錄及檔案:
drwxr-xr-x 2 lnan lnan 4096 2014-11-20 11:53 bin
lrwxrwxrwx 1 lnan lnan 11 2014-11-20 11:53 linuxrc -> bin/busybox
drwxr-xr-x 2 lnan lnan 4096 2014-11-20 11:53 sbin
drwxr-xr-x 4 lnan lnan 4096 2014-11-20 11:53 usr
4 制作根檔案系統
成功安裝SDK 後,在osdrv/pub/目錄中存放已制作好的根檔案系統。
使用者如有需要可在busybox 的基礎上制作根檔案系統。
制作根檔案系統的具體操作步驟如下:
步驟 1: $ mkdir rootbox
$ cd rootbox
$ cp –R packet/os/busybox-1.20.2/_intsall/* .
$ mkdir etc dev lib tmp var mnt home proc
2.:配置etc、lib、dev 目錄的必需檔案。
步驟 a. etc 目錄可參考系統/etc 下的檔案。其中最主要的檔案包括inittab、fstab、init.d/rcS檔案等,這些檔案最好從busybox 的examples 目錄下拷貝過來,根據需要自行修改。
b. dev 目錄下的裝置檔案,可以直接從系統中拷貝過來或者使用mknod 指令生成需要的裝置檔案。拷貝檔案時請使用cp –R file。
c. lib 目錄是存放應用程式所需要的庫檔案,請根據應用程式需要拷貝相應的庫檔案。