如何在U-Boot中复制eMMC上的4分区镜像以得到8个分区?
问题分析与解决方案
首先得明确核心问题:你直接偏移写入整个wic镜像的方法之所以没生效,是因为wic镜像包含GPT分区表——而系统(包括U-boot)只会读取磁盘起始位置的主GPT分区表,你偏移写入的那份GPT表不会被识别,自然看不到新增的4个分区。
简单说,你相当于在磁盘后半段又放了一份完整的"小型磁盘"(带自己的GPT和分区),但系统只认开头的那份GPT,所以新增分区根本不会被列出来。
正确操作步骤
我们需要修改磁盘开头的主GPT,添加新分区条目,再把原有分区的数据复制到新的位置,具体如下:
1. 先计算原有分区的块数(方便后续复制)
从你提供的分区表,算出每个分区的总块数(End LBA - Start LBA + 1):
boot分区:0x681f - 0x800 + 1 = 0x6020块first分区:0x139e7 - 0x6820 + 1 = 0xd1c8块second分区:0xfefff - 0x14000 + 1 = 0xea000块third分区:0x1e9fff - 0xff000 + 1 = 0xea000块
偏移量用你之前的0x200000(刚好是原有镜像的总块数,避免覆盖原有分区)。
2. 备份当前GPT分区表(防止操作出错)
=> mmc read 0x600000000 1 33 # GPT主表在LBA1到LBA33,共33块 => saveenv gpt_backup 0x600000000 # 备份到U-boot环境变量,也可以上传到TFTP服务器
3. 修改GPT,添加4个新分区条目
如果你的U-boot支持gpt命令,直接执行以下命令(新分区的LBA是原分区LBA加上偏移量0x200000):
# 添加第5个boot分区 => gpt add 1 0x200800 0x20681f "boot" 0fc63daf-8483-4772-8e79-3d69d8477de4 # 添加第6个first分区 => gpt add 1 0x206820 0x2139e7 "first" 0fc63daf-8483-4772-8e79-3d69d8477de4 # 添加第7个second分区 => gpt add 1 0x214000 0x2fefff "second" 0fc63daf-8483-4772-8e79-3d69d8477de4 # 添加第8个third分区 => gpt add 1 0x2ff000 0x3e9fff "third" 0fc63daf-8483-4772-8e79-3d69d8477de4
4. 逐个复制原有分区数据到新位置
# 复制boot分区 => mmc read 0x600000000 0x800 0x6020 => mmc write 0x600000000 0x200800 0x6020 # 复制first分区 => mmc read 0x600000000 0x6820 0xd1c8 => mmc write 0x600000000 0x206820 0xd1c8 # 复制second分区 => mmc read 0x600000000 0x14000 0xea000 => mmc write 0x600000000 0x214000 0xea000 # 复制third分区 => mmc read 0x600000000 0xff000 0xea000 => mmc write 0x600000000 0x2ff000 0xea000
5. 保存修改后的GPT并验证
=> gpt write 1 1 # 将新GPT写入MMC设备1的主表位置 => mmc rescan => mmc part
现在你应该能看到预期的8个分区了。
补充说明
如果你的U-boot不支持gpt命令,也可以在PC上先修改wic镜像的GPT分区表,添加4个新分区条目,再把修改后的GPT写入eMMC的起始位置,之后再复制分区数据——但U-boot的gpt命令是嵌入式开发里的标配,优先用上面的方法更高效。
内容的提问来源于stack exchange,提问作者nader
相关产品推荐
相关产品推荐

