2016-07-04 38 views
11

Partendo da un percorso assoluto, voglio ottenere le seguenti informazioni:Come ottenere dettagliate informazioni dispositivo/partizione dal percorso del file su Linux (come UUID, hard disk, ecc seriale)

  1. Il punto di montaggio del filesystem su cui è archiviato il file (per calcolare il percorso relativo al punto di montaggio)
  2. UUID ed etichetta del file system
  3. Il tipo (o il nome del fornitore) e il numero di serie del disco rigido unità che contiene la partizione

Sono consapevole che 2 e 3 potrebbero non essere definiti in molti casi (ad es. per loopback, ramfs, dispositivi encirptati), che è completamente soddisfacente. So anche come ottenere tali informazioni utilizzando una shell e strumenti di sistema come df e il file system /sys o /proc. Vedere this question come riferimento.

Tuttavia, sto cercando il metodo meno ingombrante per farlo a livello di codice con Python 3.5. Ciò significa:

  • Preferisco chiamate di sistema, invece di contenuti parsing di /proc o /sys
  • evitare di chiamare sottoprocessi e l'analisi la loro produzione (la definizione di ingombrante) (che può essere soggetto a modifiche o dipendono dalla configurazione del kernel?)

Finora, io sto usando os.stat() sulla strada per ottenere il numero maggiore e minore del dispositivo a blocchi da stat_result.st_dev. Ma qual è il modo corretto di procedere?

C'è per esempio

  • /proc/mounts
  • /proc/partitions
  • /sys/dev/block/<major>:<minor>

Note: Per quanto riguarda i dispositivi a blocchi montato un pareti divisorie, /proc/mounts e /proc/partitions sembrano essere la fonte di informazioni canoniche (che è OK). Per UUID, etichette, periodici ecc Attualmente uso udevadm e analizzare l'output:

def get_udev_properties(dev_name):   
    cmd = ["udevadm", "info", "--query=property", "--name", dev_name] 
    result = subprocess.run(cmd, stdout=subprocess.PIPE) 
    return parse_properties(result.stdout) 

Nota ulteriore: Astraendo dal mio problema acutal, si potrebbe chiedere più generale:

  • Qual è l'identificazione o la rappresentazione canonica di un dispositivo a blocchi rispetto alle chiamate di sistema linux e ai filesystem del kernel?
  • Qual è il modo corretto per ottenere tale rappresentazione per numero maggiore e minore?
  • Qual è il modo corretto per ottenere informazioni dettagliate su un dispositivo a blocchi?
+1

Le versioni correnti di '/ bin/mount' funzionano leggendo'/proc/self/mountinfo'. [La struttura del file è spiegata qui] (https://www.kernel.org/doc/Documentation/filesystems/proc.txt). [Risposte alle domande su come fare lo stesso usando C] (http://stackoverflow.com/questions/9280759/linux-function-to-get-mount-points) indicano che non esiste un'alternativa migliore. – Phillip

+0

@Phillip Se l'analisi dei file da '/ proc' è il modo canonico, questa è una risposta valida. Trovo abbastanza difficile trovare riferimenti normativi/migliori pratiche riguardanti i dati che vorrei acquisire. –

+0

'os.stat' sta bene, non c'è niente di sbagliato in questo. –

risposta

1

Ciò implicherebbe alcune utilità e output anlyze. Lanciato usando os.popen, puoi usare bklkid per trovare uuids, leggendo i permessi di file /etc/mtab per sapere quale filesystem è montato nel tuo sistema e quindi mount point. L'output sfdisk -l fornisce l'anatomia del disco. hdparm -I /dev/xxx ti darà i numeri di serie.

3

Questo è un script on GitHub Mi sono imbattuto in precedenza oggi che utilizza Python per recuperare informazioni sulla marca di unità e modello (e molti altri).

/proc/partitions contiene informazioni sulle partizioni; per informazioni più dettagliate dovrai eseguire un sottoprocesso come fai ora, o per esempio per GPT do the parsing yourself.

+0

Ti ho assegnato la taglia, perché la tua risposta conteneva le informazioni più utili per me (o me le indicava). Tuttavia, non lo accetterò, perché non esiste una risposta definitiva per quanto riguarda le migliori pratiche o una soluzione canonica. Ormai, dubito persino che otterrò una risposta del genere su SO. Principalmente perché è un argomento così specifico. –

+0

Grazie, e sono d'accordo nel non accettare la risposta. Forse potresti chiedere a SuperUser? – LSerni

+0

Probabilmente lo lascerò per ora. La mia soluzione attuale sembra funzionare bene, anche se non mi piace molto. Dando un'occhiata alle alternative (ad esempio facendo chiamate 'ioctl' di fantasia come' hdparm' o interagendo con 'dbus' o' udev' direttamente) analizzando '/ proc' e l'output di' udevadm' sembra un'idea giusta. –

2

Il modo migliore per farlo è tramite pyparted. Pyparted è un collegamento Python a Parted gestito da uno degli sviluppatori Parted. È possibile trovare il codice sorgente on github. Sfortunatamente UUID non può essere trovato da parted quindi devi analizzare blkid

Problemi correlati