劉俊霞 盛文婷
摘要:首先研究了嵌入式Linux系統(tǒng)以及CramFS文件系統(tǒng)的移植,然后分析了嵌入式Linux系統(tǒng)及CramFS文件系統(tǒng)的特性,其次,詳細說明了移植最小Linux系統(tǒng)的制作過程,最后,對制作出來的Linux系統(tǒng)鏡像進行測試。最終的測試結(jié)果顯示,系統(tǒng)移植成功且能夠?qū)崿F(xiàn)Linux系統(tǒng)的基本命令。
關鍵詞:Linux CramFS isoLinux
中圖分類號:TP316.81 文獻標識碼:A 文章編號:1007-9416(2016)05-0000-00
隨著電子產(chǎn)業(yè)的不斷發(fā)展, 基于 ARM技術的系統(tǒng)設計和開發(fā)平臺越來越多地在控制類、消費類、通信類等電子產(chǎn)品中廣泛應用。從軟件角度上看, 構(gòu)建基于ARM 技術的Linux 系統(tǒng)要涉及到引導加載程序、Linux 內(nèi)核、文件系統(tǒng)、用戶應用程序幾部分的設計。由于存儲空間有限, 如何有效地使用有限的存儲空間是嵌入式開發(fā)者必須考慮的, 合適的文件系統(tǒng)格式是解決這一問題的關鍵所在。
1 CramFS文件系統(tǒng)
CramFS 是專門針對閃存設計的只讀壓縮的文件系統(tǒng),其容量上限為256M,采用zlib壓縮。它并不需要一次性地將文件系統(tǒng)中的所有內(nèi)容都解壓縮到內(nèi)存之中, 而只是在系統(tǒng)需要訪問某個位置的數(shù)據(jù)的時候, 馬上計算出該數(shù)據(jù)在 CramFS 中的位置, 將它實時地解壓縮到內(nèi)存之中, 然后通過對內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù)。
CramFS 文件系統(tǒng)的基本組成: 初始化程序、Shell 程序以及其他 Linux常用工具、配置文件、鏈接庫、圖形界面程序和用戶應用程序,文件系統(tǒng)是緊跟 Linux 內(nèi)核放置,由內(nèi)核加載,主要存放用戶應用程序和配置信息。在嵌入式的環(huán)境之下,內(nèi)存和外存資源都需要節(jié)約使用。但是它也有很致命的弱點。在正常情況下,同樣的代碼不僅在外存中占據(jù)了空間(以壓縮后的形式存在),而且還在內(nèi)存中占用了更大的空間(以解壓縮之后的形式存在),這違背了嵌入式環(huán)境下盡量節(jié)省資源的要求。
2 CramFS文件系統(tǒng)的特性
CramFS采用實時解壓縮方式,但解壓縮的時侯有延遲。CramFS的數(shù)據(jù)都是經(jīng)過處理、打包的,對其進行寫操作有一定困難。所以CramFS不支持寫操作,這個特性剛好適合嵌入式應用中使用Flash存儲文件系統(tǒng)的場合。在CramFS中,文件最大不能超過16MB。支持組標識(gid),但是mkcramfs只將gid的低8位保存下來,因此只有這8位是有效的。
在支持硬鏈接方面CramFS并沒有完全處理好,硬鏈接的文件屬性中,鏈接數(shù)仍然為1。CramFS的目錄中,沒有“.”和“..”這兩項。因此,CramFS中的目錄的鏈接數(shù)通常也僅有一個。CramFS中不會保存文件的時間戳(timestamps)信息。當然,正在使用的文件由于inode保存在內(nèi)存中,因此其時間可以暫時地變更為最新時間,但是不會保存到CramFS文件系統(tǒng)中去。
CramFS與InitramFS相比較,InitramFS具有隨著文件系統(tǒng)中數(shù)據(jù)的增減自動增減容量、不需要額外的文件系統(tǒng)驅(qū)動的優(yōu)點,而CramFS只讀的特點有利于保護文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性。它們都是只讀文件系統(tǒng),而RomFS文件系統(tǒng)可以構(gòu)造出一個更小的內(nèi)核,大約4000字節(jié),并且很節(jié)省內(nèi)存。但是RomFS需要同時支持虛擬盤(RAMDISK)臨時文件和數(shù)據(jù)文件的存儲。
3 CramFS 文件系統(tǒng)目錄
一個完整的 CramFS 文件系統(tǒng)通常包含如下目錄:
Linuxrc、bin、sbin、etc、lib、dev、usr、mnt。
Linuxrc 啟動腳本文件,由 Boot Loader 核心命令行確定 init=/Linuxrc, 加載/etc 目錄為 ramfs, (CramFS 為只讀文件系統(tǒng)), 拷貝/mnt/etc 到/etc, 配置文件目錄重新加載根文件系統(tǒng)和/etc 文件系統(tǒng),執(zhí)行 init 進程。
bin 引導啟動所需的命令或用戶可能用的命令。
sbin 系統(tǒng)管理員服務程序, 其中最重要的是供內(nèi)核初始化之后執(zhí)行的/sbin/init 進程, 系統(tǒng)啟動時由init 解釋并行/etc/inittab, inittab 將指導 int 去調(diào)用一個系統(tǒng)初始化程序/etc/init.d/rcS。
etc 特定機器的配置文件以及用戶數(shù)據(jù)存放目錄, 其中的所有內(nèi)容是在內(nèi)核運行后, 由 Linuxrc 從/mnt/etc 拷貝得到的。
lib 文件系統(tǒng)上的程序所需的動態(tài)庫。
dev 驅(qū)動程序存放目錄, 可以在這里存放自己編寫的驅(qū)動程序。
usr 用于存放用戶程序和配置文件的目錄, 可以根據(jù)需要進行設置。目錄下的/usr/etc/rc.local 執(zhí)行本地所需要的初始化, 如安裝核心模塊, 進行網(wǎng)絡, 運行應用程序, 啟動圖形界面等。
4 移植最小Linux系統(tǒng)
4.1系統(tǒng)環(huán)境搭建
操作系統(tǒng): 物理機 windows 7
虛擬機軟件: VMware Workstation8.0
Linux版本: Ubuntu 11.10-i386-desktop
Linux內(nèi)核: Linux-2.6.36(Ubuntu 11.10是Linux-3.0.16的內(nèi)核)
Busybox: Busybox-1.1.3
交叉編譯工具: arm-Linux-gcc-3.4.1
CramFS: cramfs-1.1
4.2 構(gòu)建嵌入式交叉編譯環(huán)境
解壓交叉編譯工具文件夾后會生成一個文件名為3.4.1的文件夾。
然后,將解壓后的名字為3.4.1的文件復制到根目錄下的 usr/local/arm文件夾下。
在終端下修改/etc/bash.bashrc文件 #vim /etc/bash.bashrc
在最后加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
export PATH
然后在終端中輸入 #source /etc/bash.bashrc
4.3 系統(tǒng)移植步驟
(1)進行內(nèi)核的編譯與裁剪,然后生成bzImage 內(nèi)核鏡像。
(2)構(gòu)建交叉編譯環(huán)境。
(3)進行配置busybox,然后編譯安裝busybox。
(4)準備文件系統(tǒng)的目錄框架,創(chuàng)建設備文件,以及準備一些配置文件和系統(tǒng) 啟動時所需的文件。
(5)配置cramfs-1.1,編譯cramfs-1.1。
(6)生成CramFS的文件系統(tǒng)鏡像initrd.img。
(7)整合啟動文件 myOS。
(8)生成光盤鏡像文件 myiso.iso。
4.4 移植過程
4.4.1生成內(nèi)核鏡像
進入內(nèi)核文件夾 #cd usr/src/linux-2.6.36 進行內(nèi)核的配置與裁剪 。
# make mrproper
# make menuconfig。
在內(nèi)核配置中:
[ * ]---將該功能模塊編譯進內(nèi)核
[ ]---不將該功能模塊編譯進內(nèi)核
M ---將該功能編譯成模塊的方式,可以在需要時動態(tài)插入到內(nèi)核中的模塊,具體參數(shù)及選項含義內(nèi)核文檔里有明確說明。
配置完成后,選擇 Save an Alternate Configuration File,然后退出。
# make bzImage。
最終生成的內(nèi)核鏡像文件bzImage在/usr/src/linux-2.6.36/arch/X86/boot 內(nèi)。
4.4.2 編譯安裝busybox
進入busybox文件夾 #cd 001/busybox-1.1.3
修改Makefile #vim Makefile ,以下兩項改為:
CROSS_COMPILE = arm-Linux-
ARCH = arm ARCH
進入busybox配置界面 #make menuconfig ,busybox配置界面如圖1所示。
4.4.3 構(gòu)建文件系統(tǒng)目錄
#mkdir /mnt/myOS/rootfs #cd /mnt/myOS/rootfs
#mkdir etc usr var conf lib modules scripts
將busybox生成的鏈接文件復制到rootfs
#cp /001/busybox-1.1.3/_install/* /mnt/myOS/rootfs
將根文件下lib庫文件復制到rootfs/lib #cp -R /lib/* /mnt/myOs/rootfs/lib
4.4.4 配置CramFS
進入CramFS-1.1 #cd 001/cramfs-1.1 進行編譯CramFS #make
Make之后會產(chǎn)生兩個bin文件mkcramfs和cramfsck。
將這兩個bin文件復制到/usr/bin中 #cp mkcramfs cramfsck /usr/bin。
之后在終端中就可以使用mkcramfs和cramfsck命令了。
4.4.5 制作CramFS文件系統(tǒng)鏡像
在終端中輸入:
#mkcramfs /mnt/myOS/rootfs /mnt/myOS/initrd.img
這時在 /mnt/myOS 下會產(chǎn)生一個initrd.img文件系統(tǒng)鏡像文件。
4.4.6 制作iso鏡像
使用mkisofs命令制作iso鏡像文件。
#mkisofs -o myiso.iso -b isoLinux/isoLinux.bin -c isoLinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table mnt/myOS
這時,在根目錄下就會產(chǎn)生一個myiso.iso系統(tǒng)鏡像文件。
5 系統(tǒng)測試
首先將制作的好的myiso.iso系統(tǒng)鏡像文件復制到物理機內(nèi),然后通過虛擬機軟件進行啟動。
在啟動過程中首先是加載啟動引導文件——isolinux.bin,然后通過啟動引導文件調(diào)用啟動配置文件——isolinux.cfg中的相關配置信息。
接下來是加載內(nèi)核鏡像,這個過程很快,內(nèi)核加載完成后進行掛載文件系統(tǒng)(掛載文件系統(tǒng)如圖2所示)。
6 結(jié)語
Linux 內(nèi)核在系統(tǒng)啟動期間的最后操作之一就是掛載根文件系統(tǒng)。根文件系統(tǒng)是嵌入式Linux 系統(tǒng)不可或缺的重要組成部分, 而Busybox是制作嵌入式Linux根文件系統(tǒng)的有效工具。本文首先說明了Linux-2.6.36的內(nèi)核編譯與裁剪、Busybox的編譯與安裝、使用Busybox-1.1.3和cramfs-1.1制作CramFS根文件系統(tǒng)的詳細過程,然后使用了isolinux方式啟動系統(tǒng)內(nèi)核,掛載文件系統(tǒng)鏡像。經(jīng)過測試,內(nèi)核啟動成功,文件系統(tǒng)掛載成功,并且能夠?qū)崿F(xiàn)linux的基本命令,而未移植入動態(tài)鏈接的命令不能使用如du、ifconfig等。本文為移植和裁剪Linux以及想要構(gòu)造更為復雜的根文件系統(tǒng)提供了參考,同時為嵌入式Linux中CramFS根文件系統(tǒng)的移植實現(xiàn)進行了新的嘗試。
參考文獻
[1] 劉錟.Linux嵌入式系統(tǒng)開發(fā)平臺選型探討[J].單片機與嵌入式系統(tǒng)應用,2004,7(8).
[2] 魯剛,李小平.嵌入式Linux系統(tǒng)軟件平臺的建立[J].電子科技雜志,2007,8(12).
[3] 鞠劍平,冉全,黎曦.嵌入式Linux在S3C2440上的移植[J].科技資訊,2010,8.