Як я можу перевірити, чи встановлено гучність там, де він повинен використовувати Python?


10

У мене є сценарій резервного копіювання, написаний на Python, який створює каталог призначення, перш ніж копіювати в нього вихідний каталог. Я налаштував його на використання /external-backupв якості пункту призначення, саме там я монтую зовнішній жорсткий диск. Я просто запустив сценарій, не ввімкнувши (або встановивши) жорсткий диск, і виявив, що він працює як нормально, хоч і робив резервну копію на внутрішньому жорсткому диску, у якого немає ніде місця для резервного копіювання.

Моє запитання: як я можу перевірити, чи встановлено гучність в потрібному місці, перш ніж писати на нього? Якщо я можу виявити, що /external-backupвін не встановлений, я можу запобігти його написанню.

Бонусне питання полягає в тому, чому це було дозволено, коли ОС знає, що каталог повинен працювати на іншому пристрої, і що буде з даними (на внутрішньому жорсткому диску), чи потрібно пізніше встановити цей пристрій (зовнішній жорсткий диск)? Очевидно, що на одному пристрої не може бути двох примірників на одному шляху!

Спасибі заздалегідь!

Відповіді:


23

Я поглянув би os.path.ismount().


1
Єдина проблема полягає в тому, що він повертає булеве значення і не вказує, чи є потрібний пристрій.
МакДжеф

3
@McJeff: Це правда, це не говорить про те, що він говорить, якщо . Якщо пристрою немає, він поверне помилкове значення, і запис у цей шлях запише в базовий каталог батьківської файлової системи. Тож якщо він поверне помилковий, виправте помилку і не пишіть там. Каталог /external-backupне працює на зовнішньому пристрої, він знаходиться в батьківській файловій системі. Система знає лише те, що mountговорить, вона не має уявлення, що там повинно бути. Немає нічого особливого в «точці кріплення» у файловій системі Unix. Це просто звичайний каталог.
Призупинено до подальшого повідомлення.

Це робить роботу ідеально. Я не збираюся захищати від інших томів, встановлених там, тільки що це не батьківська файлова система. Вибачте інших відповідачів, ваші відповіді можуть відповісти точніше на моє запитання, але я боюся, що я не зовсім знав, що просити, в першу чергу, як ви могли б сказати;) Я все одно оцінив вас .
Бен Хімерс

Гарне пояснення!
МакДжефф

5

Для остаточної відповіді на щось, про що тільки ядро ​​знає напевно, попросіть ядро:

cat /proc/mounts

Цей файл можна прочитати / проаналізувати так, ніби це був звичайний файл, використовуючи будь-які інструменти, які вам подобаються. У тому числі і Python. Швидкий-брудний приклад:

#!/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

Найпростіший спосіб перевірити - це виклик mountчерез subprocessі побачити, чи він відображається там. Щоб отримати додатковий кредит, скористайтеся os.readlink()вмістом, /dev/disk/by-*щоб визначити, який це пристрій.


Як я бачу, проблема такого підходу полягає в тому, що вихід mountу кращому випадку визначається неохайно. Що робить mountвисновок , якщо я встановив /dev/evil device on tourв /directory on which I mount devices? Аналіз результату може виявитися недостовірним у таких випадках ...
скачування

2

Бонусна відповідь. Якщо зовнішній пристрій не встановлений, дані записуються до кореневого розділу на шляху /external-backup. Якщо встановлено зовнішній пристрій, дані в кореневому розділі все ще є, але вони недоступні, оскільки /external-backupзараз вказують на зовнішній пристрій.


2

Старе питання, але я думав, що все-таки я сприятиму своєму вирішенню (на основі відповіді Денніса Вільямсона та Ігнасіо Васкеса-Абрамса ). Оскільки я використовую його в середовищі, яка не є Linux, для перевірки монтажу віддалених каталогів, / proc та mtab не можна використовувати, і додаткові перевірки не здійснюються:

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

Поліпшення вітаємо!


1

Файл / etc / mtab існує, щоб повідомити, що зараз встановлено. Є getmntentдзвінок, але я не думаю, що він експортується в osмодулі. Швидкий і брудний? Відкрити / etc / mtab та split. Переконайтесь, що ваш пристрій присутній у стовпці 0, а точка монтажу в стовпці 1 є правильною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.