Python中文件系统设备的确定

2024-06-11 07:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如

>>> get_filesystem_device('/')
/dev/sda
>>> get_filesystem_partition('/')
/dev/sda1

Tags: devgetlinuxdevice分区partitionfilesystemsda
3条回答

你的问题是关于Linux的,所以这是(或多或少)Linux特有的。

下面是三个变量的代码示例,用于将主/辅映射到设备名称。

  • 解析/proc/partitions。
  • 问问哈尔。Hal还跟踪“父”设备,这意味着您可以轻松地获得磁盘和分区。
  • 你自己检查系统。这是哈尔获取信息的地方。

我认为/proc/partitions是最简单的—它只是一个要打开和检查的文件。哈尔给你提供了大部分信息,并抽象出许多细节。sysfs可以被视为比/proc/partitions更正确,并且不需要运行hal。

对于桌面程序,我会选择哈尔。在嵌入式系统上,我会使用sysfs。


import os

def main():
    dev = os.stat("/home/").st_dev
    major, minor = os.major(dev), os.minor(dev)

    print "/proc/partitions says:", ask_proc_partitions(major, minor)
    print "HAL says:", ask_hal(major, minor)
    print "/sys says:", ask_sysfs(major, minor)

def _parse_proc_partitions():
    res = {}
    for line in file("/proc/partitions"):
        fields = line.split()
        try:
            tmaj = int(fields[0])
            tmin = int(fields[1])
            name = fields[3]
            res[(tmaj, tmin)] = name
        except:
            # just ignore parse errors in header/separator lines
            pass

    return res

def ask_proc_partitions(major, minor):
    d = _parse_proc_partitions()
    return d[(major, minor)]

def ask_hal(major, minor):
    import dbus

    bus = dbus.SystemBus()
    halobj = bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
    hal = dbus.Interface(halobj, 'org.freedesktop.Hal.Manager')

    def getdevprops(p):
        bdevi = dbus.Interface(bus.get_object('org.freedesktop.Hal', p),
                               "org.freedesktop.Hal.Device")
        return bdevi.GetAllProperties()

    bdevs = hal.FindDeviceByCapability("block")
    for bdev in bdevs:
        props = getdevprops(bdev)
        if (props['block.major'], props['block.minor']) == (major, minor):
            parentprops = getdevprops(props['info.parent'])
            return (str(props['block.device']), 
                    str(parentprops['block.device']))

def ask_sysfs(major, minor):
    from glob import glob
    needle = "%d:%d" % (major, minor)

    files = glob("/sys/class/block/*/dev")
    for f in files:
        if file(f).read().strip() == needle:
            return os.path.dirname(f)

    return None

if __name__ == '__main__':
    main()

它不是最纯洁的,但这会让你开始:

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

要获取设备名称,请从分区名称中切掉次要编号。在OSX上,也要切掉“s”+小号。

这篇文章似乎有你的一些答案(仍然不确定如何从/dev/sda2条目中获取major/minor,以便与/返回的结果相匹配:

Device number in stat command output

>>> import os
>>> print hex(os.stat('/')[2])
0x802
  \ \minor device number
   \major device number

[me@server /]$ ls -l /dev/sda2
brw-rw----    1 root     disk       8,   2 Jun 24  2004 /dev/sda2
[me@server jgaines2]$               \    \minor device number
                                     \major device number

相关问题 更多 >