【问题标题】:How to to duplicate a 4 partitions image on an eMMC from U-Boot?如何从 U-Boot 复制 eMMC 上的 4 个分区映像?
【发布时间】:2020-05-16 05:11:05
【问题描述】:

我有一个包含分区表及其 4 个分区的图像(更具体地说,是为熟悉 Yocto 框架的人准备的 wic 图像)。它的大小略小于 1GB。

为了将此图像写入 eMMC:

  • 我首先通过 TFTP 将其加载到 RAM 中
=> tftp 0x600000000 <image>.wic
  • 然后我将图像从 RAM 写入 eMMC
=> mmc write 0x600000000 0x0 0x1FFFFF
  • 图像写入正确,我可以列出 4 个分区。到目前为止,一切顺利。
=> mmc part

Partition Map for MMC device 1  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000800      0x0000681f      "boot"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   cd5df8ce-ded3-4cf4-b364-33d7a4b24953
  2     0x00006820      0x000139e7      "first"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   3acc4557-2273-462a-a2bd-d130b3a5745d
  3     0x00014000      0x000fefff      "second"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   efe25a87-e0ba-401e-8bf6-e81ae29cbc35
  4     0x000ff000      0x001e9fff      "third"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   150f9151-7710-42f4-b819-3b3bd506a2bf

现在我想复制 eMMC 中的图像,这样我就得到了 8 个分区,如下所示:

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000800      0x0000681f      "boot"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   cd5df8ce-ded3-4cf4-b364-33d7a4b24953
  2     0x00006820      0x000139e7      "first"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   3acc4557-2273-462a-a2bd-d130b3a5745d
  3     0x00014000      0x000fefff      "second"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   efe25a87-e0ba-401e-8bf6-e81ae29cbc35
  4     0x000ff000      0x001e9fff      "third"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   150f9151-7710-42f4-b819-3b3bd506a2bf
  5     0x00000800      0x0000681f      "boot"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   cd5df8ce-ded3-4cf4-b364-33d7a4b24953
  6     0x00006820      0x000139e7      "first"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   3acc4557-2273-462a-a2bd-d130b3a5745d
  7     0x00014000      0x000fefff      "second"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   efe25a87-e0ba-401e-8bf6-e81ae29cbc35
  8     0x000ff000      0x001e9fff      "third"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   150f9151-7710-42f4-b819-3b3bd506a2bf

所以我再次用偏移量将相同的图像写入 eMMC(以不覆盖现有的图像)

=> mmc write 0x600000000 0x200000 0x3FFFFF

MMC write: dev # 1, block # 2097152, count 4194303 ... 4194303 blocks written: OK

但是,我没有得到我期望的 8 个分区,而只有 4 个分区:

=> mmc rescan
=> mmc part

Partition Map for MMC device 1  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000800      0x0000681f      "boot"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   cd5df8ce-ded3-4cf4-b364-33d7a4b24953
  2     0x00006820      0x000139e7      "first"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   3acc4557-2273-462a-a2bd-d130b3a5745d
  3     0x00014000      0x000fefff      "second"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   efe25a87-e0ba-401e-8bf6-e81ae29cbc35
  4     0x000ff000      0x001e9fff      "third"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   150f9151-7710-42f4-b819-3b3bd506a2bf

【问题讨论】:

  • 我很好奇:使用testdisk修复分区表成功了吗?因为我意识到每个分区都有一个唯一的 GUID 标识符。所以我猜如果你复制你的分区,你也会有重复的 GUID,这可能会导致一些问题。或者testdisk 是否能够分配新的分区 GUID?
  • 我还没有尝试过testdisk,但我接受了你的回答,因为它帮助我了解了问题的根本原因。我将尝试使用“testdisk”或其他工具修复我的分区表,然后回复您:)
  • @VictorDeleau 我尝试了 testdisk,我能够更改磁盘映像的几何形状并将柱面数量增加一倍。这导致图像大小加倍,这是预期的。我在 eMMC 上写了这个图像,然后我在偏移处写了另一个图像,但我只能看到 4 个分区而不是 8 个分区。我想我需要在将磁盘映像写入 eMMC 后更改其几何形状才能使其正常工作。而且由于我在 u-boot 环境(而不是 linux)中工作,所以这会使事情变得复杂,因为我需要手动修改 eMMC 内存..
  • @VictorDeleau ..更不用说必须重新计算 CRC32 并将其重新注入内存,这可能很麻烦。尽管如此,testdisk 在更深入地了解我的问题方面非常有用,而且它相对容易使用。我的新方法是尝试使用 uboot 命令行“gzwrite”,它能够将 8 个分区的映像从 RAM 解压缩到 eMMC,绕过 RAM 大小限制。

标签: yocto u-boot yocto-wic


【解决方案1】:

当你写一个包含一个或多个分区的镜像时,你也写了分区表,它预计会在某个偏移量或你的内存被 u-boot (根据this post它必须是 0x60000000)。因此,如果您在其他地方再次写入映像,u-boot 仍将引用您第一次写入操作的分区表,该表本身包含您前 4 个分区的内存地址。您的第二个分区表在磁盘上的其他位置,但 u-boot 不知道。

您可以尝试使用testdisk 命令行实用程序修复分区表。它将扫描整个磁盘,希望它会发现总共有 8 个分区,并在 0x60000000 处创建一个新的分区表来引用所有这些分区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2012-01-25
    • 2017-11-25
    • 2018-11-04
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多