2014-12-24 10 views
16

Sto cercando di trovare quale partizione è utilizzata per cosa, ad es. /boot, /recovery, /system, da adb shell. Mentre questo è banale per le partizioni attualmente montate (usando i comandi o , ad esempio how to identify names of the partitions), questo sembra essere complicato quando si tratta di partizioni non montate attualmente (come /recovery all'avvio in "modalità utente").Come posso identificare le partizioni di un dispositivo Android dalla shell?

C'è un tutorial at XDA, ma non ha funzionato per uno qualsiasi dei dispositivi che ho provato:

  • cat /proc/mtd: questo è vuoto o non esistente
  • cat /proc/emmc: questo è vuoto o non -existing
  • cat /proc/dumchar_info: non esistente (MTK/MediaTek)
  • ls -al /dev/block/platform/*/by-name: o non esistenti, o che non hanno i dettagli ricercati
  • parted ha appena ottenuto un Error: Can't have a partition outside the disk! su /dev/block/mmcblk1 (mentre manca semplicemente la colonna "nome" per /dev/block/mmcblk0).

Quindi sono in perdita. So che ci sono app come DiskInfo che possono mostrare quei dettagli, quindi devono essere memorizzati da qualche parte sul dispositivo. Tuttavia, la modifica del dispositivo (installando un'app) non è un'opzione nel mio caso.

Quindi, in pratica la mia domanda brucia a:

Dove sul dispositivo Android è presente informazioni memorizzate?

Se possibile, è preferibile un approccio generico. In caso contrario, farebbe un "try-and-err" di diversi approcci (if..elseif..fi).

Per lo sfondo: un esempio di utilizzo sarebbe "Voglio recuperare solo la partizione /boot" (ottenere un'immagine di esso tramite dd). Non farebbe prima prendere tutte le partizioni e valutare in seguito - troppo tempo e troppa produzione di dati; - Questo già descrive l'intenzione: scrivere un piccolo strumento per recuperare una particolare immagine del disco.

+0

Quali informazioni cerchi esattamente (dimensione, posizione, di montaggio), che non si trova in '/proc/mounts' – jan

+0

@jan come descritto, a cosa serve ciascuna partizione ". Per esempio. come derivato da 'mount' o, come lo metti,'/proc/mounts', che '/ dev/block/mmcblk1p21' sta tenendo la partizione' system'. Si noti tuttavia che, come il comando 'mount' stesso, mantiene solo le partizioni * attualmente montate *. Ma ho bisogno anche di quelli *** non attualmente montati *** (ad esempio 'recovery' all'avvio normale). La dimensione è piuttosto di interesse secondario. L'identificazione è ciò che conta per me. – Izzy

+0

Farei semplicemente "ls -l/dev/block/platform/omap/omap_hsmmc.0/by-name' per ottenere un elenco dei nomi delle partizioni che puntano ai dispositivi effettivi. – jan

risposta

10

quanto non sembra esserci alcun "senso unico" per raggiungere questo, ho iniziato combinando idee da allover, le si unisce in uno script (o meglio una "libreria di script") per farli verificare in modo sequenziale (fino a quando non è stato raggiunto un buon risultato) e l'ho integrato nel "Device Documentation Tool" denominato Adebar. Chi è interessato può trovarlo nel file lib/partitions.lib. Come Adebar è open-source (GPLv2), sentiti libero di copiarlo e usarlo - o biforcare il progetto e migliorarlo.

La soluzione completa è un po 'lungo per postare qui (come detto, si può afferrare a Github), ma la politica SE è quello di comprendere almeno la parte generale nel post, ecco quello che fa:

Diverse fonti forniscono diversi insiemi di dettagli, quindi cerca prima i "migliori" e poi ricorre verso il basso finché non viene trovato almeno qualcosa.

  • /proc/dumchar_info fornisce il maggior numero di dettagli, quindi questo viene provato per primo. Gli utenti MTK felici otterranno questo.
  • /proc/mtd è la seconda migliore fonte.
  • /proc/emmc dovrebbe avere quasi quanto i candidati precedenti, ma è un po 'difficile da usare
  • /dev/block/platform/*/by-name, un controllo incrociato con ...
  • /proc/partitions un controllo incrociato con /proc/mounts ci dà almeno le partizioni montate

Quindi lo script che ho creato fondamentalmente cammina le origini in questo ordine, fermandosi non appena è stato in grado di raccogliere i dettagli (ad esempio se è stato trovato /proc/dumchar_info, non è necessario analizzare tutti gli altri). Tutti hanno messo in funzioni separate, restituendo i dati utilizzando la stessa struttura, si potrebbero persino unire i risultati di tutti loro.

Se qualcuno può trovare una soluzione migliore, io sono ovviamente sempre aperta per l'idea :)

+0

Grazie mille! Ho trovato partizioni nomi e dispositivi usando cat/proc/mtd. – RedEyed

+0

Contento di poter aiutare, @VadimStupakov! una cosa sfortunata che ogni dispositivo sembra gestirlo in un modo diverso, quindi non possiamo usare nessun approccio unico che corrisponda a tutti ... – Izzy

+0

Sai se '/ dev/block/platform/*/by-name' è per certi Android versioni? Ho bisogno di ottenere il nome della partizione di 'recupero' e' avvio'. Ho funzionato fino a quando ho provato su dispositivi più vecchi .. –

0

È possibile ottenere le informazioni di montaggio a partizione su Linux come https://stackoverflow.com/a/15639867/629118, ma non credo che il kernel Linux non sapere boot e recovery partizione se /dev/block/platform/**/by-name non ce l'ha.

Quindi è possibile utilizzare la informazioni attualmente montato di indovinare quale partizione è boot o recovery o qualcos'altro in/dev/block/* non è montato.

Infatti, fastboot invia solo il nome della partizione che si desidera lampeggiare. Significa che solo il bootloader per fastboot conosce le informazioni, immagino.

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

+0

Grazie Kazuki - ma indovinare è troppo soggetto a errori con 20+ partizioni (26 sul dispositivo attualmente connesso, 'mmcblk1p1' a' mmcblk1p26'), di cui solo 3 o 4 sono montati (3 in il dispositivo menzionato) - specialmente "indovinare automaticamente da uno script". Anche saltare tutti quelli che hanno 2048 blocchi e meno, lascia 10 partizioni su quel dispositivo, meno i 3 montati fanno 7 da indovinare.Quel 'fastboot' può capire se stesso è un'altra prova che le informazioni devono essere ottenute automaticamente (a meno che non sia hard-coded nella sua contro-parte sul dispositivo). – Izzy

+1

fastboot è una parte del bootloader ed è separato dal sistema Linux, quindi non penso che tu possa ottenere le informazioni tramite la shell adb che comunica con adbd sul kernel di Linux. –

+0

Questo è un punto valido. Direi che il fast boot deve essere visto separatamente; quando viene avviato in modalità fastboot, il "sistema normale" non viene "attivato". Quindi togli quella "prova" dal mio ultimo commento; ma siccome le app possono trovare i dettagli (vedi l'esempio nella mia domanda), devono comunque essere disponibili in qualche modo. – Izzy

Problemi correlati