先参考海思文档《Hi3519V101 Linux开发环境用户指南.pdf》文档中介绍了各种文件系统的制作命令。
在我们的板子中使用的是SPI NOR FLASH, 该flash 块大小为64K。
4.3.2 jffs2
jffs2 是 RedHat 的 David Woodhouse 在 jffs 基础上改进的文件系统,是用于微型嵌入式设备的原始闪存芯片的实际文件系统。jffs2 文件系统是日志结构化的可读写的文件系统。
jffs2 的优缺点如下:
# 优点
使用了压缩的文件格式。最重要的特性是可读写操作。
# 缺点
jffs2 文件系统挂载时需要扫描整个 jffs2 文件系统,因此当 jffs2 文件系统分区增大时,挂载时间也会相应的变长。使用 jffs2 格式可能带来少量的 Flash 空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。jffs2 的另一缺点是当文件系统已满或接近满时,jffs2 运行速度会迅速降低。这是因为垃圾收集的问题。
加载 jffs2 文件系统时的步骤如下:
步骤 1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。
步骤 2. 对所有日志节点进行整理,抽取有效的节点并整理出文件目录信息。
步骤 3. 找出文件系统中无效节点并且将它们删除。
步骤 4. 最后整理内存中的信息,将加载到缓存中的无效节点释放
由此可以看出虽然这样能有效地提高系统的可靠性,但是在一定程度上降低了系统的速度。尤其对于较大的闪存芯片,加载过程会更慢。为了使内核支持 jffs2 文件系统,必须在编译内核时把 jffs2 的选项加入(我们发布的内核默认已经加入了支持)。在 make menuconfig 后,进入“File>systems”,选择“miscellaneous filesystems”,最后选中其中的“Journalling Flash File System v2 (JFFS2) support”选项(SDK 里面提供的内核默认已经选择了该文件系统的支持)。
jffs2 的制作方法为:
hisilicon$mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img
其中,mkfs.jffs2 工具可以从互联网中下载,也可以在 SDK 包中找到。rootbox 为之前已经制作好的根文件系统。参数说明如表 4-2 所示。
表4-2 JFFS2 参数表
参数 说明
d 指定根文件系统
l little-endian 小端模式
e Flash 的块大小
o 输出映像文件
进入内核osdrv目录:
/home/xiaoxxxx.lu/hisi/hi3519/pan_v1.0.10/Hi3519V101_SDK_V1.0.1.0/osdrv
按照文档上面的命令,制作出来的文件系统
./tools/pc/jffs2_tool/mkfs.jffs2 -d /home/xiaoxxxx.lu/back_up/rootfs_mk/ -l -e 0x20000 -o ./pub/rootfs_hi3519_64k.jffs2 --pad=0xA00000
由于按照他默认的 0x20000 制作出来的rootfs 出现了如下问题:
ode at 0x0000f568 with length 0x00000b20 would run over theend of the erase block
Perhaps the file system was created with the wrong erasesize?
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at0x0000f56c: 0x0b20 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at0x0000f570: 0x74a8 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at0x0000f574: 0x001d instead
检查之后发现是制作的根文件系统时块大小设置错了,我们只需要修改mkfs.jffs2后-e的参数即可,例如本例,现在spi flash的块大小只有64k,而我制作文件系统之时设置成128k即0x20000,修改如下:
./tools/pc/jffs2_tool/mkfs.jffs2 -d /home/xiaoxxxx.lu/back_up/rootfs_ar0134/ -l -e 0x10000 -o ./pub/ar0134_fs/rootfs_hi3519_64k.jffs2
-e 参数,扩展说明:
64K 对应 0x10000
128K 对应 0x20000
256K 对应 0x40000
生成的文件系统目录在 ./pub/ 下226_fs 区别就是home/ 下面的文件与ar0134 不一致,其他都一样的。
./tools/pc/jffs2_tool/mkfs.jffs2 -d /home/xiaoxxxx.lu/back_up/rootfs_imx226/ -l -e 0x10000 -o ./pub/imx226_fs/rootfs_hi3519_64k.jffs2