利用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/目錄下的指令碼檔案,在此暫不作討論。