文件系統是包括在一個磁盤(包括光盤、軟盤、閃盤及其它存儲設備)或分區的目錄結構;一個可應用的磁盤設備能夠包含一個或多個文件系統;若是您想進入一個文件系統,首先您要作的是掛載(mount)文件系統;爲了掛載(mount)文件系統,您必須指定一個掛載點。html
注:對於咱們應用開發來講,購買開發板的時候,廠家會提供好現成的根文件系統和BootLoader等,若是須要,咱們能夠改變其中的命令而無需從頭開始製做一個新的根文件系統。不過這兒的製做過程可讓咱們更深一點理解Linux的文件系統。linux
* Linux 中,rootfs 是必不可少的。PC 上主要實現有 ramdisk 和直接掛載 HD(Harddisk,硬盤) 上的根文件系統;嵌入式中通常不從 HD 啓動,而是從 Flash 啓動,最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍複雜的就是 直接從Flash 讀取的 Cramfs,更復雜的是在 Flash 上分區,並構建 JFFS2 等文件系統。
* RAMDisk 將製做好的 rootfs 壓縮後寫入 Flash,啓動的時候由 Bootloader load 到RAM,解壓縮,而後掛載到 /。這種方法操做簡單,可是在 RAM 中的文件系統不是壓縮的,所以須要佔用許多嵌入式系統中稀有資源 RAM。
ramdisk 就是用內存空間來模擬出硬盤分區,ramdisk一般使用磁盤文件系統的壓縮存放在flash中,在系統初始化時,解壓縮到SDRAM並掛載根文件系統, 在linux系統中,ramdisk有二種,一種就是能夠格式化並加載,在linux內核2.0/2.2就已經支持,其不足之處是大小固定;另外一種是 2.4的內核才支持,經過,ramfs來實現,他不能被格式化,但用起來方便,其大小隨所須要的空間增長或減小,是目前linux經常使用的ramdisk技 術.
* initrd 是 RAMDisk 的格式,kernel 2.4 以前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大簡化了 Linux 的啓動過程,附合 Linux 的基本哲學:Keep it simple, stupid(KISS). 不過cpio-initrd 做爲新的格式,尚未通過普遍測試,嵌入式 Linux 中主要採用的仍是 image-initrd。
* Cramfs 是 Linus 寫的很簡單的文件系統,有很好的壓縮綠,也能夠直接從 Flash 上運行,不須 load 到 RAM 中,所以節約了 RAM。可是 Cramfs 是隻讀的,對於須要運行時修改的目錄(如: /etc, /var, /tmp)多有不便,所以,通常將這些目錄作成ramfs 等可寫的 fs。
* SquashFS 是對 Cramfs 的加強。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具備優點。不過,據開發者介紹,在性能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統採用以前,須要通過更多的測試。shell
RAMDisk的製做方法以下:網絡
(1) 在PC機的Linux操做系統環境下,生成能夠虛擬成塊設備的文件,假設文件名爲init.img。app
$ dd if=/dev/zero of=init.img bs=4096 count=1024工具
其中bs*count爲塊設備大小(單位:字節),生成init.img文件之後,還必須對該文件進行格式化。oop
$ mke2fs –m0 –F init.img性能
(2) 新建一個文件夾ram,並將init.img掛接到ram目錄。測試
$ mkdir ramui
$ mount init.img ram/ -o loop
這時,讀寫ram目錄,等效於讀寫init.img文件。用戶能夠將根文系統所需的文件寫入到ram目錄中。往ram目錄寫完文件之後,還須要使用umount ram命令卸載init.img,才能將已寫入的文件保存到init.img中。
(3)添加完畢,須要umount ram
CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任職時,所參與開發的文件系統。它是針對Linux內核2.4以後的版本所設計的一種新型只讀文件系統,採用了 zlib 壓縮,壓縮比通常能夠達到1:2,但仍能夠做到高效的隨機讀取,Linux系統中,一般把不須要常常修改的目錄壓縮存放,並在系統引導的時候再將壓縮文件 解開。由於Cramfs不會影響系統的讀取文件的速度,並且是一個高度壓縮的文件系統。所以很是普遍應用於嵌入式系統中。
在嵌入式的 環境之下,內存和外存資源都須要節約使用。若是使用RAMDISK方式來使用文件系統,那麼在系統運行以後,首先要把Flash上的映像文件解壓縮到內存 中,構造起RAMDISK環境,才能夠開始運行程序。可是它也有很致命的弱點。在正常狀況下,一樣的代碼不只在Flash中佔據了空間(以壓縮後的形式存 在),並且還在內存中佔用了更大的空間(以解壓縮以後的形式存在),這違背了嵌入式環境下儘可能節省資源的要求。
使用CramFS文件 系統就是一種解決這個問題的方式。CramFS是一個壓縮格式的文件系統,它並不須要一次性地將文件系統中的全部內容都解壓縮到內存之中,而只是在系統需 要訪問某個位置的數據的時候,立刻計算出該數據在CramFS中的位置,將它實時地解壓縮到內存之中,而後經過對內存的訪問來獲取文件系統中須要讀取的數 據。CramFS中的解壓縮以及解壓縮以後的內存中數據存放位置都是由CramFS文件系統自己進行維護的,用戶並不須要瞭解具體的實現過程,所以這種方 式加強了透明度,對開發人員來講,既方便,又節省了存儲空間。
可是Cramfs也有其缺點:延遲、小於16MB、不支持寫,只支持PAGE_CREATE_SIZE=4096的內核。
製做的命令:(root文件夾中存放着文件系統)
#mkcramfs root cramfs.img
製做yaffs文件系統:
mkyaffsimage myroots myroots.img
製做squashfs:
mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
6. BusyBox編譯以及移植(根文件系統內命令的製做移植)
[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
#! /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
建立 dev 中的節點
若是使用「linux 2.6.xx」的內核,應該事先建立節點「console」、「null」。不然在系統啓動時內容會提示如下錯誤:
Warning: unable to open an initial console.
Kernel panic - not syncing: Attempted to kill init!
建立節點的命令以下:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
進入到壓縮文件存放的目錄下,並解壓。而後進入解壓後的busybox目錄文件夾,隨後配置busybox 。
[root@190 busybox-1.2.0]# make menuconfig
執行以後,將出現以下圖所示的配置界面:
因爲每一個版本的配置選項組織有所不一樣。無論怎樣,咱們注意如下選項就好了:
1) Support for devfs
2) Build BusyBox as a static binary ( no shared libs ) //將busybox編譯成靜態連接
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腳本才能執行
7)ash
8)cp cat ls mkdir mv //可執行命令工具的選擇,本身看着辦吧,須要用到的就選上
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
以上內容必須選上,其餘可按默認值;若是要支持其餘功能,如網絡支持等,可按需選擇,英語不是很爛的話,這些都沒有問題。
配置好以後,保存退出。而後對其編譯和安裝到剛纔創建的根文件系統目錄下:
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install
安裝好以後,將相應的二進制文件拷貝到根文件系統相應的目錄下: