尝试刷新与dd一起使用的system.img-失败


16

长期从事UNIX的人,但在Android领域相对较新。继续阅读。

第1集:新备份(希望如此)

我最近购买了华硕MemoPAD(ME103K);然后,我成为root用户,并将dd只读system分区的图像镜像到外部SD卡上:

$ su
# dd if=/dev/block/platform/msm_sdcc.1/by-name/system \
         of=/storage/MicroSD/system.img bs=1M
# ls -l /storage/MicroSD/system.img
-rw-r--r-- 1 root root 2147483648 Sep 27 13:15 system.img

大小(恰好是2GiB)有点可疑-可能是因为SD卡上的FAT32分区了吗?

不,它不是- tune2fs -l确实显示这是有效的EXT4图像,大小精确为2GiB,并且fsck -f没有任何错误通过。并且fastboot(在平板电脑附带的linux机器上)同意adb reboot bootloader

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

该大小确实为2GB:

linuxbox# python2 -c 'print 0x0000000080000000'
2147483648

所以,一切都很好-我有图像的备份。现在测试还原它。

我尝试将system.img刷新回平板电脑-确保我可以从任何东西中恢复,这是我们在Unix世界中所做的那种防弹备份(例如通过还原驱动器的内容dd if=backup.image of=/dev/sdXXX)。

一切都与之完美相关adb并且可以fastboot正常工作-所以我尝试...

linux_box# fastboot devices
0a3dXXXX     fastboot

linux_box# mount /dev/sdcard /mnt/sdcard
linux_box# cp /mnt/sdcard/system.img .
linux_box# fastboot flash system system.img
error: cannot load 'system.img'

嗯 我android-tools-5.1.1从源代码下载并构建我的发行版,添加调试信息-并进入调试器,以查看此失败:

linuxbox# gdb --args fastboot flash system system.img
...

因尺寸过大而导致故障!

有趣的是-尽管我使用的是64位计算机,但显然存在使文件大小变为“负”的问题(在32位世界中,我图像的文件大小2 ^ 31实际上被认为是负的),确切地说是-2147483648

好的,很好-它们如何在Android中闪存大图片文件?

谷歌搜索,搜索-事实证明他们使用此make_ext4fs工具创建了可刷新的图像。实际上,这是我刚刚编译的一部分,因此我不妨使用它:

linuxbox# mkdir /system
linuxbox# mount -o loop,ro system.img /system
linuxbox# ls -l /system
total 208
drwxr-xr-x 106 root root   8192 Sep 17 22:24 app
drwxr-xr-x   3 root 2000   8192 Sep 26 21:08 bin
-rw-r--r--   1 root root   6847 Sep 12 16:59 build.prop
drwxr-xr-x  19 root root   4096 Sep 26 21:08 etc
drwxr-xr-x   2 root root   4096 Aug 11 22:27 fonts
drwxr-xr-x   4 root root   4096 Sep 12 16:56 framework
drwxr-xr-x  10 root root  16384 Sep 12 16:59 lib
drwxr-xr-x   2 root root   4096 Jan  1  1970 lost+found
drwxr-xr-x   3 root root   4096 Aug 11 22:18 media
drwxr-xr-x  59 root root   4096 Aug 11 22:29 priv-app
-rw-r--r--   1 root root 126951 Aug  1  2008 recovery-from-boot.p
drwxr-xr-x   3 root root   4096 Aug 11 21:02 scripts
drwxr-xr-x   3 root root   4096 Aug 11 21:02 tts
drwxr-xr-x  11 root root   4096 Sep 26 21:08 usr
drwxr-xr-x   8 root 2000   4096 Aug 11 22:29 vendor
drwxr-xr-x   2 root 2000   4096 Sep 26 21:09 xbin

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 2048M new_system.img /system
Creating filesystem with parameters:
    Size: 2147483648
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 8192
    Label: 
    Blocks: 524288
    Block groups: 16
    Reserved block group size: 127
Created filesystem with 2666/131072 inodes and 375014/524288 blocks

很酷-所以我显然可以从简单的旧文件夹构建系统映像。天空将是我的极限-我将可以在此图像中添加任何我想要的东西。

烧吧...

linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [  0.064s]
sending 'system' (2088960 KB)...
^C

我等了1小时后才按下Ctrl-C。而且必须重启平板电脑,然后以快速启动模式重新启动。

这看起来不好。

如果我生成较小的图像怎么办?也许2GB可能是一个问题,并且此分区无法完全使用-它具有可用空间:

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 1536M new_system.img /system

linuxbox#  ./fastboot flash system system.img 
erasing 'system'...
OKAY [  0.065s]
sending 'system' (1572864 KB)...
OKAY [ 51.039s]
writing 'system'...
OKAY [235.080s]
finished. total time: 286.183s

好的,这看起来很有希望(只花了5分钟)。我想我现在可以重新启动,一切都应该正常了,是吗?

否:-)

在此处输入图片说明

我不介意暂时砖砌设备,只要我不要去控制它到底(机器,我不是大师,是机器我不在乎工作;-)

关于我做错了什么以及我可以做些什么来解决此问题的任何想法?

提前致谢。

PS:我检查了我的平板电脑的Asus支持页面-它们仅提供内核的源代码以及Over-the-air .zip文件。这反过来又包含了从根开始的文件系统级别的备份-即该system文件夹以一个文件夹而不是映像的形式存在于其中,而不是system.img我可以闪存的文件夹-因此这对我没有帮助。

第2集:自定义长靴的袭击

recovery.img华硕的任何形式下(为什么制造商会费心地发布可快速启动的闪存recovery.img?为什么如此...),并且在CWM和TWRP站点上也没有类似的恢复映像...我不得不与所有人抗争单独。

幸运的是,华硕的无线更新文件包含在其中...

linuxbox# unzip -l /opt/Asus/firmware/UL-K01E-WW-12.16.1.12-user.zip |\
     grep boot.img$
7368704  2011-03-22 11:21   boot.img

...我平板电脑的启动映像。现在也许-也许-我可以这样做。

linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage

扩展ramdisk ...

linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop

default.prop当内核启动时,我设置为root:

ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled

我还/system/bin/sh从无线Asus .zip文件中)复制到/sbin/sh。我对busybox也做了同样的事情-非常方便的工具。

并重新包装boot.img ...

busybox$ find . | cpio --create --format='newc' | gzip -9 > ../initrd.custom.gz
busybox$ cd ..
busybox$ abootimg --create ../new_boot_busybox.img \
    -f bootimg.cfg -k zImage -r initrd.custom.gz

abootimg第一次运行时实际上失败了,因为bootimg.cfg必须更新- bootsize必须更改参数,因为程序包现在更大了。abootimg报告所需信息,这很容易。

现在,我启动我的自定义映像...

linuxbox# fastboot boot new_boot_busybox.img

...并见证以下内容...

linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

嗯...也许adbd不是以root身份运行?

linuxbox# adb root
restarting adbd as root

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

很好...我hexedit adbd,并将/ system / bin / sh修补为/ sbin / sh(我将OTA映像中的/ system / bin / sh复制到了initrd的rootfs):重新启动,快速启动...

linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -

真是 这东西能做任何事吗?

linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)

是...让我们看看:

linuxbox# adb pull /proc/mounts
16 KB/s (1358 bytes in 0.079s)

linuxbox# grep system mounts
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0

OK,所以/ system 安装。我可以看看里面有什么吗?

linuxbox# adb pull /system
remote object '/system' does not exist

什么...也许我可以检查/ proc / kmsg包含什么(“ dmesg”将输出什么)

linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted

不,我需要扎根。

linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied

那也是。

事实证明这真是个难题。


2
您在这里没有做(并且应该做的)的唯一好处是,刷新自定义恢复,然后从中获取分区的nandroid备份。这是从这种阻塞状态恢复设备的防弹方法之一。Over-the-air.zip(OTA zip)是可恢复的可恢复压缩zip,即在启动到Recovery时将被刷新,并且它们遵循不同的打包格式,但实现了相同的目标。长话短说,先刷新自定义恢复(或启动到标准版),再刷新ROM,然后根据需要进行多次尝试。
Firelord

1
@Firelord:就是这样-尽管fastboot仍然可以运行(对请求的响应很好),所以我可以刻录任何恢复映像,(a)我搜索并没有找到ME103K的CWM或TWRP恢复映像-我不认为有您所指的是“通用”的,在那里吗?(b)关闭电源,按电源按钮+降低音量不会调出恢复映像-我仍然只是进入fastboot状态。莫知道为什么。实际上,我从未见过恢复过程(有点好奇地看到它)...
ttsiodras 2015年

1
尝试使用其他按钮组合(例如Power + Vol Up + Vol Down)启动到恢复模式。如果您可以访问stock Recovery ZIP,则可能存在某个地方的stock Recovery图像文件,您可以从fastboot刷新该文件,也可以直接将其引导到(fastboot boot <FILE>.img),然后刷新整个stock ZIP文件。或者,查看(在Web上)是否存在可以使用fastboot刷新的常规ROM文件。
Firelord

1
@Firelord:不,华硕没有提供recovery.zip。在OTA文件中,没有任何.img-y(unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery仅显示了几个shell脚本-我来看一下,但绝对没有recovery.img)。谷歌搜索也无济于事-这款平板电脑没有恢复图像...猜猜我将不得不等待某种灵魂来dd恢复分区并共享吗?
ttsiodras 2015年

Answers:


7

第3集:炮弹归来。

如果我有解决这个问题的机会,我首先必须弄清楚为什么Shell无法正常工作。adbd本身正在响应,因此它是在平板电脑端启动的-但是即使我用黑补丁修补了它以调用/sbin/sh我自己放置在启动映像中的文件(),它也无法执行外壳-确保100%确保其具有适当的权限,并且可以从使用的shell(id = 2000)帐户进行访问adbd

其中只剩下一种解释-SELinux的“笼子”。

所以我检查了如何adbd从启动映像开始init.rc

# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
    class core
    socket adbd stream 660 system system
    disabled
    seclabel u:r:adbd:s0

...并尝试了一个明显的改变:

service adbd /sbin/adbd
    class core
    socket adbd stream 660 system system

我重新包装,并令我非常满意,看到了...

linuxbox# adb shell
$ 

我终于可以从“内部”访问平板电脑了。

检查安装/系统,人们清楚地看到闪烁的过程-尽管fastboot flash system ...报告说,所有被确定-未能壮观。奇怪的是,该隔板是首先安装的。

这就解释了为什么平板电脑无法启动,并给了我解决该问题的最终想法。

我需要启动平板电脑,以便它使用/ system分区的原始副本,但是在这一点上,即使我具有shell访问权限,我也不是root用户-(华硕内核显然忽略了我所做的更改default.prop-我将不得不尽快重新编译...),因此无法挂载外部sdcard并dd覆盖我的良好副本。

但是我确实有自己的启动映像-这意味着我可以编辑其中的启动映像/fstab.qcom,并执行以下操作:

告诉平板电脑如何挂载/ system的原始行

/dev/block/platform/msm_sdcc.1/by-name/system  /system  ext4 ro,barrier=1 wait

我的编辑

/dev/block/mmcblk1p2  /system ext4  rw,barrier=1 wait

...然后回到我的linux框中,dd将平板电脑系统分区的原始备份放到了外部SD卡的第二分区上-我通过创建的第二分区gparted恰好是2GB。

做到了-平板电脑从我的外部SD卡启动。

编辑:旅程继续进行-我最终修补并编译了自己的内核并成为root


2
我向第4集发誓,如果没有回答这个问题,我会提供赏金,以使所有这些情节变得有趣。很高兴看到您自己解决了问题。:D
Firelord

2
@Firelord:谢谢,队友。在此过程中,我认为我做了一些很酷的事情-在不触摸平板电脑内部的情况下启动了我的平板电脑...启动映像来自外部(位于上方fastboot boot ...),/system分区位于SD卡上,可根据我的需要进行调整。
有点

4

看来你已经找到某种解决您的问题(有大量的文字阅读此页),但似乎这可能会被更简单地解决。

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

在这些变量中,您的平板电脑是否返回了max-download-size变量?如果是这样,那可能会直接警告说,刷新过程可能与大图像有关。当前的fastboot代码可以在max-download-size太小的环境下工作,但是即使图像小于设备所能处理的大小,我也遇到了同样的错误,所以我想这实际上是有争议的。

linux_box# fastboot flash system system.img  
error: cannot load 'system.img'

因此,无论如何,无论出于何种原因,您似乎都无法闪烁。如果您和我说对了,而且大小差不多(您的平板电脑只有1 GB的RAM,并且据说大多数设备会在刷新前尝试将整个图像读取到RAM中),这就是我对添加-S选项的唯一调整快速启动可能已经修复了您的闪存,对我而言:

fastboot -S 512M flash system system.img  

但是,相反,您似乎试图将2 GB映像强制设置为以下大小:(1)可能无法将其塞入其中;(2)并非设备系统分区应该具有的大小。

  • 关于第一点,根据我的经验,我不会指望脆弱的Android构建工具来抱怨您是否要求他们做一些他们会失败的事情,并且可能它们在这里。

  • 关于第二点,我不相信你不能这样做。使用不同的系统分区大小将需要其他步骤。

假设你的平板电脑预计稀疏的图像文件,我相信你想尝试,而不是命令make_ext4fs -l 1536M new_system.img /systemmake_ext4fs -l 2048M -s new_system.img /system。调整后的命令将使图像膨胀到正确的大小,但会暂时删除任何多余的脂肪,例如大的空数据口袋:“ 稀疏图像文件”(有关这些信息,请参阅我先前链接的页面;我在这个网站上的信誉不高,无法重复链接。

有人为工具集编写的旧自述文件应该有助于理解过程的进行。

干杯。


1
谢谢回答。关于您的问题,(1)不,max-download-的输出中没有任何内容getvar。(2)-S在以后的闪烁中,我会记住该选项-因为这样,一旦启动,我将成为root用户(通过重新编译内核)并dd在旧的系统分区上进行-ed操作,因此使用-S闪烁是否可以工作必须等待我的下一个测试(3)我确实尝试了稀疏映像,得到了相同的结果(即fastboot报告闪烁是可以的,但是系统分区被弄乱了)。
ttsiodras 2015年

1
@ttsiodras没问题。我在此过程中学到了一些东西。(1)啊,好的。我怀疑它是否确实如此,至少在我使用已安装的fastboot构建的设备上,该变量是否首先显示在列表中(感谢btw,因为它表明all可以传递给getvar -这很有用)。(2)哦,好的。如果有效,请告知我们。(3)哎呀!我没注意到。很抱歉,有很多文字。您的帖子中提到了吗?(就像我建议的make_ext4fs命令一样,-s并指定了2 GiB的完整长度吗?)也许平板电脑处理稀疏文件。
naki 2015年

1
(3)是的,我传递-s给make_ext4fs-fastboot报告'OK'正在进行刻录,但是/ system混乱了。我的理论是,正如您所说,任何大于平板电脑内存(1GB)的内容都将无法正常工作,并且需要快速启动中的-S选项才能正常工作(这解释了半中断状态-分区已挂载,因为第一部分映像的大小适合内存并且实际上已被刻录,可以挂载-但其中的文件被随机破坏,具体取决于扇区是否被刻录。
ttsiodras 2015年

2

与我一样,Moto GI使用dd创建了一个备份。前几天我需要恢复系统分区,所以我启动了TWRP(我没有刷新它,只是将映像启动到了RAM)。然后,当TWRP运行时,我使用adb进行连接,然后将用dd制作的img推送到SD卡中,然后使用dd将映像写入系统分区。

在此处查看我制作的有关此视频:https : //youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq


不幸的是,这无济于事-无论我尝试使用哪种键组合,我都无法达到平板电脑的恢复能力(相比之下,我立即在MotoG2上获得了它-因此该平板电脑的恢复能力有所提高)。我可以刷新恢复分区(因为flashboot可以运行),但是我没有recovery.img华硕提供的信息,也没有CWM或TWRP(对于ME103K)。
ttsiodras
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.