ophub/amlogic-s9xxx-armbian

请问ddbr备份的安卓系统img如何解包提取文件?

s700k opened this issue · 14 comments

s700k commented

试过AmlogicKitchen这个工具,能解包线刷包和卡刷包,但是不能解包ddbr备份的img。
想问问有没有别的工具,谢谢!

7Ji commented

用我的ampart来获取dump镜像里面的Amlogic专有EPT分区表,然后根据汇报分区表中各个分区的开始处和大小切割得到需要的每个分区的dump。
比如,分析一个名为x3_emmc.img的dump里面的EPT分区表,并获取可以方便地用于其他操作的快照:

ampart x3_emmc.img --mode esnapshot

可以得到EPT的布局(下表来自HK1 BOX的原厂固件的安卓eMMC dump):

EPT report: 20 partitions in the table:
===================================================================================
ID| name            |          offset|(   human)|            size|(   human)| masks
-----------------------------------------------------------------------------------
 0: bootloader                      0 (   0.00B)           400000 (   4.00M)      0
    (GAP)                                                 2000000 (  32.00M)
 1: reserved                  2400000 (  36.00M)          4000000 (  64.00M)      0
    (GAP)                                                  800000 (   8.00M)
 2: cache                     6c00000 ( 108.00M)         46000000 (   1.09G)      2
    (GAP)                                                  800000 (   8.00M)
 3: env                      4d400000 (   1.21G)           800000 (   8.00M)      0
    (GAP)                                                  800000 (   8.00M)
 4: logo                     4e400000 (   1.22G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 5: recovery                 4f400000 (   1.24G)          1800000 (  24.00M)      1
    (GAP)                                                  800000 (   8.00M)
 6: misc                     51400000 (   1.27G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 7: dtbo                     52400000 (   1.29G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 8: cri_data                 53400000 (   1.30G)           800000 (   8.00M)      2
    (GAP)                                                  800000 (   8.00M)
 9: param                    54400000 (   1.32G)          1000000 (  16.00M)      2
    (GAP)                                                  800000 (   8.00M)
10: boot                     55c00000 (   1.34G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
11: rsv                      57400000 (   1.36G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
12: metadata                 58c00000 (   1.39G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
13: vbmeta                   5a400000 (   1.41G)           200000 (   2.00M)      1
    (GAP)                                                  800000 (   8.00M)
14: tee                      5ae00000 (   1.42G)          2000000 (  32.00M)      1
    (GAP)                                                  800000 (   8.00M)
15: vendor                   5d600000 (   1.46G)         14000000 ( 320.00M)      1
    (GAP)                                                  800000 (   8.00M)
16: odm                      71e00000 (   1.78G)          8000000 ( 128.00M)      1
    (GAP)                                                  800000 (   8.00M)
17: system                   7a600000 (   1.91G)         74000000 (   1.81G)      1
    (GAP)                                                  800000 (   8.00M)
18: product                  eee00000 (   3.73G)          8000000 ( 128.00M)      1
    (GAP)                                                  800000 (   8.00M)
19: data                     f7600000 (   3.87G)       1c27600000 ( 112.62G)      4
===================================================================================

并且得到三个不同的快照,一个是脚本友好的十进制

bootloader:0:4194304:0 reserved:37748736:67108864:0 cache:113246208:1174405120:2 env:1296039936:8388608:0 logo:1312817152:8388608:1 recovery:1329594368:25165824:1 misc:1363148800:8388608:1 dtbo:1379926016:8388608:1 cri_data:1396703232:8388608:2 param:1413480448:16777216:2 boot:1438646272:16777216:1 rsv:1463812096:16777216:1 metadata:1488977920:16777216:1 vbmeta:1514143744:2097152:1 tee:1524629504:33554432:1 vendor:1566572544:335544320:1 odm:1910505472:134217728:1 system:2053111808:1946157056:1 product:4007657472:134217728:1 data:4150263808:120919687168:4

一个是脚本友好的十六进制

bootloader:0x0:0x400000:0 reserved:0x2400000:0x4000000:0 cache:0x6c00000:0x46000000:2 env:0x4d400000:0x800000:0 logo:0x4e400000:0x800000:1 recovery:0x4f400000:0x1800000:1 misc:0x51400000:0x800000:1 dtbo:0x52400000:0x800000:1 cri_data:0x53400000:0x800000:2 param:0x54400000:0x1000000:2 boot:0x55c00000:0x1000000:1 rsv:0x57400000:0x1000000:1 metadata:0x58c00000:0x1000000:1 vbmeta:0x5a400000:0x200000:1 tee:0x5ae00000:0x2000000:1 vendor:0x5d600000:0x14000000:1 odm:0x71e00000:0x8000000:1 system:0x7a600000:0x74000000:1 product:0xeee00000:0x8000000:1 data:0xf7600000:0x1c27600000:4

一个是真人易读易用的格式

bootloader:0B:4M:0 reserved:36M:64M:0 cache:108M:1120M:2 env:1236M:8M:0 logo:1252M:8M:1 recovery:1268M:24M:1 misc:1300M:8M:1 dtbo:1316M:8M:1 cri_data:1332M:8M:2 param:1348M:16M:2 boot:1372M:16M:1 rsv:1396M:16M:1 metadata:1420M:16M:1 vbmeta:1444M:2M:1 tee:1454M:32M:1 vendor:1494M:320M:1 odm:1822M:128M:1 system:1958M:1856M:1 product:3822M:128M:1 data:3958M:115318M:4

ampart仓库中的演示脚本之一就是分析上面的第一个快照(脚本友好的十进制),并且作出相应的操作,你可以在这个演示脚本之上修改,添加自动切割每个分区的操作。
不过,你自然是可以根据最后一个真人易读的快照来直接手操用dd分割的
比如,你根据system的分区信息system:1958M:1856M:1,可以用这样的命令把它分割到单独的system.img:

dd if=x3-emmc.img of=system.img bs=1M skip=1958 count=1856

再比如,根据data的分区信息data:3958M:115318M:4,可以用这样的命令把它分割到单独的data.img

dd if=x3-emmc.img of=data.img bs=1M skip=3958 count=115318

然后,你可以用file命令来了解这些分区里面的文件系统:

file [partition.img]

比如system是一个ext2文件系统:

system.img: Linux rev 1.0 ext2 filesystem data, UUID=e143b1cf-29bd-5904-9220-8e7198542e4b (extents) (large files) (huge files)

data是一个ext4文件系统:

data.img: Linux rev 1.0 ext4 filesystem data, UUID=7edb6199-dea8-4702-b0fb-6be592aeb9da (needs journal recovery) (extents) (large files) (huge files)

接下来,你就可以用losetup把这些镜像映射到回环设备上,然后挂载查看/编辑文件了(或者如果你非要用Windows和图形界面,你自然也可以用DiskGenius之类的直接打开这些分区的镜像)。比如

[nomad7ji@laptop7ji images]$ sudo losetup -f --show x3_system.img 
/dev/loop0

这里给x3_system.img分配了一个回环设备/dev/loop0,那么自然,就要把/dev/loop0挂载到一个临时的文件夹去看它的内容

[nomad7ji@laptop7ji images]$ sudo mount -o ro /dev/loop0 /mnt
[nomad7ji@laptop7ji images]$ ls /mnt
acct  bugreports  config  default.prop  init             init.recovery.amlogic.rc  init.usb.rc       metadata  oem      sbin     sys         vendor
bin   cache       d       dev           init.environ.rc  init.root.rc              init.zygote32.rc  mnt       proc     sdcard   system
boot  charger     data    etc           init.rc          init.usb.configfs.rc      lost+found        odm       product  storage  ueventd.rc
s700k commented

我去试试,感谢大佬,祝你早日上岸

s700k commented

贴一下江苏移动 M401A(2+16)S905L3A 原厂固件分区表。

EPT report: 21 partitions in the table:
===================================================================================
ID| name            |          offset|(   human)|            size|(   human)| masks
-----------------------------------------------------------------------------------
 0: bootloader                      0 (   0.00B)           400000 (   4.00M)      0
    (GAP)                                                 2000000 (  32.00M)
 1: reserved                  2400000 (  36.00M)          4000000 (  64.00M)      0
    (GAP)                                                  800000 (   8.00M)
 2: cache                     6c00000 ( 108.00M)         46000000 (   1.09G)      2
    (GAP)                                                  800000 (   8.00M)
 3: env                      4d400000 (   1.21G)           800000 (   8.00M)      0
    (GAP)                                                  800000 (   8.00M)
 4: logo                     4e400000 (   1.22G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 5: recovery                 4f400000 (   1.24G)          1800000 (  24.00M)      1
    (GAP)                                                  800000 (   8.00M)
 6: misc                     51400000 (   1.27G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 7: dtbo                     52400000 (   1.29G)           800000 (   8.00M)      1
    (GAP)                                                  800000 (   8.00M)
 8: cri_data                 53400000 (   1.30G)           800000 (   8.00M)      2
    (GAP)                                                  800000 (   8.00M)
 9: param                    54400000 (   1.32G)          1000000 (  16.00M)      2
    (GAP)                                                  800000 (   8.00M)
10: boot                     55c00000 (   1.34G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
11: rsv                      57400000 (   1.36G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
12: metadata                 58c00000 (   1.39G)          1000000 (  16.00M)      1
    (GAP)                                                  800000 (   8.00M)
13: vbmeta                   5a400000 (   1.41G)           200000 (   2.00M)      1
    (GAP)                                                  800000 (   8.00M)
14: tee                      5ae00000 (   1.42G)          2000000 (  32.00M)      1
    (GAP)                                                  800000 (   8.00M)
15: vendor                   5d600000 (   1.46G)         14000000 ( 320.00M)      1
    (GAP)                                                  800000 (   8.00M)
16: odm                      71e00000 (   1.78G)          8000000 ( 128.00M)      1
    (GAP)                                                  800000 (   8.00M)
17: system                   7a600000 (   1.91G)         50000000 (   1.25G)      1
    (GAP)                                                  800000 (   8.00M)
18: product                  cae00000 (   3.17G)          8000000 ( 128.00M)      1
    (GAP)                                                  800000 (   8.00M)
19: ghost                    d3600000 (   3.30G)         30000000 ( 768.00M)      2
    (GAP)                                                  800000 (   8.00M)
20: data                    103e00000 (   4.06G)        2a0000000 (  10.50G)      4
===================================================================================
ophub commented

看起来现在的armbian-install里面对分区大小的划分很多都少计算了8M的间隙。
现在能默认使用ampart进行分区调整的盒子优势很明显,解决了这个问题。

s700k commented

在ghost分区提取了原厂卡刷包,顺便提取了4个dtb文件,试过不能作为启动使用。

https://www.aliyundrive.com/s/ZXyyXJ44Tmc 提取码 dp53

ghost.img: Linux rev 1.0 ext2 filesystem data (mounted or unclean), UUID=8bb69859-01e2-4f66-a22e-0243cc45d485, volume name "ghost" (extents) (64bit) (large files) (huge files)
total 641024
-rw-r--r-- 1 root root        47 Jan  1  2009 factory_update_param.aml
drwx------ 2 root root     16384 Jan  1  2009 lost+found
-rw-r--r-- 1 root root 656733534 Jan  1  2009 update.zip
ophub commented

网盘是空的。
安卓的dtb不能直接用在armbian里,只能做为参考,写armbian的dtb
https://github.com/ophub/kernel/releases/tag/tools
这有m401a(b863av3.2-m)的原厂系统备份。

s700k commented

网盘是空的。 安卓的dtb不能直接用在armbian里,只能做为参考,写armbian的dtb https://github.com/ophub/kernel/releases/tag/tools 这有m401a(b863av3.2-m)的原厂系统备份。

打包成自解压exe重新上传了,现在应该能看到了。

android_tv_cm311-1a-yst_s905l3a.tar.xz

android_tv_m401a_b863av3.2-m_s905l3a.tar.xz

https://www.znds.com/tv-1224990-1-1.html

https://www.znds.com/tv-1221276-1-1.html

我陆续刷过以上固件,不管是否勾选擦除第一二项,都是卡第一屏,可能手上这个盒子又是什么小改款。说来奇怪,刷机前按照xcray大佬的建议,使用u200.dtb + e900v22c (u-boot.ext),可以从U盘启动,包括扩容、dd备份都没有问题。刷机后只能单独使用u200.dtb才能启动,使用u-boot.ext就无法启动。而且很不稳定,经常死机kernel panic,所以使用dd还原已是不可能。我怀疑跟原厂uboot和分区表有关,我现在想着利用dd备份文件做成救砖包。
另外备份完成后,再次从U盘启动,ddbr目录的备份文件莫名消失了,还好提前拷贝到电脑上,不知是否偶发性bug。
想请教一下o大,安卓的dtb如何转化成armbian可用?

ophub commented

人工写,用到的值可以参考安卓,你可以使用已有的,根据你发现的不同修改相应的节点和值。

7Ji commented

刷机前按照xcray大佬的建议,使用u200.dtb + e900v22c (u-boot.ext),可以从U盘启动,包括扩容、dd备份都没有问题。刷机后只能单独使用u200.dtb才能启动,使用u-boot.ext就无法启动

不要随意混用不同设备的一阶段u-boot(bootloader);二阶段u-boot(overload)大多数情况下可以混用(不过也最好不要混用其他设备的,用当前设备基于的对应Amlogic参考开发板的u-boot是风险较低的,比如gxl的一系列盒子r3300l等大多可以安全地用p212开发板的,毕竟Amlogic的开发板是最大公约数;而用其他盒子的如果有pin定义差别也可能工作不正常或者起不来的)。因为整个bootloader镜像里除了BL33(裸机程序的u-boot.bin)以外还包含有Amlogic和/或厂家闭源的BL2, BL30, BL31, BL301,这几个部分各个厂家可能会根据自己的启动流程作出修改的。
你早先可以用e900v22c的u-boot作为二阶段让你原厂的u-boot去跳转,这是因为你原厂的bootloader还在,里面的BL2, BL30之类的是给你的盒子量身打造的,早期启动的内存布局等比较正常。后面刷入时恐怕e900v22c的bootloader整个盖掉了你的bootloader区,对应的早期启动流程与你设备实际情况不符合,内存布局(主要是0x1000000开始,内核加载区之前)可能没有正常初始化或者莫名地包含了u-boot本身的其他数据,这个时候一阶段u-boot跳转不到二阶段u-bootu-boot.ext对应的裸机程序,所以没法再用它启动了。
补救措施的话,虽然你现在没法进行长时间的系统内操作,你可以把dump镜像内的前4M恢复,这样就会恢复原厂的bootloader。

dd if=emmc-dump.img of=/dev/mmcblk2 bs=1 count=444 conv=fsync,notrunc
dd if=emmc-dump.img of=/dev/mmcblk2 bs=512 skip=1 seek=1 count=8191 conv=fsync,notrunc

具体的Amlogic平台的启动流程可以看我的博客:
https://7ji.github.io/embedded/2022/11/11/amlogic-booting.html#Background--%E8%83%8C%E6%99%AF

利用dd备份文件做成救砖包

这个是可行的,Aml的刷机包格式其实很简单,不过我暂时没时间写怎么做。我自己有hk1 rbox x4用的安卓+CE+EE三系统线刷的包,也有hk1用的直接刷入Armbian/OpenWrt/ArchLinuxARM的包。用到的关键工具就是ampart。明年年初可能会写一下。

s700k commented

刷机前按照xcray大佬的建议,使用u200.dtb + e900v22c (u-boot.ext),可以从U盘启动,包括扩容、dd备份都没有问题。刷机后只能单独使用u200.dtb才能启动,使用u-boot.ext就无法启动

不要随意混用不同设备的一阶段u-boot(bootloader);二阶段u-boot(overload)大多数情况下可以混用(不过也最好不要混用其他设备的,用当前设备基于的对应Amlogic参考开发板的u-boot是风险较低的,比如gxl的一系列盒子r3300l等大多可以安全地用p212开发板的,毕竟Amlogic的开发板是最小公约数;而用其他盒子的如果有pin定义差别也可能工作不正常或者起不来的)。因为整个bootloader镜像里除了BL33(裸机程序的u-boot.bin)以外还包含有Amlogic和/或厂家闭源的BL2, BL30, BL31, BL301,这几个部分各个厂家可能会根据自己的启动流程作出修改的。 你早先可以用e900v22c的u-boot作为二阶段让你原厂的u-boot去跳转,这是因为你原厂的bootloader还在,里面的BL2, BL30之类的是给你的盒子量身打造的,早期启动的内存布局等比较正常。后面刷入时恐怕e900v22c的bootloader整个盖掉了你的bootloader区,对应的早期启动流程与你设备实际情况不符合,内存布局(主要是0x1000000开始,内核加载区之前)可能没有正常初始化或者莫名地包含了u-boot本身的其他数据,这个时候一阶段u-boot跳转不到二阶段u-bootu-boot.ext对应的裸机程序,所以没法再用它启动了。 补救措施的话,虽然你现在没法进行长时间的系统内操作,你可以把dump镜像内的前4M恢复,这样就会恢复原厂的bootloader。

dd if=emmc-dump.img of=/dev/mmcblk2 bs=1 count=444 conv=fsync,notrunc
dd if=emmc-dump.img of=/dev/mmcblk2 bs=512 skip=1 seek=1 count=8191 conv=fsync,notrunc

具体的Amlogic平台的启动流程可以看我的博客: https://7ji.github.io/embedded/2022/11/11/amlogic-booting.html#Background--%E8%83%8C%E6%99%AF

利用dd备份文件做成救砖包

这个是可行的,Aml的刷机包格式其实很简单,不过我暂时没时间写怎么做。我自己有hk1 rbox x4用的安卓+CE+EE三系统线刷的包,也有hk1用的直接刷入Armbian/OpenWrt/ArchLinuxARM的包。用到的关键工具就是ampart。明年年初可能会写一下。

感谢大佬指点,我用原厂recovery把提取的update.zip卡刷回去了,还是卡第一屏,是原厂的开机画面,是否意味着已经恢复原厂bootloader?

7Ji commented

安卓的update.zip不必然包含除了安卓所需要的分区外的其他更底层分区的数据,除非一些跨大版本升级导致Amlogic的u-boot不兼容安卓内核里Amlogic闭源签名的情况(主要就是7.1前安卓原厂镜像带的u-boot不支持Amlogic改过的4.9以后内核,和你的设备无关)。

原厂的开机画面

这个是logo区里储存的,和bootloader区没有联系

刚拆了你的原厂卡刷包,里面有bootloader.img,而且刷写脚本写明刷入

ui_print("update bootloader.img...");
write_bootloader_image(package_extract_file("bootloader.img"));

应该是恢复了

s700k commented

u盘启动armbian还是有问题,我怀疑卡刷不能恢复完整的原厂状态,继续折腾。。。

可以分享一下ddbr备份的文件吗

s700k commented

可以分享一下ddbr备份的文件吗

已添加到网盘。