Pythonを使用するはずの場所にボリュームがマウントされているかどうかを確認するにはどうすればよいですか?


9

ソースディレクトリをコピーする前に宛先ディレクトリを作成するPythonで記述されたバックアップスクリプトがあります。/external-backup外付けハードドライブをマウントする場所として使用するように構成しました。ハードドライブをオン(またはマウント)せずにスクリプトを実行したところ、内部ハードドライブにバックアップを作成しましたが、バックアップを作成するのに十分な空き領域がありませんでしたが、スクリプトは正常に機能していました。

私の質問は、書き込み前にボリュームが正しい場所にマウントされているかどうかを確認するにはどうすればよいですか?/external-backupマウントされていないことを検出できれば、書き込みを禁止できます。

ボーナスの質問は、ディレクトリが別のデバイスに存在するはずであるとOSが認識しているときに、なぜこれが許可されたのか、そしてそのデバイス(外付けハードドライブ)を後でマウントすると(内蔵ハードドライブ上の)データはどうなるのかということです。明らかに、同じパスの異なるデバイスに2つのコピーを置くことはできません。

前もって感謝します!

回答:


22

私は見てみましょうos.path.ismount()


1
唯一の問題は、ブール値を返し、適切なデバイスがそこにあるかどうかを指定しないことです。
McJeff、

3
@McJeff:それは教えてくれない本当のどのそれは伝えている場合。デバイスがそこにない場合、それはfalseを返し、そのパスへの書き込みはファイルシステムの基礎となるディレクトリに書き込みます。したがって、falseが返された場合は、エラーを発行し、そこには書き込みません。ディレクトリ/external-backupは外部デバイス上ではなく、親ファイルシステム上にあります。システムmountはそれが何を伝えているのかを知っているだけであり、そこに何があるべきかについての考えはありません。Unixファイルシステムの「マウントポイント」については、特別なことは何もありません。これは通常のディレクトリです。
追って通知があるまで一時停止。

それは完全に仕事をします。そこにマウントされている他のボリュームから保護するつもりはありません。それが親ファイルシステムではないということだけです。他の回答者には申し訳ありませんが、あなたの回答が私の質問にもっと正確に答える可能性がありますが、最初は何を尋ねればよいかわからなかったと思います;)とにかく私はあなたをすべて評価しました。
ベンハイマーズ

いい説明だ!
McJeff

5

カーネルだけが確実に知っていることに対する明確な答えについては、カーネルに尋ねてください:

cat /proc/mounts

そのファイルは、好きなツールを使用して、通常のファイルのように読み取り/解析できます。Pythonを含みます。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)

4

確認する最も簡単な方法は、mountvia を呼び出してsubprocess、そこに表示されるかどうかを確認することです。追加のクレジットについてos.readlink()は、のコンテンツを使用して、/dev/disk/by-*それがどのデバイスであるかを把握してください。


私が見ると、そのアプローチの問題は、の出力がmountせいぜいずさんに定義されていることです。にmountマウント/dev/evil device on tourした場合、何が出力され/directory on which I mount devicesますか?このような場合、出力の解析は信頼できない可能性があります...
18年

2

ボーナス答え。外部デバイスがマウントされていない場合、データはパスのルートパーティションに書き込まれます/external-backup。外部デバイスがマウントされている場合、ルートパーティション上のデータはまだ存在しますが、/external-backupは現在外部デバイスを指しているため到達できません。


2

古い質問ですが、とにかく自分の解決策(デニスウィリアムソンイグナシオバスケスエイブラムスの回答に基づく)を提供すると思いました。マウントされているリモートディレクトリをチェックするためにLinux以外の環境で使用しているため、/ procmtabを使用できず、追加のチェックは実装されていません。

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を開いて分割します。デバイスが列0にあり、列1の宛先マウントポイントが正しいことを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.