JFFS2文件系统
JFFS2的全名为JournallingFlashFileSystemVersion2(闪存日志型文件系统第2版),其功能就是管理在MTD设备上实现的日志型文件系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。
除了提供具有断电可靠性的日志结构文件系统,JFFS2还会在它管理的MTD设备上实现“损耗平衡”和“数据压缩”等特性。
为了更好的了解JFFS2文件系统,我们首先来创建一个目录rootfs,里面包含一些目录和一些文件,其中001文件内容为111,最终打包为一个JFFS2文件系统映像。

命令如下:
| mkfs.jffs2 -r rootfs -o rootfs.jffs2 |
使用16进制工具查看rootfs.jffs2文件:

解析过程
| 序号 | 偏移 | 说明 |
| 1 | 0x00-0x01 | magic,值为0x1985 |
| 2 | 0x02-0x03 | node_type,值为0x2003 |
| 3 | 0x04-0x07 | totlen,值为0x0C |
| 4 | 0x08-0x0B | hdr_crc,值为0xE41EB0B1,即计算0-7字节的crc |
| 5 | 0x0C-0x0D | magic,值为0x1985 |
| 6 | 0x0E-0x0F | node_type,值为0xE001,定义为jffs2_raw_dirent |
| 7 | 0x10-0x13 | totlen,值为0x2B |
| 8 | 0x14-0x17 | hdr_crc,值为0x7D266EE6 |
| 9 | 0x18-0x1B | pino,值为0x01 |
| 10 | 0x1C-0x1F | version,值为0x00 |
| 11 | 0x20-0x23 | ino,值为0x02 |
| 12 | 0x24-0x27 | mctime 创建时间,值为0x6235256d,即计算0x0C-0x13字节的crc |
| 13 | 0x28 | nsize,值为0x03 |
| 14 | 0x29 | type,值为0x08 |
| 15 | 0x2A-0x2B | 保留数据 |
| 16 | 0x2C-0x2F | node_crc,值为0xF4D44AED |
| 17 | 0x30-0x33 | name_crc,值为0xAAF3D359 |
| 18 | 0x34-0x37 | name,字符串为001,为了偶数对齐,以0xFF对齐 |
| 19 | 0x38-0x39 | magic,值为0x1985 |
| 20 | 0x3A-0x3B | node_type,值为0xE002,定义为jffs2_raw_inode |
| 21 | 0x3C-0x3F | totlen,值为0x48 |
| 22 | 0x40-0x43 | hdr_crc,值为0xd22144a5 |
| 23 | 0x44-0x47 | ino,值为0x02 |
| 24 | 0x48-0x4B | version,值为0x01 |
| 25 | 0x4C-0x4F | mode,值为0x81b4 |
| 26 | 0x50-0x51 | uid,值为0x03E9(1001) |
| 27 | 0x52-0x53 | gid,值为0x03E9(1001) |
| 28 | 0x54-0x57 | isize,值为0x04 |
| 29 | 0x58-0x5B | atime 访问时间,值为0x6235256d |
| 30 | 0x5C-0x5F | mtime 最后一次修改时间,值为0x6235256d |
| 31 | 0x60-0x63 | ctime 修改时间,值为0x6235256d |
| 32 | 0x64-0x67 | offset,值为0x00 |
| 33 | 0x68-0x6B | csize (压缩)数据大小,值为0x04 |
| 34 | 0x6C-0x6F | dsize (解压后)数据大小,值为0x04 |
| 35 | 0x70 | compr,值为0x00,即压缩方式为不压缩 |
| 36 | 0x71 | usercompr,值为0x00 |
| 37 | 0x72-0x73 | flags,值为0x00 |
| 38 | 0x74-0x77 | data_crc 数据crc,值为0x4bb6fecf |
| 39 | 0x78-0x7B | node_crc,值为0x4d839ca6 |
| 40 | 0x7C-0x7F | data,数据为\x31\x31\x31\x0A |
压缩方式定义如下
| 序号 | 值 | 定义 |
| 1 | 0x00 | JFFS2_COMPR_NONE |
| 2 | 0x01 | JFFS2_COMPR_ZERO |
| 3 | 0x02 | JFFS2_COMPR_RTIME |
| 4 | 0x03 | JFFS2_COMPR_RUBINMIPS |
| 5 | 0x04 | JFFS2_COMPR_COPY |
| 6 | 0x05 | JFFS2_COMPR_DYNRUBIN |
| 7 | 0x06 | JFFS2_COMPR_ZLIB |
| 8 | 0x07 | JFFS2_COMPR_LZO |
| 9 | 0x08 | JFFS2_COMPR_LZMA |
校验算法(python实现):
import binascii
def mtd_crc(data):
return (binascii.crc32(data, -1) ^ -1) & 0xFFFFFFFF
参考链接:
https://www.zhiwanyuzhou.com/download/Datasheet/rootfs/jffs2.pdf