Como posso verificar se um volume está montado onde deveria estar usando Python?

8

Eu tenho um script de backup escrito em Python, que cria o diretório de destino antes de copiar o diretório de origem para ele. Eu configurei-o para usar /external-backup como o destino, que é onde eu montei um disco rígido externo. Acabei de rodar o script sem que o disco rígido estivesse ligado (ou sendo montado) e descobri que ele estava funcionando normalmente, apesar de fazer um backup no disco rígido interno, que não tem nem espaço suficiente para backup.

A minha pergunta é: como posso verificar se o volume está montado no lugar certo antes de escrever nele? Se eu conseguir detectar que /external-backup não está montado, posso evitar a gravação.

A questão do bônus é por que isso foi permitido, quando o sistema operacional sabe que o diretório deveria estar em outro dispositivo e o que aconteceria com os dados (no disco rígido interno) se eu montasse esse dispositivo posteriormente? dirigir)? Claramente não pode haver duas cópias em dispositivos diferentes no mesmo caminho!

Obrigado antecipadamente!

    
por Ben Hymers 18.05.2010 / 20:06

6 respostas

19

Eu daria uma olhada em os.path.ismount() .

    
por 18.05.2010 / 20:38
5

Para uma resposta definitiva a algo que apenas o kernel sabe ao certo, pergunte ao kernel:

cat /proc/mounts

Esse arquivo pode ser lido / analisado como se fosse um arquivo normal, usando qualquer ferramenta que você goste. Incluindo o Python. Exemplo rápido e sujo:

#!/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)
    
por 19.05.2010 / 01:00
4

A maneira mais fácil de verificar é invocar mount via subprocess e ver se aparece lá em cima. Para crédito extra, use os.readlink() no conteúdo de /dev/disk/by-* para descobrir qual dispositivo é.

    
por 18.05.2010 / 20:14
2

Resposta de bônus. Se o dispositivo externo não estiver montado, os dados serão gravados na partição raiz no caminho /external-backup . Se o dispositivo externo estiver montado, os dados na partição raiz ainda estarão lá, mas não poderão ser acessados, pois /external-backup agora está apontando para o dispositivo externo.

    
por 18.05.2010 / 20:18
2

Pergunta antiga, mas pensei em contribuir com minha solução (com base em Dennis Williamson's e resposta de Ignacio Vazquez-Abrams ) de qualquer maneira . Como estou usando em um ambiente não-Linux para verificar diretórios remotos montados, / proc e mtab não podem ser usados e nenhuma verificação adicional foi implementada:

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

Melhorias bem-vindas!

    
por 06.03.2013 / 12:37
1

O arquivo / etc / mtab existe para dizer o que está montado atualmente. Há uma chamada getmntent , mas não acredito que ela tenha sido exportada no módulo os . O rápido e sujo? Abra / etc / mtab e divida. Certifique-se de que seu dispositivo esteja presente na coluna 0 e o ponto de montagem de destino na coluna 1 esteja correto.

    
por 18.05.2010 / 22:11