Wie kann ich überprüfen, ob ein Volume dort bereitgestellt ist, wo Python verwendet werden soll?

9

Ich habe ein Backup-Skript in Python geschrieben, das das Zielverzeichnis erstellt, bevor das Quellverzeichnis in dieses Verzeichnis kopiert wird. Ich habe es so konfiguriert, dass es /external-backupals Ziel verwendet wird. Dort mounte ich eine externe Festplatte. Ich habe das Skript nur ausgeführt, ohne dass die Festplatte eingeschaltet (oder gemountet) war, und festgestellt, dass es wie gewohnt funktioniert, obwohl ein Backup auf der internen Festplatte erstellt wurde, auf der bei weitem nicht genügend Speicherplatz vorhanden ist, um sich selbst zu sichern.

Meine Frage lautet: Wie kann ich überprüfen, ob das Volume an der richtigen Stelle bereitgestellt ist, bevor ich darauf schreibe? Wenn ich feststellen kann, dass /external-backupdas nicht gemountet ist, kann ich das Schreiben verhindern.

Die Bonusfrage ist, warum dies erlaubt war, wenn das Betriebssystem weiß, dass das Verzeichnis auf einem anderen Gerät gespeichert werden soll, und was mit den Daten (auf der internen Festplatte) passieren würde, sollte ich dieses Gerät (die externe Festplatte) später mounten? Es ist klar, dass es nicht zwei Kopien auf verschiedenen Geräten auf demselben Pfad geben kann!

Danke im Voraus!

Ben Hymers
quelle

Antworten:

22

Ich würde einen Blick darauf werfen os.path.ismount().

Bis auf weiteres angehalten.
quelle
1
Das einzige Problem ist, dass es einen Booleschen Wert zurückgibt und nicht angibt, ob das richtige Gerät vorhanden ist.
McJeff
3
@ McJeff: Das stimmt, es sagt nicht, was es sagt, wenn . Wenn kein Gerät vorhanden ist, wird false zurückgegeben und beim Schreiben in diesen Pfad wird in das zugrunde liegende Verzeichnis im übergeordneten Dateisystem geschrieben. Wenn es also false zurückgibt, geben Sie einen Fehler aus und schreiben Sie dort nicht. Das Verzeichnis befindet /external-backupsich nicht auf einem externen Gerät, sondern auf dem übergeordneten Dateisystem. Das System weiß nur, was es mountsagt, es hat keine Ahnung, was da sein soll. Ein "Einhängepunkt" in einem Unix-Dateisystem ist nichts Besonderes. Es ist nur ein reguläres Verzeichnis.
Bis auf weiteres angehalten.
Das macht den Job perfekt. Ich werde mich nicht vor anderen Volumes schützen, die dort gemountet werden, nur dass es nicht das übergeordnete Dateisystem ist. Entschuldigen Sie die anderen Antwortenden, Ihre Antworten beantworten meine Frage möglicherweise genauer, aber ich fürchte, ich wusste überhaupt nicht, wonach ich fragen sollte, wie Sie vielleicht sagen können;) Ich habe Sie trotzdem alle bewertet .
Ben Hymers
Gute Erklärung!
McJeff
5

Um eine endgültige Antwort auf etwas zu erhalten, das nur der Kernel sicher kennt, fragen Sie den Kernel:

cat /proc/mounts

Diese Datei kann mit beliebigen Tools gelesen / analysiert werden, als wäre es eine normale Datei. Einschließlich Python. Quick-n-Dirty-Beispiel:

#!/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)
Insyte
quelle
4

Der einfachste Weg, dies zu überprüfen, besteht darin, mountvia aufzurufen subprocessund zu prüfen, ob es dort angezeigt wird. Verwenden Sie für zusätzliche Gutschriften os.readlink()den Inhalt von, /dev/disk/by-*um herauszufinden, um welches Gerät es sich handelt.

Ignacio Vazquez-Abrams
quelle
Aus meiner Sicht besteht das Problem bei diesem Ansatz darin, dass die Ausgabe von mountbestenfalls schlampig definiert ist. Was bedeutet dann mountausgegeben , wenn ich angebracht habe /dev/evil device on touran /directory on which I mount devices? Das Parsen der Ausgabe kann in solchen Fällen unzuverlässig sein ...
skyking
2

Bonusantwort. Wenn das externe Gerät nicht gemountet ist, werden die Daten im Pfad in die Root-Partition geschrieben /external-backup. Wenn ein externes Gerät gemountet ist, sind die Daten auf der Root-Partition noch vorhanden, aber nicht erreichbar, da sie /external-backupjetzt auf ein externes Gerät verweisen.

Casual Coder
quelle
2

Alte Frage, aber ich dachte, ich würde meine Lösung (basierend auf der Antwort von Dennis Williamson und Ignacio Vazquez-Abrams ) trotzdem beitragen. Da ich es in einer Nicht-Linux-Umgebung verwende, um zu überprüfen, ob Remote-Verzeichnisse bereitgestellt werden, können / proc und mtab nicht verwendet werden und es wurden keine zusätzlichen Überprüfungen implementiert:

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

Verbesserungen willkommen!

Magentron
quelle
1

Die Datei / etc / mtab gibt an, was aktuell gemountet ist. Es gibt einen getmntentAnruf, aber ich glaube nicht, dass er in das osModul exportiert wird. Das schnell und dreckig? Öffnen Sie / etc / mtab und teilen Sie. Stellen Sie sicher, dass Ihr Gerät in Spalte 0 vorhanden ist und der Ziel-Mount-Punkt in Spalte 1 korrekt ist.

McJeff
quelle