Comment puis-je vérifier si un volume est monté là où il est censé utiliser Python?

9

J'ai un script de sauvegarde écrit en Python qui crée le répertoire de destination avant d'y copier le répertoire source. Je l'ai configuré pour l'utiliser /external-backupcomme destination, c'est là que je monte un disque dur externe. Je viens d'exécuter le script sans que le disque dur ne soit allumé (ou monté) et j'ai constaté qu'il fonctionnait normalement, bien qu'il fasse une sauvegarde sur le disque dur interne, qui n'a nulle part assez d'espace pour se sauvegarder.

Ma question est: comment puis-je vérifier si le volume est monté au bon endroit avant d'y écrire? Si je peux détecter que ce /external-backupn'est pas monté, je peux empêcher d'y écrire.

La question supplémentaire est de savoir pourquoi cela a été autorisé, alors que le système d'exploitation sait que le répertoire est censé vivre sur un autre appareil, et qu'arriverait-il aux données (sur le disque dur interne) si je montais plus tard cet appareil (le disque dur externe)? De toute évidence, il ne peut pas y avoir deux copies sur différents appareils sur le même chemin!

Merci d'avance!

Ben Hymers
la source

Réponses:

22

Je voudrais jeter un oeil à os.path.ismount().

En pause jusqu'à nouvel ordre.
la source
1
Le seul problème est qu'il renvoie un booléen et ne spécifie pas si le bon périphérique est là.
McJeff
3
@McJeff: C'est vrai qu'il ne dit pas lequel il dit si . Si aucun périphérique n'est là, il retournera false et une écriture dans ce chemin écrit dans le répertoire sous-jacent du système de fichiers parent . Donc, si elle retourne false, émettez une erreur et n'y écrivez pas. Le répertoire /external-backupne vit pas sur un périphérique externe, il vit sur le système de fichiers parent. Le système ne sait que ce mountqu'il dit, il n'a aucune idée de ce qui devrait y être. Il n'y a rien de spécial à propos d'un "point de montage" sur un système de fichiers Unix. C'est juste un répertoire régulier.
pause jusqu'à nouvel ordre.
Cela fait parfaitement l'affaire. Je ne vais pas me protéger contre d'autres volumes montés là-bas, juste que ce n'est pas le système de fichiers parent. Désolé pour les autres répondeurs, vos réponses peuvent répondre à ma question plus exactement, mais je crains que je ne savais pas quoi demander en premier lieu, comme vous pourriez le dire;) Je vous ai tout de même noté .
Ben Hymers
Bonne explication!
McJeff
5

Pour une réponse définitive à quelque chose que seul le noyau sait, demandez au noyau:

cat /proc/mounts

Ce fichier peut être lu / analysé comme s'il s'agissait d'un fichier normal, en utilisant les outils que vous aimez. Y compris Python. Exemple 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)
Insyte
la source
4

Le moyen le plus simple de vérifier est d'appeler mountvia subprocesset de voir s'il apparaît là-bas. Pour un crédit supplémentaire, utilisez os.readlink()le contenu de /dev/disk/by-*pour déterminer de quel appareil il s'agit.

Ignacio Vazquez-Abrams
la source
Comme je le vois, le problème avec cette approche est que la sortie de mountest définie au mieux. Qu'est-ce que la mountsortie si j'ai monté /dev/evil device on tourà /directory on which I mount devices? L'analyse de la sortie peut ne pas être fiable dans de tels cas ...
skyking
2

Réponse bonus. Si le périphérique externe n'est pas monté, les données sont écrites sur la partition racine au chemin /external-backup. Si un périphérique externe est monté, les données sur la partition racine sont toujours là mais elles ne sont pas accessibles car elles /external-backuppointent maintenant vers le périphérique externe.

Codeur occasionnel
la source
2

Vieille question, mais j'ai pensé apporter ma solution (basée sur la réponse de Dennis Williamson et Ignacio Vazquez-Abrams ) de toute façon. Comme je l'utilise sur un environnement non Linux pour vérifier les répertoires distants en cours de montage, / proc et mtab ne peuvent pas être utilisés et aucune vérification supplémentaire n'a été implémentée:

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

Améliorations bienvenues!

Magentron
la source
1

Le fichier / etc / mtab existe pour vous dire ce qui est actuellement monté. Il y a un getmntentappel, mais je ne pense pas qu'il soit exporté dans le osmodule. Le rapide et sale? Ouvrez / etc / mtab et divisez. Assurez-vous que votre appareil est présent dans la colonne 0 et que le point de montage de destination dans la colonne 1 est correct.

McJeff
la source