JFFS2 文件系统立即损坏(魔术位掩码 0x1985 未找到错误)

Posted

技术标签:

【中文标题】JFFS2 文件系统立即损坏(魔术位掩码 0x1985 未找到错误)【英文标题】:JFFS2 filesystem corrupts immediately (Magic bitmask 0x1985 not found errors) 【发布时间】:2013-04-21 07:43:32 【问题描述】:

我创建了一个使用 squashfs 的 buildroot 根文件系统。它工作正常,现在我想创建一个覆盖 /home 和 /etc 目录的overlayfs。

为此,我想创建一个包含几个文件的简单 jffs2 文件系统:

jlumme@simppa:~/projects/jffs2_home$ ls -la
total 20
drwxrwxr-x 4 jlumme jlumme 4096 Apr 21 16:21 .
drwxrwxr-x 6 jlumme jlumme 4096 Apr 21 16:21 ..
drwxrwxr-x 2 jlumme jlumme 4096 Apr 21 13:45 default
drwxrwxr-x 2 jlumme jlumme 4096 Apr 21 13:45 ftp
-rw-rw-r-- 1 jlumme jlumme   24 Apr 21 15:34 test.txt

我使用的闪存芯片是 SST25VF064C,所以我相信它的擦除块大小是 64 KB,因此我从该文件夹创建了一个文件系统映像:

mkfs.jffs2 -r jffs2_home/ -e 64 -o home.jffs2
$ ls -la
-rw-r--r--  1 jlumme jlumme   496 Apr 21 15:42 home.jffs2

(令人惊讶的是,如果我设置 -e 32,甚至 -e 4,则生成的二进制图像根本不会改变???)。 尽管如此,继续前进,我已将包含 home 的 mtdblock 对齐到 64KB,我的闪存布局如下所示:

uboot/<0x00000000 0x40000>
kernel/<0x00040000 0x3D9000>
dtb/<0x00419000 0x10000>
rootfs/<0x00429000 0x1F7000>
home/<0x00620000 0x1E0000>

在我的板上,我可以很好地挂载 mtdblock4,并且可以正确读取文件内容。但是,如果我修改文件并尝试保存它,vi 会抱怨:

[   77.030000] jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x00000044)

现在,如果我卸载文件系统并重新安装它,我会立即开始收到投诉:

# mount -t jffs2 /dev/mtdblock4 /home/
[   99.740000] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d4070: 0xff0a instead
[   99.760000] jffs2: Empty flash at 0x001d4074 ends at 0x001d412c
[   99.770000] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d412c: 0xffff instead
[   99.790000] jffs2: Empty flash at 0x001d4130 ends at 0x001d4194
[   99.790000] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d4194: 0xff0a instead

我想现在我的文件系统已经损坏了......我真的不明白它的原因...... 任何想法我哪里错了?谢谢大家的建议。。

【问题讨论】:

【参考方案1】:

这就是我为解决问题所做的。

    从http://www.linux-mtd.infradead.org/ 更新了较新的 MTD 驱动程序 - SST25V064C芯片有新代码 确保为 JFFS2 保留的区域已初始化为 0xFF

    (可能可选)更准确地指定了jffs2文件系统的创建:

    mkfs.jffs2 -e 64 -l -p -s 4096 -r jffs2_home/ -o home.jffs2
    

通过这些更改,文件系统现在可以按预期进行读写。

【讨论】:

以上是关于JFFS2 文件系统立即损坏(魔术位掩码 0x1985 未找到错误)的主要内容,如果未能解决你的问题,请参考以下文章

什么是位掩码?

C中的位掩码

使用 SQLite 进行位掩码分组

PHP中基于位掩码获取数组值

位掩码选择向量/集元素?

无法应用位掩码