歡迎您光臨本站 註冊首頁

Linux根文件系統的製作

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  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)有一篇寫的比較好的博文可以借鑒.


[火星人 ] Linux根文件系統的製作已經有851次圍觀

http://coctec.com/docs/linux/show-post-51253.html