问题标签 [jffs2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 可以增加 MTD 设备的逻辑擦除块大小吗?
jffs2(mtd-utils 版本 1.5.0,mkfs.jffs2
修订版 1.60)的最小擦除块大小似乎是 8KiB:
但是我使用 at25df321a 运行 Linux 3.10,
并且擦除块大小仅为 4KiB:
有没有办法让 mtd 系统将多个擦除块视为一个?也许一些 ioctl 或模块参数?
如果我用更大的擦除块大小刷新 jffs2 映像,我会收到很多内核错误消息、丢失文件,有时还会出现恐慌。
解决方法
flasherase --jffs2
尽管擦除块大小为 4KiB,但我发现这会导致文件系统正常工作。所以我破解了mkfs.jfss2.c
文件,生成的图像似乎工作正常。我会给它一些测试。
linux - 在 Nandflash 中挂载 jffs2 文件系统时出错
我正在使用 at91sam9m10g45ek 板。我想从 Nandflash 启动。linux 3.12 在从 nandflash 引导期间无法挂载 jffs2。我的 u-boot 参数:
bootargs=console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro, -(rootfs) root=/dev/mtdblock7 rw rootfstype=jffs2
错误:
VFS:无法打开根设备“mtdblock7”或未知块(31,7):错误-19 请附加正确的“root=”引导选项;
如何解决这个问题?请帮助我在这方面是新手。提前致谢。
linux - O_DIRECT 不能在 openwrt 上工作?
我正在开发一个需要访问特殊 USB 设备的程序。这个 USB 设备作为文件系统中的常规文件,所以我必须用 O_DIRECT 标志打开这个文件。如下:
该程序在 PC 环境下运行良好。但是当我用 openwrt 将它移植到嵌入式板时,“open”函数返回 EINVAL 22 /* Invalid argument */.
- 在内核配置中选择了 O_DIRECT 支持。
- openwrt 的文件系统是 squashfs 和 jffs2。
- USB 设备的文件系统是胖的,并且挂载在 /media/aegis 目录下。
- board的ARCH是mips。
似乎从内核中的以下函数返回了错误:
是否知道 O_DIRECT 在 jffs2 上不受支持,而在 fat 上受支持。在 /media/aegis 中对文件进行操作时,我猜测使用了 fat 的 a_ops,但程序并没有按我的预期运行。
linux - 为什么在删除其他文件期间断电后 JFFS2 中的文件会损坏
我正在使用从 JFFS2 分区引导的 Linux (3.4.31+) 嵌入式系统。在删除其他文件时发生断电时,我经常遇到文件损坏的问题。它发生在平台的升级过程中。这些是升级的简化步骤:
- 下载包含(以及其他文件)我要升级到的文件系统的 rootfs.squashfs 映像的 tar.gz,验证映像的 md5 校验和。
- 从一个小型 JFFS2 分区引导 linux,该分区具有执行升级所需的最少工具集。
- 挂载必须升级的大分区。
- 挂载存储在大分区中的 rootfs.squashfs。
- 从大分区中删除所有文件,除了一些迁移的数据文件、rootfs.squashfs 映像等。
- 将挂载的 rootfs.squashfs 中的所有文件复制到大分区
- 从大分区启动
提到的功率损失发生在 5. 步骤中。请注意,rootfs.squashfs 以只读方式安装,并且在升级期间永远不会更改。即使这个文件被损坏并且在设备开机后你可以看到文件的 md5 校验和不同,大小保持不变,图像可以挂载但无法从这个图像中读取一些文件。
为什么这个文件被破坏了?JFFS2 不应该处理这种情况吗?有没有办法从这种情况中恢复过来?
linux - 挂载 jffs2 时文件丢失或损坏
我在 NOR 闪存上安装 jffs2 时遇到两个问题:
我正在运行一个将 squashfs 作为 rootfs 的板,我尝试将 jffs2 安装在另一个 mtdblock 上,如下所示:
mount -t jffs2 /dev/mtdblock6 /tmp/jffs
之后我将一些文件复制到 /tmp/jffs 但是当文件大于4096字节时系统给出错误:
cp: write error: Input/output error
然后我卸载了mtdblock并重新安装了它,但是我刚刚复制的文件已经消失了。
我通过转储 /dev/mtd6 或 /dev/mtdblock6 确认已写入闪存块,但重新挂载后无法看到这些文件。
=====
我打开了 printk 日志,当我将文件放入挂载文件夹时显示以下消息:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00120814: 0x0219 instead
Node totlen on flash (0x0000000c) != totlen from node ref (0x00000044)
当我尝试重新安装 mtdblock 时出现以下消息:
JFFS2 notice: (608) jffs2_get_inode_nodes: Node header CRC failed at 0x0e0050. {0000,9600,01e88b11,01000000}
如果有任何建议,非常感谢。
linux-kernel - 对不同的 ARM SOC 使用相同的 rootfs
我正在尝试在与 i.mx6 相同的板上使用为 i.mx53 构建的用户空间。i.mx6 板卡仅在使用的 CPU 上有所不同。我建立了一个新的内核和适当的 DTB,我可以用 uboot 加载它,它可以正常启动。但是,当我尝试使用 i.mx53 板的 rootfs 时,我收到以下 jffs 错误:
jffs2: inconsistent device description
这与不包含有效信息的 flash OOB 有关。我使用命令将 rootfs 写入闪存分区nand write.trimffs
。我需要以某种方式初始化OOB吗?我不记得在旧板上做过。这个错误可能来自哪里?
linux - JFFS2 文件系统,存储使用与实际文件大小不一致
我用了一个spi-nor芯片,做了一个16M的分区作为JFFS2 fs。我发现了一个奇怪的东西,我应该使用 14M 存储,但是当我使用 df 检查时,它显示只使用了 7M:
在我将另一个 2M 文件复制到此分区后:
事实证明,只使用了 1M 以上的存储空间:
有没有人也发现了这个问题?
谢谢,
linux-kernel - 不同步:没有找到初始化。对于 jffs2 文件系统
我正在使用内核 2.6.33.7 开发 mpc8309-twr 板,当我使用 ramdisk 文件系统(rootfs.ext2.gz.uboot)创建我的 rootfs 映像时,我能够挂载我的文件系统并且我的板能够成功启动.
VFS:在设备 31:1 上挂载根(jffs2 文件系统)。释放未使用的内核内存:168k init 警告:无法打开初始控制台。内核恐慌 - 未同步:未找到初始化。尝试将 init= 选项传递给内核。Call Trace: [c782df40] [c0008484] 0xc0008484 (unreliable) [c782df70] [c0025320] 0xc0025320 [c782dfc0] [c0003b78] 0xc0003b78 [c782dfd0] [c03a2238] 0xc03a2238 [c782dff0] [c0011994] 0xc0011994
但 init 存在于 /sbin/init 位置。任何人都可以帮助我。
linux - jffs2 选项、闪存设备特性、驱动程序设置和内核内存管理器之间有什么关系?
我正在努力将运行经过修改的 2.6.12.1 与 at91rm9200 处理器和at45db642D 数据闪存的旧板上的固件升级到使用at45db641E 数据闪存。641E的特点是:
- 32768 页
- 页面大小为 264 字节
- 灵活的擦除选项可擦除页面(264 字节)、块(2 KB)、扇区(256 KB)或整个芯片(64 Mbits)。
我相信内核内存管理器页面大小是标准的 4096 字节。
我想在设备上放置一个合适的 jffs2 图像。我想知道的mkfs.jffs2选项是(来自手册页):
- --pagesize:使用页面大小 SIZE。默认值为 4 KiB。此大小是数据节点的最大大小。根据目标系统的内存管理页面大小设置(注意:这与 NAND 页面大小无关)。
- --eraseblock:使用擦除块大小 SIZE。默认值为 64 KiB。如果您使用的擦除块大小与目标 MTD 器件的擦除块大小不同,JFFS2 可能不会以最佳方式执行。如果指定的 SIZE 低于 4096,则假定单位为 KiB。
该人说页面大小与内核内存管理页面大小有关(在我的情况下为 4096,与默认值相同),而不是设备的 264 字节页面。所以我需要指定--pagesize=4096 而不是--pagesize=264,这是正确的吗?
该人还说 --eraseblock 必须与 MTD 设备的擦除块大小相同。我对几件事感到困惑。
- 641E 有几种不同的擦除选项。必须为 mkfs.jffs2 --eraseblock 选项选择哪个?
- 如果正确的选项是 641E 的页面大小或块大小,我如何将其指定给 mkfs.jffs2,因为假定低于 4096 的值以 KB 为单位而不是字节?
- 这个链接(由这个相关但不充分的SO 问题引用)说 jffs2 节点必须完全适合擦除块。由于它们的大小为 4+ KB,大于设备的“擦除块”大小,链接显示“您应该将多个 erasblock 连接到一个 64 或 128 KiB 的虚拟擦除块中并使用它 - 这会更理想”,然后是“你需要让你的驱动程序报告 128KiB 的擦除块大小并模拟它,然后它就会工作。它不会开箱即用。” 如何设置这样的“虚拟擦除块”?
- 在at91 数据闪存驱动程序中,
device->erasesize=pagesize
. 因此,似乎有一些名称相似但不同的概念:驱动程序擦除大小、设备擦除块大小和 jffs2 擦除块大小。它们之间有什么关系和区别?jffs2 指定的擦除块大小最终如何影响驱动程序执行的操作?
感谢您的任何帮助。
linux - 将 jffs2 挂载为 rootfs 错误
我正在尝试挂载jffs2 rootfs。挂载 fs 时,会显示以下警告:
当我使用ramfs作为 rootfs时没有出现此警告,并且手动挂载了jffs2 rootfs。
当jffs2尝试将节点标记为过时时会出现此警告。在任何其他意义上,fs 似乎是可操作的,我能够创建文件和删除文件。无论如何,每隔一段时间就会显示警告,除了对此感到恼火之外,我担心它最终会导致 fs 的损坏。
我发现当我将分区大小减小到 0x450000 时,这个警告被取消了,但是 /etc/dropbear 没有足够的空间,我无法找到一个有足够空间的“最佳位置”并且没有警告。
我尝试了各种填充大小,并完全删除了填充,但无济于事。
我已经构建了一些具有不同配置的 rootfs.jffs2 图像,但没有一个解决了这个问题。
我查看了 rootfs.jffs2 映像的 hexdump、一个空的jffs2分区和创建的 /dev/mtdblock3——但没有发现任何异常。