ddで撮影したsystem.imgをフラッシュしようとしています-失敗しています


16

ここでは長年UNIXをやっていますが、Androidの世界では比較的新しいです。読む。

エピソード1:新しいバックアップ(希望)

最近、Asus MemoPAD(ME103K)を購入しました。その後、ルートになり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これは実際に、正確に2GiBのサイズの有効なEXT4イメージであり、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ます)

OK、大丈夫-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

Ctrl-Cを押す前に1時間待機しました。また、タブレットの電源を入れ直し、fastbootモードで再起動する必要がありました。

これは見栄えがよくありません。

より小さなイメージを作成したらどうなりますか?おそらく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

OK、これは非常に有望に見えます(5分しかかかりませんでした)。これで再起動できるようになり、すべてが正常になります。

番号 :-)

ここに画像の説明を入力してください

最終的にそれを制御することできる限り、一時的にブリックされたデバイスを気にしません(私がマスターではないマシンは、私が操作することを気にしないマシンです;-)

私が間違ったことや、これを修正するためにできることについてのアイデアはありますか?

前もって感謝します。

PSタブレットのAsusサポートページを確認しました。カーネルのソースとOver-the-air .zipファイルのみが提供されています。これには、ルートからのファイルシステムレベルのバックアップが含まれています。つまり、systemフォルダは、イメージではなく、system.imgフラッシュできるフォルダとしてのみ存在します。

エピソード2:カスタムブーツの攻撃

recovery.imgAsusのあらゆる種類の不在(なぜ、メーカーがfastboot-flashableを公開するのをわざわざするのrecovery.imgでしょうか?確かに...)と、CWMおよびTWRPサイトからのリカバリイメージに同様の不在があります...一人で。

ありがたいことに、AsusのOver-the-air更新ファイルにはその中に含まれています...

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

RAMディスクを展開しています...

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/shbusyboxでも同じことをしました -非常に便利なツールです。

そして、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

abootimgbootimg.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) -

ファイン... adbdを16進編集し、/ system / bin / shを/ sbin / shにパッチします(OTAイメージからinitrdのrootfsに/ system / bin / shをコピーしました):再起動、高速起動...

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バックアップを取得することです。これは、そのようなブリック状態からデバイスを回復するための防弾方法の1つです。Over-the-air.zip(OTA zip)はリカバリ用のフラッシュ可能なzipです。つまり、Recoveryを起動したときにフラッシュされ、異なるパッケージ形式に従いますが、同じ目標を達成します。簡単に言えば、カスタムリカバリをフラッシュ(またはストックリカバリで起動)し、ストックROMをフラッシュして、必要なだけ実験します。
消防士

1
@Firelord:それが問題です- fastbootまだ動作しているにも関わらず(リクエストに正常に応答します)、したがってリカバリイメージを書き込むことができます。あなたが言及している「一般的な」ものはありますか?(b)電源をオフにし、電源ボタンを押して音量を下げても、リカバリイメージは表示されません-まだfastboot状態になります。Moの理由。実際、私は回復プロセスを見たことがありません(それを見ることに興味があります)
...-ttsiodras

1
Power + Vol Up + Vol Downなどの他のボタンの組み合わせを試して、リカバリモードで起動します。ストックリカバリZIPにアクセスした場合、ストックリカバリのイメージファイルがどこかにあり、fastbootからフラッシュするか、直接ブートして(fastboot boot <FILE>.img)、ストックZIPファイル全体をフラッシュできます。または、fastbootを使用してフラッシュできるストックROMファイルが(Web上に)存在するかどうかを確認します。
消防士

1
@Firelord:いいえ、Asusはrecovery.zipを提供していません。OTAファイルからは、.img-yは何もありません(unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recoveryシェルスクリプトを2、3だけ示しています-見ていきますが、間違いなくrecovery.imgありません)。グーグルも助けにならなかった-このタブレットの回復画像はどこにもありません... dd回復パーティションと共有に何らかの親切な魂を待たなければならないと思いますか?
ttsiodras

回答:


7

エピソード3:シェルの帰還。

これを解決する機会があったら、まずシェルが機能しなかった理由を理解する必要がありました。adbdそれ自体が応答していたので、タブレット側で開始されました-しかし/sbin/sh、ブートイメージに自分自身で配置したファイル()を呼び出すためにハックパッチを適用しても、シェルを実行できませんでした-適切なアクセス許可があり、使用するshell(id = 2000)アカウントからアクセス可能adbdでした。

説明は1つだけでした。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 ...失敗した-すべてがOKだったことを報告見事。そもそもパーティションがマウントされているのは不思議でした。

タブレットが起動しない理由を説明し、問題を解決する最後のアイデアを教えてくれました。

/ systemパーティションの元のコピーを使用するようにタブレットを起動する必要がありましたが、この時点で、シェルにアクセスできたにもかかわらず、ルートではありませんでした-(行った変更default.propは明らかにAsusカーネルによって無視されます-すぐに再コンパイルする必要があります...)そのため、外部SDカードをマウントできなかったため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カードの2番目のパーティションに作成しgpartedました。

それはそれをやった-タブレットは私の外部SDカードから起動しました。

編集:旅は続いた-私は最終的に自分のカーネルにパッチを適用してコンパイルし、ルートになった


2
私はエピソード4を誓いますが、これらすべてのエピソードの楽しみのために、この回答が掲載されていなければ賞金を提供していたでしょう。あなたが自分で問題を解決したのを見るのは良いことです。:D
ファイヤーロード

2
@Firelord:ありがとう、仲間。その過程で、かなりクールなことをしたと思います-内側に触れずにタブレットを起動しました...ブートイメージは外側(上fastboot boot ...)から来て、/systemパーティションはSDカード上にあり、必要に応じて調整できます。USBスティックからPCを起動するようなものです:-)
ttsiodras

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を実行すると、フラッシュが修正された可能性があります。

fastboot -S 512M flash system system.img  

ただし、代わりに、2 GBのイメージを(1)詰め込めないサイズにし、(2)デバイスのシステムパーティションが想定されているサイズではないサイズに強制しようとしたようです。

  • ポイント#1に関して、私の経験では、壊れやすいAndroidビルドツールが、失敗する何かをするように頼んでも文句を言うことを期待していません。ここにあるかもしれません。

  • ポイント#2に関して、私はあなたがただそれをすることができないとは思わない。別のシステムパーティションサイズを使用するには、追加の手順が必要になります。

タブレットを期待スパースイメージファイルを仮定すると、私はコマンドがあなたの代わりに試してみたかったと信じていmake_ext4fs -l 1536M new_system.img /systemましたmake_ext4fs -l 2048M -s new_system.img /system。調整されたコマンドは、正しいサイズに膨らむイメージを作成しますが、空のデータの大きなポケットのような余分な脂肪を一時的に除去して保存されます。「スパースイメージファイル」このサイトでリンクを繰り返すほどの評判はありません)。

誰かがツールのコレクションのために書いたこの古いreadmeは、プロセスがどのように進むかを理解するのに役立つはずです。

乾杯。


1
回答ありがとうございます。質問に関しては、(1)いいえ、max-download-からの出力には何もありませんでしたgetvar。(2)-S将来のフラッシュのオプションを念頭に置いてください-そのままブートすると、(カーネルの再コンパイルによって)rootになりdd、古いシステムパーティションで-edされるので、-Sを使用したフラッシュが機能するかどうか次のテストを待つ必要があります(3)スパースイメージを試してみましたが、同じ結果が得fastbootられました(つまり、フラッシュは問題ないと報告されましたが、システムパーティションが台無しになりました)。
ttsiodras

1
@ttsiodras問題ありません。その過程でいくつかのことを学びました。(1)ああ、わかりました。少なくとも、インストールしたfastbootのビルドを使用するデバイスでは、その変数がリストの最初に出力されるallことを疑いました(getvarに渡すことができることを示してくれてありがとう、参考になりました)。(2)ああ、大丈夫。機能する場合はお知らせください。(3)おっと!私はそれに気づかなかった。テキストがたくさんあります、ごめんなさい。それはあなたの投稿で言及されましたか?(私が提案したmake_ext4fsコマンドと-s2 GiBの完全な長さを指定したのは好きでしたか?)たぶん、タブレットスパースファイルを処理しません
naki

1
(3)-sはい、make_ext4fs に渡しました-fastbootは書き込みに「OK」を報告しましたが、/ systemが台無しになりました。私の理論では、あなたが言ったように、タブレットのメモリ(1GB)よりも大きいものは動作せず、-S適切に動作するためにfastboot のオプションが必要でした(半分壊れた状態を説明します-パーティションは最初の部分でマウントされました画像の一部がメモリに収まり、実際に書き込まれたため、マウントできましたが、その中のファイルは...セクタが書き込まれたかどうかに応じてランダムに破損していました)。
ttsiodras

2

私のMoto GIでは、ddを使用してバックアップを作成しました。先日、システムパーティションを復元する必要があったので、TWRPを起動しました(フラッシュせず、イメージをRAMに起動しただけです)。次に、TWRPの実行中にadbを使用して接続し、ddで作成したimgをSDカードにプッシュし、ddを使用してシステムパーティションにイメージを書き込みました。

これについて私が作ったビデオをここでチェックしてください:https : //youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq


残念ながらそれは私を助けません-試したキーの組み合わせに関係なくタブレットの回復に到達することはできません(対照的に、私はMotoG2ですぐにそれを取得しました-したがって、このタブレットの回復は何らかの形でホースです)。リカバリパーティションをフラッシュできます(フラッシュブートが動作recovery.imgしているため)
ttsiodras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.