cramfs根文件系統的移植成功(fs2410下親測)
依據Unix的習慣,通常會(huì )將linux系統中任何對象(包括設備)都視為文件。而根文系統是所有文件和設備節點(diǎn)的起始點(diǎn),它是決定系統能否正常啟動(dòng)的關(guān)鍵所在。本文將詳細介紹利用Busybox工具集制作一種簡(jiǎn)單的根文件系統即Cramfs根文件系統的方法。
本文引用地址:http://dyxdggzs.com/article/201611/316934.htm2開(kāi)發(fā)平臺簡(jiǎn)介
開(kāi)發(fā)系統采用主機+目標板的開(kāi)發(fā)模式,目標板和主機通過(guò)串行線(xiàn)和Ethernet網(wǎng)線(xiàn)實(shí)現通信。主機采用的是:pc機+VMware6.0虛擬機下的Red Hat 9目標板:深圳優(yōu)龍公司開(kāi)發(fā)的FS2410實(shí)驗開(kāi)發(fā)板:其主要參數:CPU:三星S3C2410,主頻203MHz;內存:64M字節;NOR Flash:2M字節(SST39VF1601);NAND Flash:64M字節(K9F1208);嵌入式linux版本:linux2.4.18
根文件系統生成后用Boot Loader燒入開(kāi)發(fā)板的NAND Flash的2號分區運行(其地址為:offset 0x200000 , size 0x1e00000)。
3根文件系統的基本結構
嵌入式linux根文件系統的系統的頂層目錄各有其特殊的用法和目的。一般來(lái)說(shuō)嵌入式linux系統的根文件系統應該包含以下內容:
(1)能夠保證嵌入式linux系統中的大多數應用程序能夠正常運行的最小化目錄包括/bin/dev/etc/lib/proc/sbin/usr/tmp/var。如果用戶(hù)需要為多用戶(hù)提供可擴展環(huán)境還需建立以下目錄:/home/mnt/opt/root。
(2)根文件系統所需的基本鏈接庫:Glibc以及uClibc。
(3)基本的系統配置文件:rcS,inittab,fstab,linuxrc等腳本文件
(4)基本的設備文件:/dev/tty0/dev/ttyS0/dev/console
(5)基本的應用程序:如cd ,ls ,mv,cp等。
4使用Busybox制作Cramfs根文件系統
4.1Cramfs簡(jiǎn)介
Cramfs(Compressed Rom File System)是Linux Torvalds在Transmeta任職時(shí),所參與開(kāi)發(fā)的只具有最基本特性的文件系統。它是針對Linux內核2.4之后的版本所設計的一種新型只讀文件系統,采用了zlib壓縮,壓縮比一般可以達到1:2,但仍可以作到高效的隨機讀取,Linux系統中,通常把不需要經(jīng)常修改的目錄壓縮存放,并在系統引導的時(shí)候再將壓縮文件解開(kāi)。因為Cramfs不會(huì )影響系統的讀取文件的速度,而且是一個(gè)高度壓縮的文件系統。因此非常廣泛應用于嵌入式系統中。
在嵌入式的環(huán)境之下,內存和外存資源都需要節約使用。如果使用RAMDISK方式來(lái)使用文件系統,那么在系統運行之后,首先要把Flash上的映像文件解壓縮到內存中,構造起RAMDISK環(huán)境,才可以開(kāi)始運行程序。但是它也有很致命的弱點(diǎn)。在正常情況下,同樣的代碼不僅在Flash中占據了空間(以壓縮后的形式存在),而且還在內存中占用了更大的空間(以解壓縮之后的形式存在),這違背了嵌入式環(huán)境下盡量節省資源的要求。
而使用Cramfs文件系統可以很好的解決這個(gè)問(wèn)題。Cramfs是一個(gè)壓縮格式的文件系統,它并不需要一次性地將文件系統中的所有內容都解壓縮到內存之中,而只是在系統需要訪(fǎng)問(wèn)某個(gè)位置的數據的時(shí)候,馬上計算出該數據在Cramfs中的位置,將它實(shí)時(shí)地解壓縮到內存之中,然后通過(guò)對內存的訪(fǎng)問(wèn)來(lái)獲取文件系統中需要讀取的數據。Cramfs中的解壓縮以及解壓縮之后的內存中數據存放位置都是由Cramfs文件系統本身進(jìn)行維護的,用戶(hù)并不需要了解具體的實(shí)現過(guò)程,因此這種方式增強了透明度,對開(kāi)發(fā)人員來(lái)說(shuō),既方便,又節省了存儲空間。因此我們在開(kāi)發(fā)時(shí)選擇使用這種簡(jiǎn)單的Cramfs文件系統進(jìn)行根文件系統的移植。
4.2Busybox簡(jiǎn)介
Busybox是標準Linux工具的一個(gè)單個(gè)可執行實(shí)現。Busybox包含了一些簡(jiǎn)單的工具,例如cat和echo,還包含了一些更大、更復雜的工具,例如grep、find、mount以及telnet。有些人將Busybox稱(chēng)為L(cháng)inux工具里的瑞士軍刀.簡(jiǎn)單的說(shuō)Busybox就好像是個(gè)大工具箱,它集成壓縮了Linux的許多工具和命令。雖然Busybox中的這些工具相對于GNU工具有所簡(jiǎn)化,但卻很實(shí)用。Busybox在設計上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用模塊化設計,它采用了與linux內核配置菜單類(lèi)似的配置菜單,使得配置和裁剪變得相當簡(jiǎn)單。Busybox這種特性使得其非常適合于嵌入式系統的應用。幾乎所有的嵌入式Linux都使用Busybox作為工具。同時(shí),Busybox的安裝腳本使得它很容易建立基于Busybox的Linux根文件系統。本文就是通過(guò)使用Busybox這個(gè)強大的工具集來(lái)制作Cramfs根文件系統的。
4.3配置Busybox
Busybox的源代碼可以到官方網(wǎng)站http :/ / www.busybox. net/下載,我們使用的是深圳優(yōu)龍公司提供的源碼包busybox - 1. 00 - pre10. tar . bz2。注意使用版本不一定是越新越好,如果新的版本編譯后在目標板中無(wú)法正常啟動(dòng),可以試著(zhù)回到較老的版本。我們在開(kāi)發(fā)過(guò)程中最開(kāi)始使用的是busybox-1.1.3,結果生成的根文件系統無(wú)法再fs2410上正常啟動(dòng),換回busybox - 1. 00 - pre10則可以輕松解決這個(gè)問(wèn)題。
首先將busybox-1.00-pre10.tar.bz2拷貝到用戶(hù)家目錄:home/jixiang (busybox拷貝到什么目錄可以自行設定)。
[root@mynet jixiang]# cd /home/jixiang
[root@mynet jixiang]# tar vxjf busybox-1.00-pre10.tar.bz2
[root@mynet jixiang]# cd busybox-1.00-pre10
[root@mynet busybox-1.00-pre10]# make menuconfig
進(jìn)入配置菜單界面,我們做如下配置:
(1)在General Configuration中,一定要選擇“Support for devfs”選項,現在的Busybox新版本去掉了這個(gè)選項,不過(guò)應該可以通過(guò)修改配置文件加入。
圖1配置支持設備文件系統界面
(2)在Build Options選項中,選擇使用“靜態(tài)庫”以及設置交叉編譯工具的PREFIX。我使用的交叉編譯工具的路徑是:/usr/local/arm/3.3.2/bin。(具體情況因宿主機交叉編譯環(huán)境路徑不同做相應修改。
圖2配置靜態(tài)庫界面
(3)在Init Utilities選項中,“Support reading an inittab file”應該選中,這樣可以根據自己編寫(xiě)的inittab文件初始化;“Support running init from within an initrd ”應該選中,否則會(huì )提示非常困擾的“/bin/sh: cant access tty; job control turned off”的提示,盡管可以進(jìn)入控制臺命令行。
圖3腳本文件配置界面
(4)Another Bourne - like Shell→Choose your default shell (ash)→,這里應該選中默認shell :ash ,否則不會(huì )生成sh導致不能解釋腳本文件。
圖4 shell配置
(5)其他的配置可以根據自己開(kāi)發(fā)需要自行配置。
4.3編譯并安裝Busybox
配置完成后,退出保存(最好備份.config文件以供后用),然后開(kāi)始生成,執行make TARGET_ARCH=arm;此處的TARGET_ARCH是必須的。
[root@mynet busybox-1.00-pre10]# make TARGET_ARCH=arm
[root@mynet busybox-1.00-pre10]# make install
Busybox將在默認的PREFIX目錄- install下面生成bin、sbin、usr三個(gè)子目錄和一個(gè)鏈接文件linuxrc。
4.4準備生成cramfs文件系統
(1)創(chuàng )建一個(gè)文件夾rootfs,把_install目錄下生成的bin、sbin、usr三個(gè)目錄拷貝到rootfs,并且在rootfs目錄下建立其他子目錄。執行命令mkdir dev etc home lib mnt procsystmp var,建立相應的文件夾,再建立etc下的init.d文件夾。
(2)準備啟動(dòng)文件inittab、fstab、linuxrc、rcS。其中inittab、fstab放在etc目錄下面, rcS放在etc/ init.d/目錄下面,linuxrc放在rootfs目錄下面。
(3)簡(jiǎn)單的配置文件的編寫(xiě)
linuxrc文件:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/emptymk
#/bin/mount -t usbdevfs none /proc/bus/usb
exec /sbin/init
rcS文件:
#!/bin/sh
/bin/mount –a
fstab文件:
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
注意應該使得上述文件具有執行權限,可以使用chmod755來(lái)修改其權限。
4.5生成Cramfs根文件系統映像
我們使用的是優(yōu)龍提供的cramfs-1.1.tar.gz源碼包,用該工具生成根文件系統映像,
解壓后將mkcramfs放到宿主機Red Hat9的/bin目錄下。
轉到rootfs目錄的上級目錄執行:mkcramfsrootfstest.cramfs
5下載運行test.cramfs
將test.cramfs通過(guò)dnw下載到優(yōu)龍FS2410開(kāi)發(fā)板的nandflash中的文件分區(其地址為:offset 0x200000 , size 0x1e00000),文件系統正常啟動(dòng)。啟動(dòng)界面如圖:
NET: Registered protocol family 1
NET: Registered protocol family 17
VFS: Mounted root (cramfs filesystem) readonly.
Mounted devfs on /dev
Freeing init memory: 124K
mount /etc as ramfs
mount: /etc/mtab: No such file or directory
mount: /etc/mtab: Read-on
mount: /etc/mtab: No such file or directory
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
Please press Enter to activate this console.
BusyBox v1.00-pre10 (2009.09.01-12:23+0000) Built-in shell (ash)
Enter help for a list of built-in commands.
/ # ls
binetclibmntsbintmpvar
devhomelinuxrcprocsysusr
/ #
評論