3 votes

Comment restaurer une image de la partition Android à partir de mon PC linux ?

J'ai créé une image de mon disque flash de mon Nexus 4 comme décrit dans cette question en faisant

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

L'image est entièrement fonctionnelle mais je voudrais renvoyer cette image sur mon téléphone et la commande inverse ne fonctionne pas car elle reste là pour toujours et aucun changement n'est effectué.

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

Comment puis-je repousser cette image sur mon téléphone ?

5voto

Idris Points 151

J'ai eu ce problème en essayant de repousser une sauvegarde de mon Samsung Galaxy S2, en utilisant ADB avec l'outil de récupération CWM (clockworkmod). Lors du repoussage vers un fichier de périphérique, ADB supprime simplement le fichier de périphérique de bloc et crée un fichier normal à sa place, et donc aucune donnée ne se retrouve réellement sur le périphérique mmcblk0.

Malheureusement, l'envoi de la sortie d'une commande dans "adb shell" n'est pas non plus implémenté, et la fonctionnalité de sockets unix "adb forward" ne semble pas fonctionner non plus, il est donc difficile de récupérer la sauvegarde dans le périphérique.

La solution est d'envoyer le fichier image vers netcat, et d'utiliser le transfert de port TCP d'ADB pour diriger le flux vers votre appareil. Cependant, si votre CWM/busybox n'a pas d'outils réseau, vous devrez également télécharger la version binaire statique arm-v7 de busybox avec toutes les applets à partir de http://www.busybox.net/downloads/binaries/latest/ pour pouvoir exécuter netcat sur votre appareil.

# 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

Puis, dans une nouvelle coquille :

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

"dd" est meilleur que "cat" car vous pouvez vérifier la progression de la copie à intervalles (remplacez 5647 par le PID de la commande DD) :

# kill -USR1 5647

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

Attention, écrire sur mmcblk0 (ou l'équivalent sur votre appareil Android) effacera même les partitions de démarrage et de récupération, ce qui est un excellent moyen de détruire votre appareil. Pour mémoire, ma restauration a bien fonctionné ;-)

2voto

hongo Points 171

J'ai trouvé une solution. Vous devez avoir un accès Root pour le faire. Le mieux serait de démarrer votre Nexus en utilisant une image de démarrage non sécurisée.

1) J'ai décomposé l'image en petits morceaux de cette façon :

# 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) J'ai bzipé tous les morceaux :

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

3) J'ai créé un ramdisk dans mon Nexus 4 :

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

4) J'ai copié dd et bunzip2 dans /dev/ramdisk/

5) J'ai poussé, bunzip2ed et écrit les morceaux de l'image dans la partition en morceaux.

# 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

2voto

wbob Points 151

Le modèle initial adb pull/push by-partition-id dans la question a du mérite pour environnements de récupération . Bien que je n'ai pas testé pour l'ensemble de la flash ("mmcblk0"), une sauvegarde et restauration par partition userdata a fonctionné dans un adb activé dans une récupération lineage et "/e/".

Le dispositif est un moto-g4-play "harpia" avec un cryptage complet du disque de la partition userdata et un schéma de partition de l'ère Android 6 (pas de partitions A/B). Le pied de page cryptographique se trouve dans les derniers octets de la partition et la clé est dérivée du matériel, de sorte que cela ne peut être utilisé que pour la sauvegarde/restauration d'un seul appareil.

Activez adb dans le "Menu avancé" de la récupération, puis

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

Pousser sur les chemins /dev/block/by-name/ se heurte à un message "No space left on device" dès que la taille de tmpfs est atteinte. J'avais besoin de m'adresser directement au bon partition-id.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X