Hi3516A开发--根文件系统
下面的指令 ?注意檢查 - ,應該為英文的,而不是中文的。
例如: mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img
應為 -d,而非?–d ,不再一一改了,請注意!!
一、根文件系統(tǒng)簡介
Linux 的目錄結(jié)構(gòu)的最頂層是一個被稱為“ /”的根目錄。系統(tǒng)加載 Linux 內(nèi)核之后,就會掛載一個設備到根目錄上。存在于這個設備中的文件系統(tǒng)被稱為根文件系統(tǒng)。所有的系統(tǒng)命令、系統(tǒng)配置以及其他文件系統(tǒng)的掛載點都位于這個根文件系統(tǒng)中。根文件系統(tǒng)通常存放于內(nèi)存和 Flash 中,或是基于網(wǎng)絡的文件系統(tǒng)。根文件系統(tǒng)中存放了嵌入式系統(tǒng)使用的所有應用程序、庫以及其他需要用到的服務。 下圖列出了根文件系統(tǒng)的頂層目錄。
通用的 Linux 系統(tǒng)的根文件系統(tǒng)中會包括根文件系統(tǒng)頂層目錄結(jié)構(gòu)圖中所有的目錄,不過在嵌入式系統(tǒng)中,需要精簡根文件系統(tǒng)。部分可以被忽略的目錄如表 4-1 所示。表4-1 嵌入式系統(tǒng)中可忽略的目錄說明
在SDK軟件包內(nèi)帶有rootfs_uclibc根文件系統(tǒng)
在SDK軟件包imge_ulibc目錄下有各種類型根文件鏡像
二、利用busybox制作根文件系統(tǒng)
利用 busybox 制作根文件系統(tǒng)需要先獲取 busybox 源代碼,然后配置、編譯和安裝busybox,操作成功后開始制作根文件系統(tǒng)。
1、獲取 busybox 源代碼
成功安裝 SDK 后, busybox 完整源代碼就存放在 /osdrv/opensource/busybox/目錄中。要獲取 busybox 源代碼也可以從網(wǎng)站 http://www.busybox.net 下載。
2、配置 busybox
A、進入 busybox 所在目錄,進行配置操作需要輸入如下命令:
cd?osdrv/opensource/busybox/busybox-1.20.2
cp config_v300_soft .config
B、執(zhí)行 make menuconfig
busybox 的配置界面和內(nèi)核配置相似,其功能選項容易理解,可以根據(jù)自己的需求選擇配置。在 Busybox Settings ---> Build Options 中注意下面兩個選項:
[*]Build BusyBox as a static binary (no shared libs)
[*] Build with Large File Support (for accessing files > 2 GB)
(arm-hisiv300-linux-) Cross Compiler prefix
() Path to sysroot
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional CFLAGS
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional
LDFLAGS
() Additional LDLIBS
其中:
?第一個選項選擇是否把 busybox 編譯成靜態(tài)鏈接的可執(zhí)行文件。如果選擇該選項,編譯出來的 busybox 就是靜態(tài)鏈接的,運行時不依賴于動態(tài)庫,但體積較大;清除該選項將得到動態(tài)鏈接的 busybox,體積較小,但需要動態(tài)庫的支持。
第二個選項是用于選擇 SDK 推薦的交叉編譯器,配置好后保存并退出。欲了解 busybox 各選項含義請參考 busybox 配置幫助。
C、進入Makefile 修改
vi Makefile
164 CROSS_COMPILE ?= arm-hisiv300-linux-
190 ARCH ?= arm?
3、編譯和安裝 busybox
編譯和安裝 busybox 的具體操作如下:
hisilicon$ make
hisilicon$ make install
編譯并安裝成功后,在 busybox 目錄下的_install 目錄下生成以下目錄及文件:
drwxr-xr-x 2 lnan lnan 4096 2014-05-23 14:37 bin
lrwxrwxrwx 1 lnan lnan 11 2014-05-23 14:37 linuxrc -> bin/busybox
drwxr-xr-x 2 lnan lnan 4096 2014-05-23 14:37 sbin
drwxr-xr-x 4 lnan lnan 4096 2014-05-23 14:37 usr
4、制作根文件系統(tǒng)
用戶如有需要可在 busybox 的基礎(chǔ)上制作根文件系統(tǒng),制作根文件系統(tǒng)的具體操作步驟如下:
步驟 1.?
mkdir rootbox
cd rootbox
cp ../busybox-1.20.2/_install/. ./ -frd
mkdir etc dev lib tmp var mnt home proc
步驟 2.?
配置 etc、 lib、 dev 目錄的必需文件。
A、etc 目錄可參考系統(tǒng)/etc 下的文件。其中最主要的文件包括 inittab、 fstab、 init.d/rcS文件等,這些文件最好從 busybox 的 examples 目錄下拷貝過來,根據(jù)需要自行修改。
B、dev 目錄下的設備文件,可以直接從系統(tǒng)中拷貝過來或者使用 mknod 命令生成需要的設備文件??截愇募r請使用 cp –R file,例如:
在dev目錄下創(chuàng)建兩個設備文件 ?
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo chmod 666 dev/console
sudo chmod 666 dev/null
C、 lib 目錄是存放應用程序所需要的庫文件,請根據(jù)應用程序需要拷貝相應的庫文件。
完成以上兩個步驟,一個完整的根文件系統(tǒng)就生成了。
說明:
SDK 軟件包中已經(jīng)包括配置好的完整的根文件系統(tǒng),如果無特別需求,可直接使用。要添加自己開發(fā)的應用程序,只需將應用程序和相應的庫文件拷貝到根文件系統(tǒng)的對應目錄即可。
三、文件系統(tǒng)簡介
嵌入式系統(tǒng)中常用文件系統(tǒng)包括有 cramfs、 JFFS2、 NFS、 initrd、 yaffs2 以及squashfs。它們的特點如下:
cramfs 和 JFFS2 具有好的空間特性,很適合嵌入式產(chǎn)品應用。
cramfs 與 squashfs 為只讀文件系統(tǒng)。
squashfs 壓縮率最高。
JFFS2 為可讀寫文件系統(tǒng)。
NFS 文件系統(tǒng)適用于開發(fā)初期的調(diào)試階段。
yaffs2 文件系統(tǒng)只用于 NAND Flash。
initrd 采用 cramfs 文件系統(tǒng),為只讀。
在/osdrv/tools/pc目錄下有各種文件系統(tǒng)鏡像生成工具。通過make編譯可生成。
cramfs_tool ?jffs2_tool ?lzma_tool ?mkimage_tool ?mkyaffs2image ?nand_production ?
squashfs4.2 ?ubifs_config ?uboot_tools ?zlib
注意:下面制作鏡像時需要將鏡像工具放在/usr/bin目錄下,并給以權(quán)限,否則會出現(xiàn)“找不到命令”。
1、cramfs
cramfs 是針對 Linux 內(nèi)核 2.4 之后的版本所設計的一種新型文件系統(tǒng),使用簡單,加載容易,速度快。
cramfs 的優(yōu)缺點如下:
優(yōu)點:
將文件數(shù)據(jù)以壓縮形式存儲,在需要運行時進行解壓縮,能節(jié)省 Flash 存儲空間。
缺點:
由于它存儲的文件是壓縮的格式,所以文件系統(tǒng)不能直接在 Flash 上運行。同時,文件系統(tǒng)運行時需要解壓數(shù)據(jù)并拷貝至內(nèi)存中,在一定程度上降低讀取效率。另外 cramfs 文件系統(tǒng)是只讀的。如果想要在單板運行的 Linux 中提供 cramfs 的能力,必須要在編譯內(nèi)核時把 cramfs 的選項加入。在 make menuconfig 后,進入“ File>systems”,選擇“ miscellaneous?filesystems”,最后選中其中的“ Compressed ROM file system support”( SDK 里提供的內(nèi)核默認已經(jīng)選擇了該文件系統(tǒng)的支持)。
mkfs.cramfs 是用來制作 cramfs 文件系統(tǒng)映象的工具。通過這個工具處理已經(jīng)制作好的根文件系統(tǒng),就可以生成 cramfs 文件系統(tǒng)的映象(這類似于我們把光盤制作成 ISO 文件映像)。具體操作如下所示:
hisilicon$mkfs.cramfs ./rootbox ./cramfs-root.img
其中, rootbox 是之前已經(jīng)制作好的根文件系統(tǒng), cramfs-root.img 是生成的 cramfs 文件系統(tǒng)映像文件。
2、JFFS2
JFFS2 是 RedHat 的 David Woodhouse 在 JFFS 基礎(chǔ)上改進的文件系統(tǒng),是用于微型嵌入式設備的原始閃存芯片的實際文件系統(tǒng)。 JFFS2 文件系統(tǒng)是日志結(jié)構(gòu)化的可讀寫的文件系統(tǒng)。
JFFS2 的優(yōu)缺點如下:
優(yōu)點:
使用了壓縮的文件格式。最重要的特性是可讀寫操作。
缺點:
JFFS2 文件系統(tǒng)掛載時需要掃描整個 JFFS2 文件系統(tǒng),因此當 JFFS2 文件系統(tǒng)分區(qū)增大時,掛載時間也會相應的變長。使用 JFFS2 格式可能帶來少量的 Flash 空間的浪費。這主要是由于日志文件的過度開銷和用于回收系統(tǒng)的無用存儲單元,浪費的空間大小大致是若干個數(shù)據(jù)段。 JFFS2 的另一缺點是當文件系統(tǒng)已滿或接近滿時, JFFS2 運行速度會迅速降低。這是因為垃圾收集的問題。
加載 JFFS2 文件系統(tǒng)時的步驟如下:
步驟 1. 掃描整個芯片,對日志節(jié)點進行校驗,并且將日志節(jié)點全部裝入內(nèi)存緩存。
步驟 2. 對所有日志節(jié)點進行整理,抽取有效的節(jié)點并整理出文件目錄信息。
步驟 3. 找出文件系統(tǒng)中無效節(jié)點并且將它們刪除。
步驟 4. 最后整理內(nèi)存中的信息,將加載到緩存中的無效節(jié)點釋放。
由此可以看出雖然這樣能有效地提高系統(tǒng)的可靠性,但是在一定程度上降低了系統(tǒng)的速度。尤其對于較大的閃存芯片,加載過程會更慢。為了使內(nèi)核支持 JFFS2 文件系統(tǒng),必須在編譯內(nèi)核時把 JFFS2 的選項加入(我們發(fā)布的內(nèi)核默認已經(jīng)加入了支持)。在 make menuconfig 后,進入“ File>systems”,選擇“ miscellaneous filesystems”,最后選中其中的“ Journalling Flash File System v2 (JFFS2)?support”選項( SDK 里面提供的內(nèi)核默認已經(jīng)選擇了該文件系統(tǒng)的支持)。
JFFS2 的制作方法為:
hisilicon$mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img
其中, mkfs.jffs2 工具可以從互聯(lián)網(wǎng)中下載,也可以在 SDK 包中找到。 rootbox 為之前已經(jīng)制作好的根文件系統(tǒng)。參數(shù)說明如表 4-2 所示。
spi flash使用jffs2格式的鏡像,制作jffs2鏡像時,需要用到spi flash的塊大小。這些信息會在uboot啟動時會打印出來。建議使用時先直接運行mkfs.jffs2工具,根據(jù)打印信息填寫相關(guān)參數(shù)。下面以塊大小為256KB為例:
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x40000 -o osdrv/pub/rootfs_uclibc_256k.jffs2
或者
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2
| 參數(shù) ? ? ? ? ?? | ? ? ? 說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| d | 指定根文件系統(tǒng) |
| i | Little-endian小端模式 |
| e | Flash的塊大小 |
| o | 輸出映像文件 |
問題1:在編譯mkfs.jffs2 時出現(xiàn)如下錯誤:
compr_zlib.c:39:18: fatal error: zlib.h: 沒有那個文件或目錄
解決方法:?sudo apt-get install zlib1g-dev:
3、yaffs2
yaffs2 是專門為 NAND Flash 設計的嵌入式文件系統(tǒng)。它是日志結(jié)構(gòu)的文件系統(tǒng),提供了損耗平衡和掉電保護,可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。
yaffs2 的優(yōu)缺點如下:
優(yōu)點:
專門針對 NAND Flash,軟件結(jié)構(gòu)得到優(yōu)化,速度快。使用硬件的 spare area 區(qū)域存儲文件組織信息,啟動時只需掃描組織信息,啟動比較快。采用多策略垃圾回收算法,能夠提高垃圾回收的效率和公平性,達到損耗平衡的目的。
缺點:
沒有采用壓縮的文件格式。當包含的內(nèi)容相同時, yaffs2 鏡像文件要比 jffs2 鏡像文件大。yaffs2 文件系統(tǒng)在 SDK 中作為一個模塊提供。只需在 yaffs2 代碼中的 Makefile 中加入所依賴的內(nèi)核代碼路徑,進行編譯,即可生成 yaffs2 文件系統(tǒng)模塊。
yaffs2 鏡像文件的制作和 cramfs 相同,即通過工具制作,只需簡單的幾個參數(shù),具體如下:
hisilicon$ mkyaffs2image ./rootbox yaffs2-root.img pagesize ecctype
其中, rootbox 是之前已經(jīng)制作好的根文件系統(tǒng), yaffs2-root.img 是生成的 yaffs2 文件系統(tǒng)鏡像文件, pagesize 是單板上焊接 NAND Flash 器件的頁大小, ecctype 是單板上焊接 NAND Flash 器件的 ecc 類型。
nand flash使用yaffs2格式的鏡像,制作yaffs2鏡像時,需要用到nand flash的pagesize和ecc。這些信息會在uboot啟動時會打印出來。建議使用時先直接運行mkyaffs2image工具,根據(jù)打印信息填寫相關(guān)參數(shù)。下面以2KB pagesize、4bit ecc為例:
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2
或者
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_4bit.yaffs2 1 2
4、initrd
initrd 相當于存儲介質(zhì),它支持的文件系統(tǒng)格式有 ext2、 cramfs 等,因此內(nèi)核除了支持initrd 之外,還要支持 cramfs 文件系統(tǒng)。內(nèi)核需要做如下配置, initrd 才可以正常工作:
進入“ Device Drivers->Block devices”,選擇支持“ RAM disk support” 和“ InitialRAM disk (initrd) support”。
進入“ File>systems”,選擇“ miscellaneous filesystems”,最后選中其中的“ Compressed ROM file system support”。
當前 SDK 中默認選中以上兩項。
制作initrd的步驟如下:
步驟 1. 制作 cramfs 鏡像文件,具體制作方法請參見“ 4.3.1 cramfs”。
步驟 2. 以步驟 1 制作的鏡像文件作為輸入,制作 initrd 文件,制作命令為“ mkimage -A arm -T?ramdisk -C none -a 0 -e 0 -n cramfs-initrd -d ./cramfs-image cramfs-initrd”。
5、Squashfs
squashfs 文件系統(tǒng)是一套基于 Linux 內(nèi)核使用的壓縮只讀文件系統(tǒng),壓縮率高。
squashfs 具有如下特點:?
數(shù)據(jù)(data),節(jié)點(inode)和目錄(directories)都被壓縮
保存了全部的 32 位 UID/GIDS 和文件的創(chuàng)建時間
最大支持 4G 文件系統(tǒng)
檢測并刪除重復文件
使用 squashfs 文件系統(tǒng)步驟:
步驟 1. 制作支持 squashfs 的內(nèi)核鏡像。進入 linux-3.4.y 目錄下,執(zhí)行以下命令:
cp arch/arm/configs/hi3516a_mini_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- menuconfig (保存退出即可)
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- uImage
步驟 2. 制作 squashfs 文件系統(tǒng)鏡像。在發(fā)布包 SDK/package/osdrv/tools/pc 目錄下的
mksquashfs 為制作 squashfs 文件系統(tǒng)工具。使用方法如下:
./mksquashfs rootfs ./ rootfs.squashfs.img -b 64K -comp xz
其中, rootfs 是之前已經(jīng)制作好的根文件系統(tǒng), rootfs.squashfs.img 是生成的 squashfs 文件系統(tǒng)映像文件。 -b 64K 指定 squashfs 文件系統(tǒng)的塊大小為 64K(決定于實際 spi flash塊大小)。 -comp 指定文件系統(tǒng)壓縮方式為 xz。請根據(jù)實際情況修改參數(shù)。
參看:基于 SquashFS 構(gòu)建 Linux 可讀寫文件系統(tǒng)
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Hi3516A开发--根文件系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ActiveMQ之发布- 订阅消息模式实
- 下一篇: 互联网晚报 | 04月05日 星期二 |