1. 程式人生 > >一步步製作根檔案系統 (一)

一步步製作根檔案系統 (一)

                            開發環境:Ubuntu 12.04

                            開發板:mini2440  256M NandFlash   64M SDRAM

                             交叉編譯器:arm-linux-gcc 4.4.3 點此可下載

                             BusyBox版本:busybox-1.13.3  點此可下載

                            yaffs製作工具:mkyaffsimage

                            yaffs2製作工具:mkyaffs2image(適合64M)、mkyaffs2image-128(適合128M以上)

寫之前的羅嗦

     這幾天製作根檔案系統整得我夠嗆,畢竟是初學制作,各種不會,各種谷歌百度,害的我過情人節都在想著根檔案系統!之所以寫下來,主要是想把自己的製作過程記下來,防止以後工作了忘記了,二也是和大家分享,希望能對你有所幫助!本節先講理論知識,我倒是建議本節內容你可以大致瀏覽,做到“知道是這麼回事”的程度就可以了,在後續的製作過程中再結合實際來理解本節內容。要感謝一位DpLife的大哥啊,耐心的在QQ上給我啟示,排除問題原因,好人吶。

     不管是想要製作yaffs檔案,還是yaffs2,本文章都適合,只是最後使用不同的工具生成罷了。現在,開始吧!

主要參考書籍

   《嵌入式Linux應用程式開發完全手冊》

   《國嵌核心驅動進階教材》

檔案系統簡介

    理論上說一個嵌入式裝置如果核心能執行起來,且不需要使用者程序的話(估計這種情況很少),是不需要檔案系統的。檔案系統簡單的說就是一種目錄結構,由於linux作業系統的裝置在系統中是以檔案的形式存在(這個很關鍵奧!和win7的不同之處就在於linux的Everything is a File!),將這些檔案分類管理以及提供和核心互動的介面,就形成了一定的目錄結構也就是檔案系統。檔案系統是為使用者反映系統的一種形式,為使用者提供一個檢測控制系統的介面。

    而根檔案系統,就是一種特殊的檔案系統。那麼根檔案系統和普通的檔案系統有什麼區別呢?借用書上的話說就是,根檔案系統就是核心啟動時掛載的第一個

(第一個的意思就是不止一個吧,你看,區別出來了啊)檔案系統。由於根檔案系統是啟動時掛載的第一個檔案系統,那麼根檔案系統就要包括Linux啟動時所必須的目錄和關鍵性的檔案,例如Linux 啟動時都需要有使用者程序 init 對應的檔案,在Linux掛載分割槽時一定要會找 /etc/fstab這個掛載檔案等,根檔案系統中還包括了許多的應用程式,如 /bin目錄下的命令等。任何Linux啟動時所必須的檔案的檔案系統都可以稱為根檔案系統。

    Linux支援多種檔案系統,如包括 ext2、ext3、vfat、jffs、ramfs、yaffs 和nfs等,為了對各類檔案系統進行統一管理,Linux引入了虛擬檔案系統 VFS(可別小看這個VFS,它可是解決了linux啟動時的“雞生蛋,蛋生雞”的問題呢),為各類檔案系統提供一個統一的操作介面和應用程式介面。下圖為Linux檔案系統層次關係圖

   

Yaffs 檔案系統

   YAFFS(Yet Another Flash File System)檔案系統是專門為Nand Flash設計的檔案系統,與JFFS/JFFS2檔案系統有些類似,不同之處是 JFFS/JFFS2 檔案系統是專門為Nor Flash的應用場合設計的,而Nor Flash和Nand Flash本質上有較大的區別(壞塊、備用區、容量),所以儘管 JFFS/JFFS2檔案系統也能用與Nand Flash,但對於Nand Flash來說,通常不是最優方案(效能較低,啟動速度稍慢)。而YAFFS利用 NandFlash提供的每個頁面16位元組或64位元組的Spare區(OOB備用區)空間來存放ECC和檔案系統的組織資訊,能夠實現錯誤檢測和壞塊處理。這樣的設計充分考慮了NandFlash以頁面為存取單元的特點,將檔案組織成固定大小的資料段,能夠提高檔案系統的載入速度。

   YAFFS目前有yaffs、yaffs2兩個版本,一般來說,yaffs對小頁面(512B+16B/頁)的NandFlash(68M)有很好的支援,yaffs2對更大的頁面(2K+64B/頁)的NandFlash(128M、256M或者更大)支援更好。不得不說說這個yaffs和yaffs2,前幾天學習yaffs製作的時候,我一直以為它們兩個的區別蠻大的(確實有區別),但是後來才發現基本的製作過程是一樣的,不一樣的只是最後生成這兩個版本的工具不一樣!!!!yafffs由mkyaffsimage生成,而yaffs2由mkyaffs2image生成!

BusyBox簡介

   BusyBox是一個遵循 GPLv2協議(這是依照書上打的,我可不知道這什麼協議)的開源專案。有人將BusyBox比喻成Linux工具的瑞士軍刀,簡單的說就是Linux的一個大的工具集,包括了Linux中的大部分命令和工具。BusyBox中各種命令與相應的 GNU工具相比,所能提供的選項較少,但是能夠滿足一般應用。因此,BusyBox主要是為各種小型裝置或者嵌入式系統提供。你看,下圖就是利用BusyBox安裝在根檔案系統內的bin目錄下的命令。


   嵌入式根目錄下的bin,sbin和usr目錄中的命令以及啟動程式linuxrc通常就是通過BusyBox產生的。BusyBox產生的。BusyBox會根據配置的不同自動生成一些檔案,但是有些根檔案系統下的檔案還是需要使用者自己建立。

Linux 根檔案系統目錄結構

   為了在安裝軟體時能夠預知檔案、目錄的位置,為了讓使用者方便地找到不同型別的檔案,在構造檔案系統時,建議遵循FHS標準(File Hierarchy Standard,檔案系統層次標準)。它定義了檔案系統中目錄、檔案分類存放的原則,定義了系統執行時所需的最小檔案、目錄的集合,並列舉了不遵循這些原則的例外情況及其原因。FHS並不是一個強制的標準,但是大多的Linux、Unix發行版本都遵循FHS。

   Linux根檔案系統中一般有如圖2所示的幾個目錄,如下圖

  下面依次講述這幾個目錄的作用(很可能你會看煩,但是我保證,它真的需要你靜下心去理解,可以在製作的過程中再返回來看)

1、/bin 目錄

   該目錄下存放所有使用者(包括系統管理員和一般使用者)都可以使用的、基本的命令。

   /bin 目錄下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir等。

2、/sbin目錄

    該目錄下存放系統命令,即只有管理員能夠使用的命令、系統命令還可以存放在/usr/sbin、/usr/local/sbin目錄下。/sbin 目錄中存放的是基本的系統命令,它們用於啟動系統、修復系統等,與/bin目錄相似,在掛接其他檔案系統之前就可以使用 /sbin。

   /sbin目錄下常用的命令有:shutdown、reboot、fdisk、fsck等。

  不是急迫需要使用的命令存放在/usr/sbin目錄下。本地安裝的(Locally-installed)的系統命令存放在/usr/local/sbin目錄下。

3、/dev 目錄

   該目錄下存放的是裝置檔案。裝置檔案是Linux中特有的檔案型別,在Linux系統下,以檔案的方式訪問各種外設,即通過讀寫某個裝置檔案操作某個具體硬體。比如通過“/dev/ttySAC0”檔案可以操作串列埠0,通過“/dev/mtdblock1”可以訪問MTD裝置(NAND Flash、Nor Flash等)的第2個分割槽。在接下來利用uboot啟動的時候要設定入口引數   setenv bootargs "noinitrd root=/dev/mtdblock3 rootfsyle=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M",其中的就是mtdblock3,有的人可能會問為什麼是mtdblock3,而不是mtdblock2呢?這和你的nand flash分割槽有關,咱們在核心移植的時候將nandflash分成了4個區,如下


其中的root分割槽就是用來存放yaffs檔案系統的,對應的為/dev/mtdblock3!

   裝置檔案有兩種:字元裝置和塊裝置。裝置檔案可以使用mknod命令建立,詳細的就不講述了。

  /dev 的建立有3中方法:

  ① 手動建立

   在製作根檔案系統的時候,就在/dev 目錄下使用mknod命令建立好要使用的裝置檔案,比如ttySAC0等。系統掛接根檔案系統後,就可以使用/dev目錄下的裝置檔案了。但是這種方法只能使用已經建立好的裝置檔案,萬一我以後再插上優盤的時候,優盤這樣的裝置檔案豈不是不能用了?佛說:不好....不好....

  ② 使用devfs檔案系統。韋老師的書上說已經過時,我直接略過了。

  ③ udev

  udev 是個使用者程式(u是指user space,dev是指device),它能夠根據系統中硬體裝置的狀態更新裝置檔案,包括裝置檔案的建立、刪除等。使用udev機制也不需要在/dev 目錄下建立裝置節點,它需要一些使用者程式的支援,並且核心要支援sysfs檔案系統。它的操作相對複雜,但是靈活性很高。

  在 BusyBox中有一個mdev命令(注意,是命令奧),它是udev命令的簡化版本。適合於嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動態載入驅動程式時,自動產生驅動程式所需的節點檔案。在以busybox為基礎構建嵌入式linux的根檔案系統時,使用它是最優的選擇。我接下來的建立根檔案系統會用這種方法。