1. 程式人生 > >利用busybox和mkfs.jffs2製作根檔案系統

利用busybox和mkfs.jffs2製作根檔案系統

PC機系統:Ubuntu 12.04 LTS

目標板:海思3518C

Flash型別:SPI Flash(16M)

Busybox:BusyBox-1.16.1.tgz

嵌入式交叉編譯工具鏈:arm-hisiv100nptl-linux-gcc

目標板根檔案系統格式:JFFS2(在快閃記憶體上使用非常廣泛的讀/寫檔案系統)

根檔案系統製作工具:mkfs.jffs2

 

一、mkfs.jffs2工具使用說明:

mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS]

示例:

mkfs.jffs2 -r rootfs -o rootfs_64k.jffs2 -e 0x20000 --pad=0x1000000 -s 0x800 -n

Options:

-p,--pad[=SIZE]  用16進位制來表示所要輸出檔案的大小,也就是root.jffs2的size。                                        很重要的是,為了不浪費flash空間, 這個值最好符合flash driver所規劃的區域大小。                                         如果不足則使用0xff來填充補滿。 

-r, -d, --root=DIR         指定要做成image的源資料夾.(預設:當前資料夾)

-s, --pagesize=SIZE      節點頁大小(預設: 4KiB)

-e, --eraseblock=SIZE    設定擦除塊的大小為(預設: 64KiB)

-c, --cleanmarker=SIZE   Size of cleanmarker (default 12)

-m, --compr-mode=MODE     選擇壓縮模式 (default: priortiry)

-x, --disable-compressor=COMPRESSOR_NAME 禁用壓縮

-X, --enable-compressor=COMPRESSOR_NAME 啟用指定的壓縮工具

-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME

                                      設定所指定的壓縮工具的優先順序

-L, --list-compressors           列出所有可用的壓縮工具

-t, --test-compression   Call decompress and compare with the original (for test)

-n, --no-cleanmarkers          指明不新增清除標記(nand flash 有自己的校檢塊,存放相關的資訊。)

    注:如果掛載後會出現類似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,則加上-n 就會消失。

-o, --output=FILE            指定輸出image檔案的檔名(default: stdout)

-l, --little-endian                   指定使用小端格式

-b, --big-endian                   指定使用大端格式

-D, --devtable=FILE               使用指定的檔案作為一種裝置tablefile-f, --faketime                 Change all file times to '0' for regression testing

-q, --squash  Squash permissions and owners making all files be owned by root

-U, --squash-uids           將所有檔案的擁有者設為root使用者

-P, --squash-perms                   Squash permissions on all files

    --with-xattr             stuff all xattr entries into image

    --with-selinux         stuff only SELinux Labels into jffs2 image

    --with-posix-acl     stuff only POSIX ACL entries into jffs2 image

-h, --help                                  顯示這些文字

-v, --verbose                               Verbose operation

-V, --version                               顯示版本

-i, --incremental=FILE      Parse FILE and generate appendage output for it

二、利用BusyBox-1.16.1版本來製作根檔案系統:

1、獲取BusyBox原始碼:

從海思提供的SDK包中得到BusyBox原始碼包。

tar -xvf busybox-1.16.1.tgz

cd busybox-1.16.1 

2、配置和編譯BusyBox:

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig

//以圖形介面進行選擇配置

注意:

在 Busybox Settings ---> Build Options 中注意下面兩個選項:

[*]Build BusyBox as a static binary (no shared libs)

(arm-hisiv100nptl-linux-) Cross Compiler prefix

其中:

前者選項用於是否把 busybox 編譯成靜態連結的可執行檔案。如果選擇該選項,編譯出來的 busybox 就是靜態連結的,執行時不依賴於動態庫,但體積較大;清除該選項將得到動態連結的 busybox,體積較小,但需要動態庫的支援。

後者選項是用於選擇 SDK 推薦的交叉編譯器。

 

配置好後儲存並退出。

這個步驟中,可以對busybox進行裁剪,根據實際需要裁剪掉某些命令或者庫,可以減小映象檔案的大小。 

3、 編譯和安裝 busybox:

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux-  //編譯。

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- install //安裝。

編譯並安裝成功後,在 busybox 目錄下的_install 目錄下生成以下目錄及檔案:


drwxr-xr-x  2 root root 4096  4月 16 15:21 bin/

lrwxrwxrwx  1 root root   11  4月 16 15:21 linuxrc -> bin/busybox*

drwxr-xr-x  2 root root 4096  4月 16 15:21 sbin/

drwxr-xr-x  4 root root 4096  4月 15 23:56 usr/

4、製作根檔案系統:

我製作根檔案系統的具體操作步驟如下:

4.1、建立rootfs目錄:

mkdir rootfs

cd rootfs/

4.2、從BusyBox中獲取相應資料夾到rootfs中:

cp -rfa ../busybox/busybox-1.16.1/_install/* .

4.3、建立檔案系統中常用的目錄:

mkdir etc dev lib tmp var mnt home proc tmpfs

4.4、獲取系統依賴庫:

注意此步驟獲取的是SDK開發包中對應的交叉編譯工具鏈目錄下的lib目錄下的so庫。如果用錯了系統依賴的庫,會導致只有BusyBox編譯出來的命令可以正常執行,而你自己的使用者態程式執行時報錯:Input/Output error。

4.5、獲取其它工具:

一般SDK中會包含有除busybox以外的公用應用工具如udev、使用者層呼叫的驅動介面工具等,如海思的himount、btools等。這些工具可以在SDK包中找到相應對應原始碼,根據說明文件進行交叉編譯之後得到可執行的bin檔案,拷貝到rootfs/bin/目錄下即可。

4.6、新增系統執行所需要的模組驅動:

從SDK開發包中找到應用示例目錄,如samples,其中包含有系統各個常用模組的驅動,把這些檔案拷貝到rootfs/lib/modules/目錄下即可。

4.7、獲取使用者程式執行所依賴的庫:

從SDK開發包中找到應用示例目錄,如samples,其中包含有使用者態程式執行時所依賴的動態庫檔案,把這些檔案拷貝到rootfs/usr/lib/目錄下即可。

4.8、生成根檔案系統映象:

cd ../

mkfs.jffs2 -d ./rootfs -l -e 0x10000 -o rootfs_64k.jffs2

到此,就生成了一個初級的rootfs.jffs2根檔案系統映象檔案了。

補充說明:

嵌入式常用檔案系統如:SquashFS、JFFS2、NFS、YAFFS2。

各自特點:

SquahFS和JFFS2具有良好的空間特性,很適合作嵌入式檔案系統。

SquahFS為只讀檔案系統。

JFFS2為可讀可寫的檔案系統。

NFS檔案系統適合於開發初期的除錯階段。

YAFFS2檔案系統只適用於NAND Flash。

 

4.9、燒錄根檔案系統rootfs.jffs2到SPI Flash中:

sf probe 0 //對 SPI Flash 進行初始化設定

sf erase 0x400000 0xc00000 //首先擦除 FLASH 的檔案系統分割槽,從0x400000地址開始,擦除大小為0xc00000(12M)。

mw.b 0x82000000 0xff 0xc00000

tftp 0x82000000 rootfs_64k.jffs2 //將 rootfs_64k.jffs2 檔案下載到記憶體0x82000000處。

sf write 0x82000000 0x400000 0xc00000 //把檔案系統從記憶體寫入SPI FLASH中0x400000地址起始處,大小為0xc00000(12M)。 

reset //重啟

如果各步驟製作的映象沒有問題,至此重啟後,裝置即會進入到自己製作的檔案系統中。

以上生成的根檔案系統是一個裸的檔案系統,沒有做相應功能的部署。

如果要對檔案系統部署,可以根據實際需求來靈活修改/etc/init.d/rcS和/etc/init.d/目錄下的指令碼檔案,在此暫不作討論。