2024-06-11 07:09:51 发布
网友
如何使用Python来确定哪个Linux设备/分区包含给定的文件系统?
例如
>>> get_filesystem_device('/') /dev/sda >>> get_filesystem_partition('/') /dev/sda1
你的问题是关于Linux的,所以这是(或多或少)Linux特有的。
下面是三个变量的代码示例,用于将主/辅映射到设备名称。
我认为/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,以便与/返回的结果相匹配:
/dev/sda2
/
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
你的问题是关于Linux的,所以这是(或多或少)Linux特有的。
下面是三个变量的代码示例,用于将主/辅映射到设备名称。
我认为/proc/partitions是最简单的—它只是一个要打开和检查的文件。哈尔给你提供了大部分信息,并抽象出许多细节。sysfs可以被视为比/proc/partitions更正确,并且不需要运行hal。
对于桌面程序,我会选择哈尔。在嵌入式系统上,我会使用sysfs。
它不是最纯洁的,但这会让你开始:
在OS X上:
在Ubuntu上:
要获取设备名称,请从分区名称中切掉次要编号。在OSX上,也要切掉“s”+小号。
这篇文章似乎有你的一些答案(仍然不确定如何从
/dev/sda2
条目中获取major/minor,以便与/
返回的结果相匹配:Device number in stat command output
相关问题 更多 >
编程相关推荐