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


J'ai un script de sauvegarde écrit en Python qui crée le répertoire de destination avant de copier le répertoire source. Je l'ai configuré pour utiliser /external-backup en tant que destination, sur laquelle je monte un disque dur externe. Je viens d'exécuter le script sans que le disque dur soit allumé (ou en cours de montage) et j'ai constaté qu'il fonctionnait normalement, bien que j'effectue une sauvegarde sur le disque dur interne, qui ne dispose d'aucun espace suffisant pour se sauvegarder.

Ma question est la suivante: comment puis-je vérifier si le volume est monté au bon endroit avant d’écrire? Si je peux le détecter /external-backup n'est pas monté, je peux empêcher l'écriture.

La question supplémentaire est de savoir pourquoi cela a été autorisé, alors que le système d'exploitation sait que ce répertoire est censé résider sur un autre périphérique, et qu'adviendrait-il des données (sur le disque dur interne) si je devais plus tard monter ce périphérique (le disque dur externe)? Clairement, il ne peut pas y avoir deux copies sur des appareils différents sur le même chemin!

Merci d'avance!


8
2018-05-18 18:06


origine




Réponses:


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


19
2018-05-18 18:38



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
@ McJeff: C'est vrai ça ne dit rien lequel ça raconte si. Si aucun périphérique n’est présent, il retournera false et une écriture sur ce chemin sera écrite dans le répertoire sous-jacent dans le répertoire. parent système de fichiers. Donc, si elle retourne false, émettez une erreur et n'y écrivez pas. Le répertoire /external-backup ne vit pas sur un périphérique externe, il vit sur le système de fichiers parent. Le système ne sait que quoi mountle dit, il n'a aucune idée de ce que devrait être là. Il n’ya 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. - Dennis Williamson
Cela fait le travail parfaitement. Je ne vais pas me protéger contre le montage d'autres volumes, mais simplement que ce n'est pas le système de fichiers parent. Désolé pour les autres intervenants, vos réponses répondront peut-être plus exactement à ma question, mais j'ai bien peur de ne pas savoir quoi demander, car vous pourriez peut-être le savoir;) Je vous ai tout de même noté. . - Ben Hymers
Bonne explication! - McJeff


Pour une réponse définitive à quelque chose que seul le noyau sait à coup sûr, demandez-lui:

cat /proc/mounts

Ce fichier peut être lu / analysé comme s'il s'agissait d'un fichier normal, à l'aide des outils de votre choix. 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)

5
2018-05-18 23:00





Le moyen le plus simple de vérifier est d'appeler mount via subprocess et voir si ça se voit là-bas. Pour un crédit supplémentaire, utilisez os.readlink() sur le contenu de /dev/disk/by-* pour savoir de quel appareil il s'agit.


4
2018-05-18 18:14



À mon avis, le problème avec cette approche est que le résultat de mount est mal défini au mieux. Qu'est-ce que mount sortie 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


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


2
2018-05-18 18:18





Vieille question, mais je pensais apporter ma solution (basée sur Dennis Williamson's et Ignacio Vazquez-Abramsla réponse) de toute façon. Comme je l’utilise dans un environnement autre que Linux pour vérifier les répertoires distants en cours de montage, / proc et mtab ne peut pas être utilisé et aucune vérification supplémentaire n'a été mise en place:

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

Les améliorations sont les bienvenues!


2
2018-03-06 11:37





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


1
2018-05-18 20:11