web-dev-qa-db-fra.com

Comment puis-je identifier les partitions d'un appareil Android à partir du shell?

J'essaie de trouver quelle partition est utilisée pour quoi, par exemple /boot, /recovery, /system, de adb Shell. Bien que cela soit trivial pour les partitions actuellement montées (en utilisant les commandes mount ou df, voir par exemple comment identifier les noms des partitions ), cela semble difficile lorsque il s'agit de partitions non montées actuellement (comme /recovery lors du démarrage en "mode utilisateur").

Il y a un tutoriel sur XDA , mais cela n'a fonctionné pour aucun des appareils que j'ai essayés:

  • cat /proc/mtd: vide ou inexistant
  • cat /proc/emmc: vide ou inexistant
  • cat /proc/dumchar_info: inexistant (MTK/MediaTek)
  • ls -al /dev/block/platform/*/by-name: soit inexistant, soit ne possédant pas les détails souhaités
  • parted vient de donner un Error: Can't have a partition outside the disk! sur /dev/block/mmcblk1 (tout en manquant simplement la colonne "nom" pour /dev/block/mmcblk0).

Je suis donc perdu. Je sais qu'il existe des applications comme DiskInfo qui peuvent afficher ces détails, donc elles doivent être stockées quelque part sur l'appareil. Cependant, la modification de l'appareil (en installant une application) n'est pas une option dans mon cas.

Donc, fondamentalement, ma question se résume à:

Où sur le Android ces informations sont-elles stockées?

Si possible, une approche générique est préférée. Sinon, un "essai et erreur" de plusieurs approches (if..elseif..fi) ferait aussi bien.

Pour le fond: un exemple d'utilisation serait "Je veux récupérer le /boot partition only "(obtenez une image via dd). Il ne serait pas utile de saisir d'abord toutes les partitions, et d'évaluer plus tard - trop de temps et trop de données produites;) - Cela décrit déjà l'intention: écrire un petit outil pour récupérer une image disque particulière.

19
Izzy

Comme il ne semble pas y avoir de "moyen unique" pour y parvenir, j'ai commencé à combiner des idées de partout, en les joignant dans un script (ou plutôt une "bibliothèque de scripts") pour les faire vérifier séquentiellement (jusqu'à ce qu'un bon hit soit fait), et intégré cela dans mon "Device Documentation Tool" nommé Adebar. Les personnes intéressées peuvent le trouver dans le lib/partitions.lib fichier. Comme Adebar est open-source (GPLv2), n'hésitez pas à le copier et à l'utiliser - ou à forker le projet et à l'améliorer.

La solution complète est un peu longue à publier ici (comme dit, vous pouvez la récupérer sur Github), mais comme la politique de SE consiste à inclure au moins la partie générale dans le message, voici ce qu'elle fait:

Différentes sources fournissent différents ensembles de détails, donc il essaie d'abord les "meilleurs" - puis revient jusqu'à ce qu'au moins quelque chose ait été trouvé.

  • /proc/dumchar_info donne le plus de détails, donc c'est d'abord essayé. Les utilisateurs heureux de MTK l'obtiendront.
  • /proc/mtd est la deuxième meilleure source.
  • /proc/emmc devrait avoir presque autant que les candidats précédents, mais est un peu délicat à utiliser
  • /dev/block/platform/*/by-name, recoupé avec…
  • /proc/partitions recoupé avec /proc/mounts nous donne au moins les partitions montées

Ainsi, le script que j'ai construit parcourt essentiellement les sources dans cet ordre, s'arrêtant dès qu'il a pu collecter des détails (par exemple, si /proc/dumchar_info a été trouvé, pas besoin d'analyser tous les autres). Tous mis dans des fonctions distinctes, renvoyant des données en utilisant la même structure, on pourrait même fusionner les résultats de chacun d'eux.

Si quelqu'un peut trouver une meilleure solution, je suis bien sûr toujours ouvert à l'idée :)

12
Izzy

Vous pouvez obtenir les informations de la partition montée sur Linux sous la forme https://stackoverflow.com/a/15639867/629118 , mais je ne pense pas que le noyau Linux ne connaisse pas boot et recovery partition si /dev/block/platform/**/by-name ne l'a pas.

Vous pouvez donc utiliser les informations actuellement montées pour deviner quelle partition est boot ou recovery ou autre chose dans/dev/block/* qui n'est pas monté.

En fait, fastboot envoie uniquement le nom de la partition que vous souhaitez flasher. Cela signifie que seul le chargeur de démarrage pour fastboot connaît les informations, je suppose.

https://github.com/Android/platform_system_core/blob/8163104b3feb575a321b194a70ecb9873a70b29d/fastboot/fastboot_protocol.txt

0
Kazuki Sakamoto