U-Boot下从eMMC恢复boot.bin

张开发
2026/4/17 13:44:15 15 分钟阅读

分享文章

U-Boot下从eMMC恢复boot.bin
系统无法正常引导可能因boot.bin更新导致但之前备份的boot.bin文件存在于eMMC 中 Linux 系统下的某个文件夹中。此时您身处 U-Boot 命令行环境需要从 eMMC 的用户数据分区通常是 EXT4 文件系统读取该备份文件并将其写回正确的启动位置可能是 eMMC 的boot0/boot1硬件分区也可能是用户数据分区的特定扇区。整个恢复流程的核心是在 U-Boot 下挂载 eMMC 的 Linux 分区、定位备份文件、加载至内存最后写入启动区域。一、操作前关键确认与准备在开始前请在 U-Boot 命令行中确认以下信息这至关重要确认 eMMC 设备号使用mmc list命令列出所有 MMC 设备。通常SD 卡可能是mmc 0而板载 eMMC 可能是mmc 1。请根据您的硬件配置确认。 mmc list输出示例FSL_SDHC: 0 (SD) FSL_SDHC: 1 (eMMC)此例中eMMC 是设备1。后续命令将以mmc 1为例。确认备份文件的确切路径您需要知道备份文件在 Linux 文件系统中的完整路径例如/home/root/backup/boot.bin或/mnt/data/boot_backup.bin。确认启动介质和恢复目标情况A从 eMMC 用户分区启动boot.bin可能位于 eMMC 用户数据分区的特定扇区如 FAT 或 EXT4 分区的开头。恢复时需要写入对应分区的起始扇区。情况B从 eMMC 硬件boot0/boot1分区启动恢复时需要写入 eMMC 的boot0或boot1硬件分区。您可以通过printenv查看bootcmd或bootargs环境变量或回忆之前的启动配置来判断。最常见的是从boot0分区启动。二、分步恢复操作指南以下流程假设您的 eMMC 是设备1且 Linux 根文件系统位于 eMMC 的第二个分区EXT4 格式备份文件路径为/boot_backup/boot.bin。步骤 1扫描并挂载 eMMC 上的 Linux 分区切换至 eMMC 设备 mmc dev 1列出 eMMC 的分区表 mmc part输出示例Partition Map for MMC device 1 -- Partition Type: EFI Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00000800 0x0000ffff boot 2 0x00010000 0x003a7fff rootfs此例中rootfs分区分区2很可能就是您的 Linux 根文件系统所在分区起始扇区为0x10000。尝试挂载 EXT4 文件系统U-Boot 需要支持ext4命令。我们尝试将分区 2 挂载到某个虚拟设备上。 ext4load mmc 1:2 ${loadaddr} /boot_backup/boot.bin命令解析ext4load: 从 EXT4 文件系统加载文件的命令。mmc 1:2: 指定设备为mmc 1的分区2。${loadaddr}: 目标内存地址例如0x10000000。这是一个 U-Boot 环境变量通常已定义。/boot_backup/boot.bin: 备份文件在 EXT4 分区内的路径。如果此命令成功它会将文件加载到内存并自动设置filesize环境变量为文件大小字节数。这是最理想的情况请直接跳至步骤 3。如果提示ext4load命令不存在或失败则需进入步骤 2的备选方案。步骤 2备选方案 - 使用fatload或原始扇区读取如果ext4load不可用您的 Linux 分区可能是 FAT 格式或者需要采用更底层的读取方式。尝试 FAT 文件系统如果您的备份分区是 FAT 格式如boot分区使用fatload。 fatload mmc 1:1 ${loadaddr} boot_backup/boot.bin这里假设分区1是 FAT 格式的boot分区且文件在该分区根目录下的boot_backup文件夹内。使用mmc read进行原始扇区读取最后手段如果您知道备份文件在 eMMC 中的确切物理扇区位置可以直接读取。这需要您事先知道文件在 Linux 下的存储位置对应的扇区号通常比较困难。命令格式如下 mmc read ${loadaddr} 起始扇区 扇区数例如从扇区0x20000开始读取 1024 个扇区512KB mmc read 0x10000000 0x20000 0x200然后您需要在内存中手动定位boot.bin文件的实际数据这非常复杂不推荐。步骤 3将内存中的备份镜像写入启动区域成功将备份的boot.bin加载到内存如0x10000000后filesize变量已自动设置为文件大小字节。现在将其写入正确的启动位置。场景A恢复到 eMMC 的boot0硬件分区最常见切换 eMMC 至boot0分区访问模式eMMC 有多个硬件分区boot0boot1user。boot.bin通常烧录在boot0。 mmc partconf 1 1 0 0命令解析具体参数请以您的平台文档为准1: eMMC 设备号。第二个1: 表示访问boot1分区此处可能存在歧义部分平台1表示boot0。请务必查阅您的硬件手册或尝试mmc partconf 1查看帮助。更通用的方法是先进入boot0分区 mmc dev 1 0 # 切换到设备1的boot0分区某些U-Boot版本或者使用以下命令序列 mmc dev 1 # 确保在user分区 mmc bootbus 1 0 0 0 # 配置boot总线条件依平台而定 mmc bootpart 1 1 0 # 启用boot1分区并设置为启动分区需要谨慎。最可靠的方法是参考您开发板的原厂U-Boot指南。一个常见的、直接写入boot0的方法是在user分区模式下使用mmc write并指定一个很大的偏移量但这不是标准做法。许多平台使用mmc partconf来切换。写入boot0分区假设已成功切换到boot0分区访问模式并且该分区在逻辑上被视为一个新的“设备”或可直接寻址。有时在切换后你需要对“当前设备”进行写入。# 方法1如果切换后 boot0 被视为独立设备 mmc write ${loadaddr} 0x00 ${filesize_sectors} # 注意需要扇区数 # 方法2更常见的在 user 分区模式下向 boot0 写入的特定命令 mmc write.boot 1 ${loadaddr} 0 ${filesize} # 假设命令是 mmc write.boot由于mmc write需要扇区数而filesize是字节数必须转换 setexpr blkcnt ${filesize} 0x1ff # 0x1ff 511, 实现 (size 511) setexpr blkcnt ${blkcnt} / 0x200 # 除以 512得到扇区数结果存入 blkcnt mmc write ${loadaddr} 0 ${blkcnt}切换回用户分区并重启 mmc partconf 1 0 0 0 # 切换回用户分区访问模式 reset场景B恢复到 eMMC 用户数据分区的启动扇区如果您的系统是从 eMMC 用户数据分区的 FAT/EXT4 文件系统开头加载boot.bin例如类似 SD 卡启动则恢复更简单。确保在正确的用户分区 mmc dev 1 # 切换到 eMMC 用户分区直接写入分区起始扇区# 计算扇区数 setexpr blkcnt ${filesize} 0x1ff setexpr blkcnt ${blkcnt} / 0x200 # 写入分区1假设启动分区是第一个分区 mmc write ${loadaddr} 0x00 ${blkcnt}注意这里的0x00是相对于当前分区的起始扇区。如果要写入整个 eMMC 的绝对起始扇区可能需要先mmc part 1离开分区模式但这样会破坏分区表极其危险通常mmc write在分区模式下是安全的。三、操作验证与注意事项验证写入写入后可以重新读取刚写入的区域到内存另一地址并与原备份内存数据比较。# 读取刚写入的区域到新地址 mmc read ${loadaddr}_verify 0x00 ${blkcnt} # 比较两个内存区域filesize 是字节数 cmp.b ${loadaddr} ${loadaddr}_verify ${filesize}如果输出显示所有字节都相同则写入成功。环境变量操作前可以运行printenv查看loadaddr、bootcmd等变量。loadaddr通常是类似0x10000000的值。确保你的内存操作不会覆盖重要数据。文件大小务必使用setexpr正确计算扇区数。错误的扇区数可能导致写入不完整或覆盖后续数据。备份原始镜像在写入新boot.bin之前如果可能先备份当前损坏的boot.bin到内存其他位置或通过串口保存以备不时之需。 mmc read ${loadaddr}_backup 0x00 ${blkcnt} # 然后可以通过串口工具如 kermit, pySerial将内存数据保存到主机。终极恢复如果上述所有 U-Boot 操作均失败或者 eMMC 的boot0分区已无法访问您可能需要通过JTAG 接口使用芯片厂商的专用工具如 Rockchip 的rkdeveloptool Allwinner 的PhoenixSuit或 Amlogic 的烧录工具强制擦写整个 eMMC 的引导区域这需要主机电脑和相应的 USB 烧录线。总结流程挂载分区 - 加载文件 - 计算扇区 - 切换分区如需- 写入镜像 - 验证 - 重启。每个步骤都依赖准确的设备号、分区号和内存地址。请根据您板子的具体型号和 U-Boot 版本灵活调整命令。在执行mmc write或sf write等破坏性命令前反复确认目标地址和大小。参考来源Zynq7020 制作boot.bin及烧录到开发板全流程解析Linux系统启动卡制作及系统固化EmuELEC系统从TF卡迁移至eMMC的完整指南版本适配与实战解析EmuELEC 4.6版eMMC安装全攻略从旧版升级到最新系统的完整流程附常见问题解决从CM201-1 YS盒子中提取并修改dtb文件以适配Armbian系统Linux之跟着正点原子学习记录

更多文章