Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中确定文件系统的设备_Python_Linux - Fatal编程技术网

在Python中确定文件系统的设备

在Python中确定文件系统的设备,python,linux,Python,Linux,如何使用Python确定哪个Linux设备/分区包含给定的文件系统 e、 g 这篇文章似乎有你的一些答案(仍然不确定如何从/dev/sda2条目中提取主要/次要内容,以便与os.stat()为/返回的内容相匹配: 这不是最便宜的,但这会让你开始: #!/usr/bin/python import os, stat, subprocess, shlex, re, sys dev=os.stat('/')[stat.ST_DEV] major=os.major(dev) minor=os.mi

如何使用Python确定哪个Linux设备/分区包含给定的文件系统

e、 g


这篇文章似乎有你的一些答案(仍然不确定如何从
/dev/sda2
条目中提取主要/次要内容,以便与
os.stat()
/
返回的内容相匹配:


这不是最便宜的,但这会让你开始:

#!/usr/bin/python

import os, stat, subprocess, shlex, re, sys

dev=os.stat('/')[stat.ST_DEV]
major=os.major(dev)
minor=os.minor(dev)

out = subprocess.Popen(shlex.split("df /"), stdout=subprocess.PIPE).communicate()
m=re.search(r'(/[^\s]+)\s',str(out))

if m:
    mp= m.group(1) 
else:
    print "cannot parse df"   
    sys.exit(2)

print "'/' mounted at '%s' with dev number %i, %i" % (mp,major,minor)   
在OS X上:

'/' mounted at '/dev/disk0s2' with dev number 14, 2
在Ubuntu上:

'/' mounted at '/dev/sda1' with dev number 8, 1

要获取设备名称,请从分区名称中删除次要编号。在OS X上,也要删除“s”+次要编号。

您的问题是关于Linux的,因此这(或多或少)与Linux有关

下面是将主要/次要设备名称映射到设备名称的三个变体的代码示例

  • Parse/proc/partitions
  • hal还跟踪“父”设备,这意味着您可以很容易地获得磁盘和分区
  • 自己检查系统。这是hal获取信息的地方
我认为/proc/partitions是最简单的—它只是一个打开和检查的文件。hal为您提供了大部分信息,并抽象了很多细节。sysfs可能比/proc/partitions更正确,并且不需要hal运行

对于桌面程序,我会选择hal。对于嵌入式系统,我会选择sysfs



我最近也需要这个解决方案,在看到通过纯python获得所需结果的所有复杂方法后,我决定求助于shell

import subprocess
device = subprocess.check_output("grep '/filesystem' /proc/mounts | awk '{printf $1}'", shell=True)
print device
这正好提供了我想要的,文件系统安装位置的设备字符串


简短、甜美且在python中运行。

上述解决方案中有很多都存在问题。这个问题实际上也有问题

最后一个答案(搜索/proc/mounts)根本不起作用:搜索“/”将匹配/proc/mounts中的每一行。即使这样纠正也行不通:

import subprocess
device = subprocess.check_output("awk '$2 == \"/filesystem\" { print $1}' /proc/mounts", shell=True)
print device
当“/filesystem”为“/”时,通常会得到两个条目,一个用于“rootfs”,另一个用于实际设备。如果装入的文件系统名称中有空格(空格在/proc/mounts中显示为\040),则它也将不起作用

btrfs子卷的问题更加严重。每个子卷都单独安装,但它们都共享同一个设备。如果您试图使用btrfs快照进行备份(就像我一样),则需要子卷名和文件系统类型的指示

此函数返回(设备、装入点、文件系统)的元组,似乎可以工作:

import os
def get_filesystem_partition(fs):
    res = None
    dev = os.lstat(fs).st_dev
    for line in file('/proc/mounts'):
        # lines are device, mountpoint, filesystem, <rest>
        # later entries override earlier ones
        line = [s.decode('string_escape') for s in line.split()[:3]]
        if dev == os.lstat(line[1]).st_dev:
            res = tuple(line)
    return res
导入操作系统
def get_文件系统_分区(fs):
res=无
dev=os.lstat(fs.st_-dev)
对于文件('/proc/mounts')中的行:
#行是设备、装入点、文件系统、,
#后面的条目覆盖前面的条目
line=[s.decode('string_escape'),用于line.split()[:3]]
如果dev==os.lstat(第[1]行),则st_dev:
res=元组(行)
返回res
这似乎适用于我所能想到的所有病例,尽管我预计仍有病态病例会出现这种情况。

使用(linux)blkid命令(/sbin/blkid)怎么样

-

这是带有(未安装)USB驱动器(sdb1)的双引导笔记本电脑上的输出


以下是如何简单地获取设备的主要和次要编号:

import os
major, minor = divmod(os.stat('/').st_dev, 256)

为什么不尝试解析
mount
?您可以解析/proc/partitions以将maj/min映射到name。我非常喜欢这个答案,所以我一直在寻找如何得到相反的结果来查找/dev/sda2(在示例中)。您可以不解析/proc/partitions,而是通过/dev/循环查找具有相应st_rdev(提示性名称,“reverse dev”匹配“dev”:)os.stat('/')。st_dev==os.stat('/dev/sda1')。st_rdevt这也比将/proc/mounts(如其他答案中的)视为raspberry pi(例如)要好将/dev/root作为“/”的挂载,即使“mount”命令输出提供了正确的/dev/mmc*设备文件。。
import subprocess
device = subprocess.check_output("awk '$2 == \"/filesystem\" { print $1}' /proc/mounts", shell=True)
print device
import os
def get_filesystem_partition(fs):
    res = None
    dev = os.lstat(fs).st_dev
    for line in file('/proc/mounts'):
        # lines are device, mountpoint, filesystem, <rest>
        # later entries override earlier ones
        line = [s.decode('string_escape') for s in line.split()[:3]]
        if dev == os.lstat(line[1]).st_dev:
            res = tuple(line)
    return res
$ uname --kernel-name --kernel-release
Linux 3.2.0-4-amd64

$ python --version
Python 2.7.3
#!/usr/bin/env python                                           

import subprocess

sys_command = "/sbin/blkid"
proc = subprocess.Popen(sys_command,
                        stdout=subprocess.PIPE,
                        shell=True)

# proc.communicate() returns a tuple (stdout,stderr)                          
blkid_output = proc.communicate()[0]

print blkid_output
$ ./blkid.py
/dev/sda1: LABEL="RECOVERY" UUID="xxxx-xxxx" TYPE="vfat"
/dev/sda2: LABEL="OS" UUID="xxxxxxxxxxxxxxx" TYPE="ntfs"
/dev/sda5: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"
/dev/sda6: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="swap"
/dev/sda7: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"
/dev/sdb1: LABEL="CrunchBang" TYPE="iso9660"
import os
major, minor = divmod(os.stat('/').st_dev, 256)