Bagaimana saya bisa memeriksa apakah volume sudah terpasang di tempat yang seharusnya menggunakan Python?

9

Saya punya skrip cadangan yang ditulis dengan Python yang membuat direktori tujuan sebelum menyalin direktori sumber ke sana. Saya telah mengonfigurasinya untuk digunakan /external-backupsebagai tujuan, yang merupakan tempat saya memasang hard drive eksternal. Saya hanya menjalankan skrip tanpa hard drive dinyalakan (atau sedang dipasang) dan menemukan bahwa itu berfungsi seperti biasa, meskipun membuat cadangan pada hard drive internal, yang tidak memiliki ruang yang cukup dekat untuk mendukungnya.

Pertanyaan saya adalah: bagaimana saya bisa memeriksa apakah volume sudah dipasang di tempat yang tepat sebelum menulis? Jika saya dapat mendeteksi yang /external-backuptidak dipasang, saya dapat mencegah menulisnya.

Pertanyaan bonusnya adalah mengapa ini diizinkan, ketika OS tahu direktori itu seharusnya hidup di perangkat lain, dan apa yang akan terjadi pada data (pada hard drive internal) jika saya nanti memasang perangkat itu (hard drive eksternal)? Jelas tidak ada dua salinan pada perangkat yang berbeda di jalur yang sama!

Terima kasih sebelumnya!

Ben Hymers
sumber

Jawaban:

22

Saya akan melihat os.path.ismount().

Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
Satu-satunya masalah adalah ia mengembalikan boolean & tidak menentukan apakah ada perangkat yang tepat.
McJeff
3
@ MCJeff: Itu benar tidak tahu yang memberitahu jika . Jika tidak ada perangkat di sana, itu akan kembali palsu dan menulis ke jalan itu akan menulis ke direktori yang mendasarinya di sistem file induk . Jadi jika itu mengembalikan false, mengeluarkan kesalahan dan jangan menulis di sana. Direktori /external-backuptidak hidup di perangkat eksternal, ia hidup di sistem file induk. Sistem hanya tahu apa yang mountmemberitahukannya, tidak tahu apa yang seharusnya ada di sana. Tidak ada yang istimewa tentang "mount point" pada sistem file Unix. Itu hanya direktori biasa.
Dijeda sampai pemberitahuan lebih lanjut.
Itu melakukan pekerjaan dengan sempurna. Saya tidak akan melindungi volume lain yang dipasang di sana, hanya saja itu bukan sistem berkas induk. Maaf untuk para penjawab lain, jawaban Anda mungkin menjawab pertanyaan saya dengan lebih tepat, tetapi saya khawatir saya tidak tahu apa yang harus ditanyakan karena Anda mungkin bisa mengatakannya;) .
Ben Hymers
Penjelasan yang bagus!
McJeff
5

Untuk jawaban pasti atas sesuatu yang hanya diketahui oleh kernel, tanyakan pada kernel:

cat /proc/mounts

File itu dapat dibaca / diurai seperti file biasa, menggunakan alat apa pun yang Anda suka. Termasuk Python. Contoh cepat-n-kotor:

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

Cara termudah untuk memeriksa adalah memohon mountmelalui subprocessdan melihat apakah itu muncul di sana. Untuk kredit tambahan, gunakan os.readlink()pada konten /dev/disk/by-*untuk mengetahui perangkat apa itu.

Ignacio Vazquez-Abrams
sumber
Seperti yang saya lihat, masalah dengan pendekatan itu adalah bahwa output dari mountsloppily didefinisikan dengan paling baik. Apa artinya mountoutput jika saya sudah mount /dev/evil device on tourdi /directory on which I mount devices? Penguraian output mungkin tidak dapat diandalkan dalam kasus-kasus seperti ...
melonjak
2

Jawaban bonus. Jika perangkat eksternal tidak dipasang data ditulis ke root partisi di jalur /external-backup. Jika perangkat eksternal dipasang data pada partisi root masih ada tetapi tidak dapat dijangkau karena /external-backupsekarang menunjuk ke perangkat eksternal.

Coder Kasual
sumber
2

Pertanyaan lama, tapi saya pikir saya akan berkontribusi solusi saya (berdasarkan jawaban Dennis Williamson dan Ignacio Vazquez-Abrams ). Karena saya menggunakannya pada lingkungan non-Linux untuk memeriksa direktori remote yang sedang di-mount, / proc dan mtab tidak dapat digunakan dan tidak ada pemeriksaan tambahan yang telah dilaksanakan:

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

Selamat datang, perbaikan!

Magentron
sumber
1

File / etc / mtab ada untuk memberi tahu Anda apa yang sedang di-mount. Ada getmntentpanggilan, tapi saya pikir itu tidak diekspor dalam osmodul. Cepat dan kotor? Buka / etc / mtab dan split. Pastikan perangkat Anda ada di kolom 0 dan titik pemasangan tujuan di kolom 1 sudah benar.

McJeff
sumber