在嵌入式Linux系统开发中,nandwrite 是用于向 NAND 闪存设备写入数据的关键工具之一,通常配合 MTD(Memory Technology Device)子系统使用。它属于 mtd-utils 工具集,广泛应用于Bootloader、内核镜像、文件系统以及固件升级等场景。正确使用 nandwrite 不仅关系到数据是否能成功写入,还直接影响 NAND 设备的稳定性与寿命。
在实际操作前,需要先确认系统是否已正确识别 NAND 设备。一般情况下,可以通过 /proc/mtd 查看当前系统的 MTD 分区信息。每个分区都会以 mtd0、mtd1 的形式呈现,这些编号将作为后续写入操作的目标设备。
使用 nandwrite 写入数据时,最基础的命令格式如下:
nandwrite -p /dev/mtdX file.bin
其中 /dev/mtdX 表示目标 NAND 分区设备,file.bin 是需要写入的二进制文件。参数 -p 表示自动跳过坏块(bad block),这是 NAND 设备特有的重要机制,因为 NAND 闪存天生存在坏块,必须依赖驱动或工具进行处理,否则写入过程可能失败或数据损坏。
在某些场景下,还会结合 -o 参数使用,用于覆盖写入操作。但需要注意,NAND 写入通常不支持像普通块设备那样直接覆盖旧数据,因此在写入前通常需要先擦除分区:
flash_erase /dev/mtdX 0 0
只有完成擦除操作后,nandwrite 才能将新数据可靠写入 NAND 芯片。擦除是按块进行的,而写入则是按页进行,两者的粒度不同,这也是 NAND 操作复杂性的来源之一。
在写入内核或文件系统镜像时,建议使用 -j 参数来处理 JFFS2 文件系统的 clean marker,例如:
nandwrite -p -j /dev/mtdX rootfs.jffs2
对于 YAFFS 或 UBIFS 文件系统,虽然 nandwrite 仍然可用,但更推荐使用专用工具进行挂载或写入,以避免损坏文件系统结构。
在实际调试过程中,经常会遇到“写入成功但系统无法启动”的问题,这通常与以下因素有关:镜像未对齐 NAND 页大小、未擦除分区、ECC 校验配置不匹配或坏块处理不当。因此在使用 nandwrite 前,应确保内核配置中的 ECC 策略与 NAND 控制器驱动一致。
另一个容易忽略的点是写入速度与缓存刷新。部分开发板在写入完成后需要执行 sync,确保数据真正落入 NAND,而不是停留在缓存中:
sync
否则可能出现掉电后数据丢失的情况。
在生产环境固件升级中,nandwrite 通常会被脚本化使用,与 bootloader(如 U-Boot)配合完成自动刷机流程。例如先擦除 boot 分区,再写入 kernel,最后写入 rootfs,从而实现完整系统更新。
整体来看,nandwrite 的核心价值在于提供对 NAND 底层的直接写入能力,但也正因为这种“底层直写”,开发者必须严格控制擦除、写入顺序以及坏块管理,否则极易导致设备不可启动或数据损坏。