Mencoba mem-flash system.img yang saya ambil dengan dd - gagal

16

Orang UNIX lama di sini, tetapi relatif baru ke dunia Android. Baca terus.

EPISODE 1: Cadangan Baru (saya berharap)

Saya baru saja membeli Asus MemoPAD (ME103K); Saya kemudian menjadi root, dan mengambil ddgambar dari systempartisi read-only ke kartu SD eksternal:

$ 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

Ukurannya (tepatnya 2GiB) agak mencurigakan - mungkinkah ini karena partisi FAT32 pada kartu SD?

Tidak, tidak - tune2fs -lterungkap bahwa ini memang, gambar EXT4 yang valid, berukuran persis 2GiB, yang berlalu fsck -ftanpa kesalahan sama sekali. Dan fastboot(dari mesin linux yang terpasang pada tablet) menyetujui, setelah 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

Ukuran itu, memang 2GB:

linuxbox# python2 -c 'print 0x0000000080000000'
2147483648

Jadi, semuanya baik - saya punya cadangan gambar. Sekarang untuk menguji memulihkannya.

Saya mencoba mem-flash sistem. Img kembali ke tablet - untuk memastikan saya dapat pulih dari apa pun, jenis cadangan anti peluru yang kami lakukan di dunia Unix ( mis. Pulihkan isi drive melaluidd if=backup.image of=/dev/sdXXX ).

Segala sesuatu yang terkait adbdan fastbootbekerja dengan sempurna - jadi saya mencoba ...

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'

Hmm. Saya mengunduh dan membangun android-tools-5.1.1distribusi saya dari sumber, menambahkan informasi debug - dan melangkah dalam debugger, untuk melihat kegagalan ini:

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

Kegagalan karena ukuran negatif!

Menarik - walaupun saya berada di mesin 64bit, ternyata ada masalah yang mengubah ukuran file "negatif" (di dunia 32bit, ukuran file gambar saya, 2 ^ 31, memang dianggap negatif - tepatnya -2147483648,.

OK, baik - bagaimana mereka mem-flash file gambar besar di Android?

Googling, cari - ternyata mereka menggunakan make_ext4fsalat ini , yang menciptakan gambar yang dapat di-flash. Sebenarnya itu adalah bagian dari apa yang baru saja saya kompilasi, jadi saya sebaiknya menggunakannya:

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

Keren - jadi saya bisa membangun gambar sistem dari folder lama. Langit akan menjadi batas saya - saya akan dapat menambahkan apa pun yang saya inginkan ke gambar ini.

Ayo bakar saja ...

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

Saya menunggu 1 jam sebelum menekan Ctrl-C itu. Dan harus menghidupkan siklus tablet, yang melakukan boot kembali dalam mode fastboot.

Ini tidak terlihat bagus.

Bagaimana jika saya membuat gambar yang lebih kecil? Mungkin 2GB entah bagaimana merupakan masalah, dan partisi ini tidak digunakan untuk kapasitas penuh - ia memiliki ruang kosong:

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, ini terlihat sangat menjanjikan (dan hanya butuh 5 menit). Saya kira saya sekarang bisa reboot dan semuanya harus normal, ya?

Tidak :-)

masukkan deskripsi gambar di sini

Saya tidak keberatan perangkat sementara bata, selama saya tidak bisa mengontrolnya pada akhirnya (mesin yang saya bukan master, adalah mesin aku tidak peduli untuk beroperasi ;-)

Adakah ide tentang kesalahan saya dan apa yang dapat saya lakukan untuk memperbaikinya?

Terima kasih sebelumnya.

PS Saya memeriksa halaman dukungan Asus untuk tablet saya - mereka hanya menyediakan sumber untuk kernel, dan file .zip Over-the-air. Yang pada gilirannya berisi cadangan tingkat sistem file dari root - yaitu systemfolder ada di sana hanya sebagai folder, bukan gambar, bukan system.imgyang bisa saya flash - sehingga tidak benar-benar membantu saya.

EPISODE 2: Serangan Boots Kustom

Dengan tidak adanya apapun recovery.imgdari Asus (mengapa produsen repot-repot menerbitkan fastboot-flashable recovery.img? Mengapa memang ...) dan ketidakhadiran yang serupa pada gambar pemulihan dari situs CWM dan TWRP ... Saya dibiarkan berperang semua sendirian.

Untungnya, file pembaruan Over-the-air dari Asus termasuk di dalamnya ...

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

... gambar boot tablet saya. Sekarang mungkin - mungkin saja - saya bisa melakukan sesuatu dengan ini.

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

Memperluas ramdisk ...

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

Saya mengatur default.propuntuk menjadi root ketika kernel melakukan boot:

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

Saya juga menyalin /system/bin/sh( dari file .zip Asus over-the-air ) ke /sbin/sh. Saya melakukan hal yang sama dengan busybox - alat yang cukup berguna.

Dan mengemas ulang 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

abootimgsebenarnya gagal saat pertama kali saya menjalankan ini, karena bootimg.cfgharus diperbarui - bootsizeparameternya harus diubah, karena paketnya lebih besar sekarang. abootimgmelaporkan apa yang dibutuhkan, jadi itu cukup mudah.

Dan sekarang, saya mem-boot gambar khusus saya ...

linuxbox# fastboot boot new_boot_busybox.img

... dan saksikan yang berikut ...

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

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

Hmm ... Mungkin adbd tidak dijalankan sebagai root?

linuxbox# adb root
restarting adbd as root

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

Baik ... Saya hexedit adbd, dan patch / system / bin / sh menjadi / sbin / sh (saya menyalin / system / bin / sh dari gambar OTA ke rootfs dari initrd): Reboot, fastboot ...

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

Menisik. Apakah hal ini dapat melakukan apa saja?

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

Ini adalah ... mari kita lihat:

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, jadi / sistem sudah terpasang. Bisakah saya melihat apa yang ada di dalamnya?

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

Apa ... Mungkin saya dapat memeriksa isi / proc / kmsg (apa yang akan dihasilkan "dmesg")

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

Nah, saya harus menjadi root untuk melakukan itu.

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

Dan itu juga.

Ini ternyata menjadi teka-teki yang cukup ...

ttsiodras
sumber
2
Satu-satunya hal baik yang tidak Anda lakukan di sini (dan seharusnya dilakukan) adalah mem-flash Pemulihan kustom dan kemudian mengambil cadangan nandroid dari partisi dari itu. Itu salah satu metode antipeluru di luar sana untuk memulihkan perangkat dari keadaan seperti itu. Over-the-air.zip (OTA zip) itu adalah zip pemulihan yang dapat di-flash yaitu untuk di-flash ketika di-boot ke Recovery dan mereka mengikuti format pengemasan yang berbeda tetapi mencapai tujuan yang sama. Singkatnya, flash Pemulihan khusus (atau boot ke stock satu), flash stock ROM dan kemudian bereksperimen sebanyak yang Anda inginkan.
Firelord
1
@Firelord: Itulah masalahnya - meskipun fastbootmasih operasional (menanggapi permintaan dengan baik) dan karena itu saya dapat membakar gambar pemulihan, (a) Saya mencari dan tidak menemukan gambar pemulihan CWM atau TWRP untuk ME103K - Saya tidak mengira ada "generik" yang Anda maksudkan, bukan? (B) Mematikan, menekan tombol power + volume turun tidak memunculkan gambar pemulihan - Saya masih saja bisa fastboot state. Mo tahu kenapa. Sebenarnya saya belum pernah melihat proses pemulihan (agak penasaran melihatnya) ...
ttsiodras
1
Coba kombinasi tombol lain seperti Power + Vol Up + Vol Down untuk mem-boot ke mode Recovery. Jika Anda memiliki akses ke ZIP Pemulihan stok, maka mungkin ada file gambar Pemulihan stok di suatu tempat yang dapat Anda flash dari fastboot atau langsung boot ke dalamnya ( fastboot boot <FILE>.img), lalu mem- flash seluruh file ZIP stock. Atau, lihat apakah ada (di web) file-file stock ROM yang dapat di-flash menggunakan fastboot.
Firelord
1
@Firelord: Tidak, Asus tidak menyediakan pemulihan.zip. Dari file OTA, tidak ada .img-y ( unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recoveryhanya menampilkan beberapa skrip shell - Saya akan melihat-lihat, tapi pasti tidak recovery.imgada di sana). Googling juga tidak membantu - tidak ada gambar pemulihan tablet ini di mana pun ... Tebak saya harus menunggu beberapa jenis jiwa untuk ddpartisi pemulihan mereka dan berbagi?
ttsiodras

Jawaban:

7

Episode 3: Kembalinya Shell.

Jika saya pernah memiliki kesempatan untuk menyelesaikan ini, pertama-tama saya harus mencari tahu mengapa shell tidak berfungsi. adbditu sendiri merespons, jadi itu dimulai pada sisi tablet - tetapi tidak dapat menjalankan shell, bahkan ketika saya hack-patched untuk memohon file ( /sbin/sh) yang saya sendiri ditempatkan di gambar boot - menjadi 100% yakin bahwa itu memiliki izin yang tepat dan dapat diakses dari shellakun (id = 2000) yang adbdmenggunakan.

Yang tersisa hanya satu penjelasan - SELinux "kandang".

Jadi saya memeriksa bagaimana adbdmemulai dari image boot saya 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

... dan mencoba perubahan yang jelas:

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

Saya dikemas ulang, dan untuk kepuasan saya, melihat ...

linuxbox# adb shell
$ 

Saya akhirnya mendapat akses ke tablet - dari "di dalam".

Memeriksa mount / sistem, menjadi jelas bahwa proses flashing - meskipun fastboot flash system ...melaporkan bahwa semuanya OK - telah gagal secara spektakuler . Sungguh mengherankan bahwa partisi itu dipasang di tempat pertama.

Itu menjelaskan mengapa tablet tidak bisa boot, dan memberi saya ide terakhir yang menyelesaikan masalah.

Saya perlu mem-boot tablet agar menggunakan salinan asli partisi sistem saya, tetapi pada titik ini, walaupun saya memiliki akses shell, saya tidak root - ( perubahan yang saya lakukan default.proptampaknya diabaikan oleh kernel Asus - Saya harus mengkompilasi ulang segera ... ) jadi saya tidak bisa memasang sdcard eksternal dan ddsalinan saya yang baik.

Tetapi saya memang memiliki image boot saya sendiri - yang berarti saya dapat mengedit bagian /fstab.qcomdalamnya, dan melakukan ini:

Baris asli yang memberi tahu tablet cara memasang / sistem

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

Hasil edit saya

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

... dan kembali ke kotak linux saya, saya dd mencadangkan cadangan asli dari partisi sistem tablet ke partisi ke-2 kartu SD eksternal saya - yang saya buat gparteddengan persis 2GB.

Itu berhasil - tablet boot dari kartu SD eksternal saya.

EDIT : Perjalanan berlanjut - Saya akhirnya menambal dan mengkompilasi kernel saya sendiri dan menjadi root .

ttsiodras
sumber
2
Saya bersumpah untuk Episode 4, saya akan menawarkan hadiah jika jawaban ini tidak diposting, demi kesenangan dari semua episode ini. Senang melihat Anda memecahkan masalah Anda sendiri. : D
Firelord
2
@Firelord: Terima kasih, sobat. Dalam prosesnya, saya pikir saya melakukan sesuatu yang agak keren - Saya mem-boot tablet saya tanpa menyentuh bagian dalamnya ... gambar booting datang dari luar (lebih fastboot boot ...) dan /systempartisi ada di kartu SD, dapat disesuaikan dengan apa pun yang saya inginkan.
Agak
4

Tampaknya Anda sudah menemukan semacam solusi untuk masalah Anda (ada banyak teks untuk dibaca di halaman ini), tetapi sepertinya ini mungkin bisa diselesaikan dengan lebih sederhana.

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

Di antara variabel-variabel ini, apakah tablet Anda mengembalikan max-download-sizevariabel? Jika demikian, itu mungkin telah memberikan peringatan, langsung, bahwa proses flashing mungkin memiliki beberapa masalah dengan gambar sebesar itu. Kode fastboot saat ini dibuat untuk mengatasi masalah max-download-sizeyang terlalu kecil, tapi saya sudah mengalami kesalahan yang sama bahkan ketika gambar lebih kecil dari apa yang bisa ditangani oleh perangkat, jadi sebenarnya intinya adalah jenis moot, saya kira.

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

Jadi, bagaimanapun, tampaknya di sini, bahwa untuk alasan apa pun, Anda tidak dapat melakukan flash. Jika Anda dan saya benar, dan ini tentang ukuran (tablet Anda hanya memiliki 1 GB RAM, dan konon sebagian besar perangkat mencoba membaca seluruh gambar menjadi RAM sebelum mem-flash ), ini adalah tempat saya pikir penyesuaian penyesuaian hanya menambahkan -Sopsi untuk fastboot mungkin telah memperbaiki flash Anda seperti untuk saya:

fastboot -S 512M flash system system.img  

Namun, sebaliknya, Anda mencoba memaksakan gambar 2 GB Anda ke ukuran yang (1) tidak memungkinkan untuk dimasukkan ke dalamnya dan (2) bukan ukuran partisi sistem perangkat Anda seharusnya.

  • Mengenai poin # 1, dalam pengalaman saya, saya tidak akan mengandalkan alat build Android rapuh untuk mengeluh jika Anda meminta mereka untuk melakukan sesuatu yang mereka akan gagal, dan mungkin saja mereka ada di sini.

  • Mengenai poin # 2, saya tidak percaya Anda tidak bisa melakukan itu; langkah tambahan akan diperlukan untuk menggunakan ukuran partisi sistem yang berbeda.

Dengan asumsi tablet mengharapkan Anda jarang file gambar, saya percaya perintah Anda ingin mencoba bukan make_ext4fs -l 1536M new_system.img /systemitu make_ext4fs -l 2048M -s new_system.img /system. Perintah yang disesuaikan akan membuat gambar yang mengembang ke ukuran yang benar, tetapi disimpan sementara dihapus dari kelebihan lemak seperti kantong besar data kosong: " file gambar jarang " (lihat halaman saya tautkan sebelumnya untuk info lebih lanjut tentang mereka; Saya tidak memiliki reputasi yang cukup di situs ini untuk mengulangi tautannya).

Readme lama ini yang ditulis seseorang untuk koleksi alat harus membantu memahami bagaimana prosesnya.

Bersulang.

naki
sumber
1
Terimakasih telah menjawab. Mengenai pertanyaan Anda, (1) tidak, tidak ada max-download-output apa pun dari getvar. (2) Saya akan mengingat -Sopsi di flashings masa depan saya - seperti itu, setelah saya boot, saya menjadi root (melalui kompilasi ulang kernel saya) dan dd-ed di atas partisi sistem yang lama, jadi apakah flashing dengan -S akan bekerja akan harus menunggu tes saya berikutnya (3) Saya memang mencoba dengan gambar jarang, mendapat hasil yang sama (yaitu fastbootmelaporkan bahwa flashing itu OK, tetapi partisi sistem kacau).
ttsiodras
1
@ttsiodras Tidak masalah. Saya belajar beberapa hal dalam proses itu. (1) Ah, baiklah. Saya ragu apakah itu, karena setidaknya pada perangkat saya menggunakan build fastboot yang telah saya instal, variabel itu dicetak pertama dalam daftar (terima kasih, btw, untuk menunjukkan bahwa alldapat diteruskan ke getvar - itu membantu). (2) Ohh, baiklah. Jika berhasil, beri tahu kami. (3) Aduh! Saya tidak memperhatikan itu. Ini banyak teks, maaf. Apakah itu disebutkan dalam posting Anda? (Apakah itu seperti perintah make_ext4fs yang saya sarankan, dengan -sdan panjang penuh 2 GiB yang ditentukan?) Mungkin tablet tidak berurusan dengan file jarang.
naki
1
(3) ya, saya beralih -ske make_ext4fs - fastboot melaporkan 'OK' untuk pembakaran, tetapi / sistem kacau. Teori saya adalah bahwa, seperti yang Anda katakan, apa pun yang lebih besar dari memori tablet (1GB) tidak akan berfungsi, dan memerlukan -Sopsi di fastboot untuk berfungsi dengan baik (yang menjelaskan keadaan setengah rusak - partisi dipasang karena bagian pertama dari gambar yang pas di memori dan benar-benar dibakar, memungkinkan untuk dipasang - tetapi file di dalamnya ... rusak secara acak, tergantung pada apakah sektor mereka dibakar atau tidak).
ttsiodras
2

Dengan Moto saya, GI membuat cadangan menggunakan dd seperti yang Anda lakukan. Saya perlu memulihkan partisi sistem saya beberapa hari yang lalu, jadi saya mem-boot TWRP (saya tidak mem-flash-nya, saya hanya mem-boot image ke RAM). Saya kemudian menggunakan adb untuk terhubung ketika TWRP berjalan dan saya hanya mendorong img yang saya buat dengan dd ke kartu SD saya dan kemudian menggunakan dd untuk menulis gambar ke partisi sistem.

Lihat video yang saya buat tentang ini di sini: https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq

Metalx1000
sumber
Sayangnya itu tidak membantu saya - saya tidak bisa mendapatkan pemulihan tablet saya tidak peduli apa kombinasi tombol yang saya coba (sebaliknya, saya mendapatkannya langsung di MotoG2 saya - jadi pemulihan tablet ini entah bagaimana disembunyikan). Saya dapat mem-flash partisi pemulihan (karena flashboot sedang beroperasi) tetapi saya tidak punya recovery.imgdari Asus, dan tidak ada CWM atau TWRP (untuk ME103K) juga.
ttsiodras