如何检查是否使用Python安装了卷?


10

我有一个用Python编写的备份脚本,该脚本会在将源目录复制到目标目录之前创建目标目录。我已将其配置为/external-backup用作目标,这是我安装外部硬盘驱动器的位置。我只是在未打开(或未安装)硬盘驱动器的情况下运行了脚本,但发现它可以正常工作,尽管在内部硬盘驱动器上进行了备份,而内部硬盘驱动器没有足够的空间来进行自我备份。

我的问题是:如何在写入卷之前检查该卷是否安装在正确的位置?如果可以检测到/external-backup未安装,则可以防止对其进行写入。

额外的问题是,当操作系统知道该目录应该存在于另一台设备上时,为什么允许这样做?我以后再挂载该设备(外部硬盘驱动器)时,数据(内部硬盘驱动器)会发生什么情况?显然,同一路径上的不同设备上不能有两个副本!

提前致谢!

Answers:


23

我来看看os.path.ismount()


1
唯一的问题是,它返回一个布尔值,并且未指定是否存在正确的设备。
McJeff 2010年

3
@McJeff:这是真的不知道它告诉如果。如果没有设备,它将返回false,对该路径的写入将写入文件系统中的基础目录。因此,如果它返回false,则发出错误并且不要在此处写。该目录/external-backup不在外部设备上,而是在父文件系统上。该系统只知道mount说什么,它不知道应该有什么。Unix文件系统上的“挂载点”没有什么特别的。这只是一个常规目录。
暂停,直到另行通知。

那做得很好。我不会防止其他卷挂在那里,只是它不是父文件系统。很抱歉,其他回答者,您的回答可能会更准确地回答我的问题,但是恐怕我一开始可能不知道该问什么;)无论如何,我对您的评价都很高。
本·海默斯

很好的解释!
McJeff 2010年

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

奖励答案。如果未安装外部设备,则将数据写入path的根分区/external-backup。如果已装载外部设备,则根分区上的数据仍然存在,但由于/external-backup现在指向外部设备而无法访问。


2

老问题了,但我想我还是会贡献我的解决方案(基于丹尼斯·威廉姆森Dennis Williamson)伊格纳西奥·巴斯克斯(Ignacio 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列中是正确的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.