如何使用Python确定哪个Linux设备/分区包含给定的文件系统?
e.g。
>>> get_filesystem_device('/')
/dev/sda
>>> get_filesystem_partition('/')
/dev/sda1
答案 0 :(得分:2)
你的问题是关于Linux的,所以这或多或少都是针对Linux的。
以下是将major / minor映射到设备名称的三种变体的代码示例。
我会说/ proc / partitions是最简单的 - 它只是一个要打开和检查的文件。 hal为您提供大部分信息,并抽象出大量细节。可以将sysfs视为/ proc / partitions更正确,并且不需要hal运行。
对于桌面程序,我会选择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()
答案 1 :(得分:1)
看起来这篇文章有你的一些答案(仍然不确定如何从/dev/sda2
条目中获取主要/次要内容以匹配os.stat()
返回的/
}}:
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
答案 2 :(得分:1)
我最近也需要这个解决方案。在看到所有通过纯python获得结果的复杂方法之后,我决定转向shell寻求帮助。
import subprocess
device = subprocess.check_output("grep '/filesystem' /proc/mounts | awk '{printf $1}'", shell=True)
print device
这正是我想要的,我的文件系统安装位置的设备字符串。
简短,甜蜜,并在python中运行。 :)
答案 3 :(得分:0)
这不是最卑鄙的,但这会让你开始:
#!/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'+次要号码。
答案 4 :(得分:0)
上述解决方案存在很多问题。这个问题实际上也存在问题。
最后一个答案(搜索/ 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快照进行备份(就像我一样),那么您需要子卷名称和文件系统类型的指示。
此函数返回(device,mountpoint,filesystem)的元组,似乎可以工作:
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
这似乎适用于我能想到的所有情况,尽管我认为仍然存在病态情况,它会落到位。
答案 5 :(得分:0)
如何使用(linux)blkid命令(/ sbin / blkid)
$ 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
以下是具有(未安装)USB驱动器(sdb1)的双启动笔记本电脑的输出
$ ./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"
答案 6 :(得分:0)
以下是如何简单地获取设备的主要和次要数字:
import os
major, minor = divmod(os.stat('/').st_dev, 256)