Linux根檔案系統的製作

來源:互聯網
上載者:User
1. 根檔案系統

檔案系統是包括在一個磁碟(包括光碟片、磁碟片、閃盤及其它存放裝置)或分區的目錄結構;一個可應用的磁碟裝置可以包含一個或多個檔案系統;如果您想進入一個檔案系統,首先您要做的是掛載(mount)檔案系統;為了掛載(mount)檔案系統,您必須指定一個掛載點。

註:對於我們應用開發來說,購買開發板的時候,廠家會提供好現成的根檔案系統和BootLoader等,如果需要,我們可以改變其中的命令而無需從頭開始製作一個新的根檔案系統。不過這兒的製作過程可以讓我們更深一點理解Linux的檔案系統。

2.主要的根檔案系統

* 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。這也是一種新方法,在嵌入式系統採用之前,需要經過更多的測試。

3.Ramdisk製作

RAMDisk的製作方法如下:

        (1) 在PC機的Linux作業系統環境下,產生可以虛擬成塊裝置的檔案,假設檔案名稱為init.img。

$ dd if=/dev/zero of=init.img bs=4096 count=1024

        其中bs*count為塊裝置大小(單位:位元組),產生init.img檔案以後,還必須對該檔案進行格式化。

$ mke2fs –m0 –F init.img

        (2) 建立一個檔案夾ram,並將init.img掛接到ram目錄。

$ mkdir ram

$ mount init.img ram/ -o loop

  這時,讀寫ram目錄,等效於讀寫init.img檔案。使用者可以將根文系統所需的檔案寫入到ram目錄中。往ram目錄寫完檔案以後,還需要使用umount ram命令卸載init.img,才能將已寫入的檔案儲存到init.img中。

      (3)添加完畢,需要umount ram

4. Cramfs製作

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

5. 其他根檔案系統的製作

     製作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

進入etc/init.d目錄下,建立一個指令檔,並命名為rcS,用gedit開啟,添加如下內容:

#! /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目錄檔案夾,隨後配置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

安裝好之後,將相應的二進位檔案拷貝到根檔案系統相應的目錄下:

  • 拷貝一些管理員控製程序到/sbin目錄下,最重要的就是要包含一個init命令;
  • 拷貝應用程式運行時所需要的庫到/lib,庫檔案可以從PC機上的交叉編譯工具安裝目錄下拷貝,如libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,為部分相應庫建立捷徑,提供一些應用程式按捷徑名稱調用。值得注意的是C庫要採用C庫的版本glibc, glibc位於/lib/libc.so.6

這兒(http://blog.chinaunix.net/u1/34474/showart_485837.html)有一篇寫的比較好的博文可以借鑒。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.