So stellen Sie ein Image der Android-Partition von meinem Linux-PC wieder her

Ich habe wie in dieser Frage beschrieben ein Image meiner Flash-Festplatte meines Nexus 4 erstellt

# adb pull /dev/block/mmcblk0 mmcblk0.img

Das Bild ist voll funktionsfähig, aber ich möchte dieses Bild auf mein Telefon zurückschieben und der umgekehrte Befehl funktioniert nicht, da er für immer dort bleibt und keine Änderung vorgenommen wird.

# adb push mmcblk0.img /dev/block/mmcblk0

Wie kann ich dieses Bild zurück auf mein Telefon übertragen?

Antworten (3)

Ich hatte dieses Problem beim Versuch, ein Backup meines Samsung Galaxy S2 mithilfe von ADB mit dem CWM-Wiederherstellungstool (Clockworkmod) zurückzuschieben. Beim Pushen in eine Gerätedatei löscht ADB einfach die Blockgerätedatei und erstellt an ihrer Stelle eine reguläre Datei, sodass tatsächlich keine Daten auf dem mmcblk0-Gerät landen.

Leider ist auch das Weiterleiten der Ausgabe eines Befehls in "adb shell" nicht implementiert, und die Unix-Socket-Funktion "adb forward" scheint auch nicht zu funktionieren, sodass es schwierig ist, das Backup wieder in das Gerät zu bekommen.

Die Lösung besteht darin, die Bilddatei an netcat weiterzuleiten und die TCP-Portweiterleitung von ADB zu verwenden, um den Stream auf Ihr Gerät zu leiten. Wenn Ihr CWM/busybox jedoch keine Netzwerktools hat, müssen Sie auch die statische binäre Version arm-v7 von busybox mit allen Applets von http://www.busybox.net/downloads/binaries/latest herunterladen / um netcat auf Ihrem Gerät ausführen zu können.

# wget "http://www.busybox.net/downloads/binaries/latest/busybox-armv7l"

# adb push busybox-armv7l /tmp/busybox

# adb forward tcp:6789 tcp:9876

# adb shell

~ # chmod +x /tmp/busybox

~ # /tmp/busybox nc -l -p 9876 > /dev/block/mmcblk0

Dann in einer neuen Shell:

# dd if=your-image-file.img | nc localhost 6789 &

"dd" ist besser als "cat", weil Sie den Fortschritt des Kopierens in Intervallen überprüfen können (ersetzen Sie 5647 durch die PID des DD-Befehls):

# kill -USR1 5647

48+0 records in
47+0 records out
49283072 bytes (49 MB) copied, 17.6145 s, 2.8 MB/s

Beachten Sie, dass beim Schreiben auf mmcblk0 (oder das Äquivalent auf Ihrem Android-Gerät) sogar die Boot- und Wiederherstellungspartitionen gelöscht werden. Dies ist also eine großartige Möglichkeit, Ihr Gerät zu mauern. Fürs Protokoll, meine Wiederherstellung hat gut funktioniert ;-)

Ich habe eine Lösung gefunden. Sie müssen dazu Root-Zugriff haben. Am besten booten Sie Ihr Nexus mit einem bootunsicheren Image.

1) Ich habe das Bild auf diese Weise in kleinere Stücke zerlegt:

# dd bs=4096 count=983040 if=mmcblk0.img of=mmcblk0-0.img
# dd bs=4096 count=983040 skip=983040 if=mmcblk0.img of=mmcblk0-1.img
# dd bs=4096 count=983040 skip=1966080 if=mmcblk0.img of=mmcblk0-2.img
# dd bs=4096 skip=2949120 if=mmcblk0.img of=mmcblk0-3.img

2) Ich habe alle Chunks bzip2ed:

# bzip2 -k mmcblk0-0.img
# bzip2 -k mmcblk0-1.img
# bzip2 -k mmcblk0-2.img
# bzip2 -k mmcblk0-3.img

3) Ich habe eine Ramdisk in meinem Nexus 4 erstellt:

# adb shell mount -o size=1G -t tmpfs tmpfs /dev/ramdisk

4) Ich habe dd und bunzip2 nach /dev/ramdisk/ kopiert

5) Ich habe die Image-Chunks stückweise in die Partition gepusht, bunzip2ed und geschrieben

# adb push mmcblk0-0.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-0.img.bz2 | /dev/ramdisk/dd bs=4096 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-0.img.bz2

# adb push mmcblk0-1.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-1.img.bz2 | /dev/ramdisk/dd bs=4096 seek=983040 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-1.img.bz2

# adb push mmcblk0-2.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-2.img.bz2 | /dev/ramdisk/dd bs=4096 seek=1966080 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-2.img.bz2

# adb push mmcblk0-3.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-3.img.bz2 | /dev/ramdisk/dd bs=4096 seek=2949120 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-3.img.bz2

Das anfängliche adb-Pull/Push-by-Partition-ID-Muster in der Frage hat Vorteile für Wiederherstellungsumgebungen . Obwohl ich nicht den gesamten Flash ("mmcblk0") getestet habe, funktionierte eine Sicherung und Wiederherstellung durch die Benutzerdatenpartition in einer adb, die innerhalb einer Linie und "/e/"-Wiederherstellung aktiviert wurde.

Das Gerät ist ein Moto-G4-Play „Harpia“ mit vollständiger Festplattenverschlüsselung der Benutzerdatenpartition und einem Partitionsschema der Android 6-Ära (keine A/B-Partitionen). Die Krypto-Fußzeile befindet sich in den letzten Bytes der Partition und der Schlüssel wird von der Hardware abgeleitet, sodass dies nur für die Sicherung/Wiederherstellung des einen Geräts verwendet werden kann.

Aktivieren Sie dann adb im "Erweiterten Menü" der Wiederherstellung

adb shell ls -l /dev/block/by-name
# note down links for your partition
adb pull /dev/block/by-name/userdata userdata.img
# ... more partitions
# restore userdata again
adb push userdata.img /dev/block/mmcblk0p41

Wenn Sie auf /dev/block/by-name/ paths drücken, wird die Meldung "No space left on device" angezeigt, sobald die tmpfs-Größe erreicht ist. Ich musste die richtige Partitions-ID direkt ansprechen.

Wie wäre es mit 'adb pull /dev/block/dm-0', um entschlüsselte Benutzerdaten zu erhalten
in der recovery sind userdata noch nicht entschlüsselt+gemountet, nur eine busybox environ. Sie können dann die /system -Partition und Chroot oder LD_LIBRARY_PATH einhängen, um zu einem funktionalen (?) zu gelangen vdc. Als ich es gerade versuchte, kam ich nicht an vdc vorbei, werde es noch einmal besuchen. Ich verstehe, dass Sie dies tun möchten, um eine Migration statt einer Wiederherstellung durchzuführen
wusste nicht, dass Lineageos eine solche Einschränkung hat (habe diese Wiederherstellung nie verwendet). Mir ist nur die Bestandswiederherstellung (wobei ADB deaktiviert werden muss) oder die Twrp-Wiederherstellung (und Klone) mit Verschlüsselungsunterstützung bekannt
Danke für die Informationen zum Pushen von /dev/block/by-name/ (Ich habe "No space left on device", jetzt werde ich versuchen, /dev/block/sdaX zu verwenden)