在Python中确定文件系统的设备
你怎么用Python来找出哪个Linux设备或分区包含特定的文件系统呢?
比如说:
>>> get_filesystem_device('/')
/dev/sda
>>> get_filesystem_partition('/')
/dev/sda1
9 个回答
1
看起来这篇帖子里有你想要的答案(不过我还是不太确定怎么从 /dev/sda2
这个条目中提取出主设备号和次设备号,以便和 os.stat()
对根目录 /
返回的结果进行匹配):
>>> 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
3
你的问题是关于Linux的,所以下面的内容主要是针对Linux的。
下面是三种将主设备号和次设备号映射到设备名称的代码示例。
- 解析 /proc/partitions 文件。
- 询问 hal。hal 还会跟踪“父”设备,这样你可以轻松获取磁盘和分区的信息。
- 自己检查 sysfs。这是 hal 获取信息的地方。
我觉得 /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()
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'和小号部分。