파이썬을 사용해야하는 곳에 볼륨이 마운트되어 있는지 어떻게 확인할 수 있습니까?


10

소스 디렉토리를 복사하기 전에 대상 디렉토리를 만드는 Python으로 작성된 백업 스크립트가 있습니다. /external-backup외부 하드 드라이브를 마운트하는 대상 으로 사용하도록 구성했습니다 . 방금 하드 드라이브를 켜거나 마운트하지 않고 스크립트를 실행했으며 내부 하드 드라이브에서 백업을 수행하지만 자체 백업 할 공간이 거의없는 정상적인 작동 상태임을 알았습니다.

내 질문은 : 쓰기 전에 볼륨이 올바른 위치에 마운트되어 있는지 어떻게 확인할 수 있습니까? /external-backup마운트되지 않은 것을 감지 할 수 있으면 쓰지 못합니다.

보너스 질문은 디렉토리가 다른 장치에 있어야한다는 것을 OS가 알고있을 때 이것이 허용 된 이유와 나중에 해당 장치 (외장 하드 드라이브)를 마운트 해야하는 데이터 (내부 하드 드라이브)에 어떤 일이 발생합니까? 분명히 같은 경로에 다른 장치에 두 개의 사본이있을 수 없습니다!

미리 감사드립니다!

답변:


23

나는 살펴볼 것이다 os.path.ismount().


1
유일한 문제는 부울을 반환하고 올바른 장치가 있는지 여부를 지정하지 않는다는 것입니다.
McJeff

3
@McJeff : 그건 사실이 말하지 않는 그것은 알 수 있는 경우 . 장치가 없으면 false를 반환하고 해당 경로에 쓰면 상위 파일 시스템 의 기본 디렉토리에 씁니다 . 따라서 false를 반환하면 오류를 발생시키고 쓰지 마십시오. 디렉토리 /external-backup는 외부 장치에 있지 않고 부모 파일 시스템에 있습니다. 시스템은 무엇을 mount말해야 하는지 알고 있으며, 거기에 무엇이 있어야 할지 전혀 모릅니다 . 유닉스 파일 시스템의 "마운트 포인트"에는 특별한 것이 없습니다. 그것은 단지 일반적인 디렉토리입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

그것은 완벽하게 작동합니다. 나는 그것이 마운트 된 다른 볼륨들로부터 보호하지 않을 것입니다. 단지 그것이 부모 파일 시스템이 아니라는 것입니다. 다른 답변자에게 미안하지만, 귀하의 답변이 내 질문에 더 정확하게 대답 할 수는 있지만 처음에 무엇을 요청할지 알지 못해서 두려워합니다.) 어쨌든 당신을 평가했습니다. .
Ben Hymers

좋은 설명입니다!
McJeff

5

커널 만이 알고있는 것에 대한 확실한 대답을 위해, 커널에게 물어보십시오 :

cat /proc/mounts

원하는 도구를 사용하여 일반 파일 인 것처럼 해당 파일을 읽고 파싱 할 수 있습니다. 파이썬 포함. 빠른 n 더러운 예 :

#!/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? 이러한 경우 출력의 구문 분석이 신뢰할 수 없을 수 있습니다.
skyking

2

보너스 답변. 외부 장치가 마운트되지 않은 경우 경로의 루트 파티션에 데이터가 기록됩니다 /external-backup. 외부 장치가 마운트 된 경우 루트 파티션에 데이터가 여전히 있지만 /external-backup이제 외부 장치를 가리 키 므로 연결할 수 없습니다 .


2

오래된 질문이지만 어쨌든 내 솔루션 ( Dennis WilliamsonIgnacio Vazquez-Abrams의 답변을 바탕으로)에 기여할 것이라고 생각했습니다 . 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.