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