時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
1. 根文件系統(tǒng)
文件系統(tǒng)是包括在一個(gè)磁盤(包括光盤、軟盤、閃盤及其它存儲設(shè)備)或分區(qū)的目錄結(jié)構(gòu);一個(gè)可應(yīng)用的磁盤設(shè)備可以包含一個(gè)或多個(gè)文件系統(tǒng);如果您想進(jìn)入一個(gè)文件系統(tǒng),首先您要做的是掛載(mount)文件系統(tǒng);為了掛載(mount)文件系統(tǒng),您必須指定一個(gè)掛載點(diǎn)。
注:對于我們應(yīng)用開發(fā)來說,購買開發(fā)板的時(shí)候,廠家會(huì)提供好現(xiàn)成的根文件系統(tǒng)和BootLoader等,如果需要,我們可以改變其中的命令而無需從頭開始制作一個(gè)新的根文件系統(tǒng)。不過這兒的制作過程可以讓我們更深一點(diǎn)理解Linux的文件系統(tǒng)。
2.主要的根文件系統(tǒng)
* Linux 中,rootfs 是必不可少的。PC 上主要實(shí)現(xiàn)有 ramdisk 和直接掛載 HD(Harddisk,硬盤) 上的根文件系統(tǒng);嵌入式中一般不從 HD 啟動(dòng),而是從 Flash 啟動(dòng),最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍復(fù)雜的就是 直接從Flash 讀取的 Cramfs,更復(fù)雜的是在 Flash 上分區(qū),并構(gòu)建 JFFS2 等文件系統(tǒng)。
* RAMDisk 將制作好的 rootfs 壓縮后寫入 Flash,啟動(dòng)的時(shí)候由 Bootloader load 到RAM,解壓縮,然后掛載到 /。這種方法操作簡單,但是在 RAM 中的文件系統(tǒng)不是壓縮的,因此需要占用許多嵌入式系統(tǒng)中稀有資源 RAM。
ramdisk 就是用內(nèi)存空間來模擬出硬盤分區(qū),ramdisk通常使用磁盤文件系統(tǒng)的壓縮存放在flash中,在系統(tǒng)初始化時(shí),解壓縮到SDRAM并掛載根文件系統(tǒng), 在linux系統(tǒng)中,ramdisk有二種,一種就是可以格式化并加載,在linux內(nèi)核2.0/2.2就已經(jīng)支持,其不足之處是大小固定;另一種是 2.4的內(nèi)核才支持,通過,ramfs來實(shí)現(xiàn),他不能被格式化,但用起來方便,其大小隨所需要的空間增加或減少,是目前l(fā)inux常用的ramdisk技術(shù).
* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大簡化了 Linux 的啟動(dòng)過程,附合 Linux 的基本哲學(xué):Keep it simple, stupid(KISS). 不過cpio-initrd 作為新的格式,還沒有經(jīng)過廣泛測試,嵌入式 Linux 中主要采用的還是 image-initrd。
* Cramfs 是 Linus 寫的很簡單的文件系統(tǒng),有很好的壓縮綠,也可以直接從 Flash 上運(yùn)行,不須 load 到 RAM 中,因此節(jié)約了 RAM。但是 Cramfs 是只讀的,對于需要運(yùn)行時(shí)修改的目錄(如: /etc, /var, /tmp)多有不便,因此,一般將這些目錄做成ramfs 等可寫的 fs。
* SquashFS 是對 Cramfs 的增強(qiáng)。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有優(yōu)勢。不過,據(jù)開發(fā)者介紹,在性能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統(tǒng)采用之前,需要經(jīng)過更多的測試。
3.Ramdisk制作
RAMDisk的制作方法如下:
(1) 在PC機(jī)的Linux操作系統(tǒng)環(huán)境下,生成可以虛擬成塊設(shè)備的文件,假設(shè)文件名為init.img。
$ dd if=/dev/zero of=init.img bs=4096 count=1024
其中bs*count為塊設(shè)備大。▎挝唬鹤止(jié)),生成init.img文件以后,還必須對該文件進(jìn)行格式化。
$ mke2fs –m0 –F init.img
(2) 新建一個(gè)文件夾ram,并將init.img掛接到ram目錄。
$ mkdir ram
$ mount init.img ram/ -o loop
這時(shí),讀寫ram目錄,等效于讀寫init.img文件。用戶可以將根文系統(tǒng)所需的文件寫入到ram目錄中。往ram目錄寫完文件以后,還需要使用umount ram命令卸載init.img,才能將已寫入的文件保存到init.img中。
。3)添加完畢,需要umount ram
4. Cramfs制作
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不會(huì)影響系統(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é)省了存儲空間。
但是Cramfs也有其缺點(diǎn):延遲、小于16MB、不支持寫,只支持PAGE_CREATE_SIZE=4096的內(nèi)核。
制作的命令:(root文件夾中存放著文件系統(tǒng))
#mkcramfs root cramfs.img
5. 其他根文件系統(tǒng)的制作
制作yaffs文件系統(tǒng): mkyaffsimage myroots myroots.img
制作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
#p#副標(biāo)題#e#
6. busybox編譯以及移植(根文件系統(tǒng)內(nèi)命令的制作移植)
建立目標(biāo)板空根目錄文件夾及根目錄下的文件夾:
[root@190 friendly-arm]# mkdir myroots
[root@190 friendly-arm]#pwd
/friendly-arm/myroots
[root@190 friendly-arm]#cd myroots
[root@190 myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var
[root@190 myroots]# mkdir etc/init.d
進(jìn)入etc/init.d目錄下,建立一個(gè)腳本文件,并命名為rcS,用gedit打開,添加如下內(nèi)容:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
創(chuàng)建 dev 中的節(jié)點(diǎn)
如果使用"linux 2.6.xx"的內(nèi)核,應(yīng)該事先創(chuàng)建節(jié)點(diǎn)"console"、"null"。否則在系統(tǒng)啟動(dòng)時(shí)內(nèi)容會(huì)提示以下錯(cuò)誤:
Warning: unable to open an initial console.Kernel panic - not syncing: Attempted to kill init!
創(chuàng)建節(jié)點(diǎn)的命令如下:
# mknod dev/console c 5 1# mknod dev/null c 1 3
移植Busybox:
進(jìn)入到壓縮文件存放的目錄下,并解壓。然后進(jìn)入解壓后的busybox目錄文件夾,隨后配置busybox 。
[root@190 busybox-1.2.0]# make menuconfig
執(zhí)行之后,將出現(xiàn)如下圖所示的配置界面:
由于每個(gè)版本的配置選項(xiàng)組織有所不同。不管怎樣,我們注意以下選項(xiàng)就行了:
1) Support for devfs
2) Build BusyBox as a static binary ( no shared libs ) //將busybox編譯成靜態(tài)鏈接
3) Do you want to build busybox with a Cross Compile?
(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉編譯器
4) init
5) Support reading an inittab file //支持init讀取/etc/inittab 配置文件
6) (X) ash選中ash //建立的rcS腳本才能執(zhí)行
7)ash
8)cp cat ls mkdir mv //可執(zhí)行命令工具的選擇,自己看著辦吧,需要用到的就選上
9) mount
10) umount
11) Support loopback mounts
12) Support for the old /etc/mtab file
13) insmod
14) Support version 2.2.x to 2.4.x Linux kernels
15) Support version 2.6.x Linux kernels
16) vi
17)don’t use user
以上內(nèi)容必須選上,其他可按默認(rèn)值;如果要支持其他功能,如網(wǎng)絡(luò)支持等,可按需選擇,英語不是很爛的話,這些都沒有問題。
配置好之后,保存退出。然后對其編譯和安裝到剛才建立的根文件系統(tǒng)目錄下:
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install
安裝好之后,將相應(yīng)的二進(jìn)制文件拷貝到根文件系統(tǒng)相應(yīng)的目錄下:
* 拷貝一些管理員控制程序到/sbin目錄下,最重要的就是要包含一個(gè)init命令;
* 拷貝應(yīng)用程序運(yùn)行時(shí)所需要的庫到/lib,庫文件可以從P
關(guān)鍵詞標(biāo)簽:Linux,根文件系統(tǒng)
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠(yuǎn)程會(huì)話GNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址linux tc實(shí)現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務(wù)器硬盤IO讀寫負(fù)載