Come posso verificare se un volume è montato nel punto in cui dovrebbe utilizzare Python?


9

Ho uno script di backup scritto in Python che crea la directory di destinazione prima di copiarla. L'ho configurato per l'uso /external-backupcome destinazione, dove è dove monto un disco rigido esterno. Ho appena eseguito lo script senza accendere (o montare) il disco rigido e ho scoperto che funzionava normalmente, anche se facendo un backup sul disco rigido interno, che non ha spazio sufficiente per eseguire il backup.

La mia domanda è: come posso verificare se il volume è montato nel posto giusto prima di scriverlo? Se riesco a rilevare che /external-backupnon è montato, posso impedire di scriverlo.

La domanda bonus è perché questo è stato consentito, quando il sistema operativo sa che la directory dovrebbe vivere su un altro dispositivo e cosa accadrebbe ai dati (sul disco rigido interno) se dovessi successivamente montare quel dispositivo (il disco rigido esterno)? Chiaramente non ci possono essere due copie su dispositivi diversi nello stesso percorso!

Grazie in anticipo!

Risposte:


22

Vorrei dare un'occhiata os.path.ismount().


1
L'unico problema è che restituisce un valore booleano e non specifica se è presente il dispositivo giusto.
McJeff,

3
@McJeff: è vero, non dice a chi dice se . Se non è presente alcun dispositivo, restituirà false e una scrittura su quel percorso scriverà nella directory sottostante nel filesystem padre . Quindi, se restituisce false, emettere un errore e non scrivere lì. La directory /external-backupnon vive su un dispositivo esterno, vive sul filesystem principale. Il sistema sa solo cosa lo mountdice, non ha idea di cosa dovrebbe essere lì. Non c'è niente di speciale in un "mount point" su un filesystem Unix. È solo una directory normale.
In pausa fino a ulteriore avviso.

Questo fa perfettamente il lavoro. Non proteggerò contro altri volumi che vengono montati lì, solo che non è il filesystem principale. Scusate gli altri risponditori, le vostre risposte potrebbero rispondere alla mia domanda in modo più preciso, ma temo di non sapere bene cosa chiedere in primo luogo, come potreste essere in grado di dire;) Vi ho comunque valutato tutti .
Ben Hymers,

Buona spiegazione
McJeff,

5

Per una risposta definitiva a qualcosa che solo il kernel sa per certo, chiedi al kernel:

cat /proc/mounts

Quel file può essere letto / analizzato come se fosse un file normale, usando tutti gli strumenti che ti piacciono. Incluso Python. Esempio Quick-n-dirty:

#!/usr/bin/python

d = {}

for l in file('/proc/mounts'):
    if l[0] == '/':
        l = l.split()
        d[l[0]] = l[1]

import pprint

pprint.pprint(d)

4

Il modo più semplice per verificare è invocare mounttramite subprocesse vedere se appare lì. Per ulteriore credito, utilizzare os.readlink()il contenuto di /dev/disk/by-*per capire quale dispositivo è.


A mio mountavviso , il problema con questo approccio è che l'output di è definito in modo sciatto al meglio. Cosa fa l' mountoutput se l'ho montato /dev/evil device on toursu /directory on which I mount devices? L'analisi dell'output potrebbe essere inaffidabile in questi casi ...
skyking

2

Risposta bonus. Se il dispositivo esterno non è montato, i dati vengono scritti nella partizione radice sul percorso /external-backup. Se il dispositivo esterno è montato, i dati sulla partizione di root sono ancora presenti ma non sono raggiungibili perché /external-backupora puntano a un dispositivo esterno.


2

Vecchia domanda, ma ho pensato di contribuire comunque con la mia soluzione (basata sulla risposta di Dennis Williamson e Ignacio Vazquez-Abrams ). Dal momento che lo sto usando in un ambiente non Linux per controllare il montaggio delle directory remote, / proc e mtab non possono essere utilizzati e non sono stati implementati controlli aggiuntivi:

def is_mounted(special, directory):
    search_prefix = '{} on {}'.format(special, directory.rstrip('/'))

    if os.path.ismount(directory):
        mounts = subprocess.check_output(['mount']).split('\n')

        for line in mounts:
            if line[:len(search_prefix)] == search_prefix:
                return True;

    return False

Miglioramenti benvenuti!


1

Il file / etc / mtab esiste per dirti ciò che è attualmente montato. C'è una getmntentchiamata, ma non credo sia stata esportata nel osmodulo. Il veloce e sporco? Apri / etc / mtab e dividi. Assicurarsi che il dispositivo sia presente nella colonna 0 e che il punto di montaggio di destinazione nella colonna 1 sia corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.