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