2016-07-04 62 views
11

以绝对文件路径开始,我希望获得以下信息:如何获取Linux上的文件路径详细的设备/分区信息(如UUID,串口硬盘等)

  1. 的挂载点文件系统的存储位置(为了计算相对于安装点的路径)
  2. 文件系统的UUID和标签
  3. 硬件的类型(或供应商名称)和序列号包含分区的驱动器

我知道2和3在许多情况下可能是不确定的(例如,用于回送,ramfs,encyrpted设备),这是完全没问题的。 我也知道如何使用外壳和系统工具(如df/sys/proc文件系统)获取该信息。请参阅this question以供参考。

但是,我正在寻找最简单的方法来用Python 3.5编程。这意味着:

  • 身高系统调用的/proc/sys解析内容,而不是
  • 避免调用子流程和分析它们的输出(烦琐的定义)(可能随时更改或依赖于内核配置?)

到目前为止,我在路径上使用os.stat()stat_result.st_dev获取块设备的主要和次要号码。但是,有什么正确的方法呢?

有例如

  • /proc/mounts
  • /proc/partitions
  • /sys/dev/block/<major>:<minor>

注: 关于安装块设备的分区,/proc/mounts/proc/partitions似乎是规范的信息源(这是OK)。对于的UUID,标签,连续等我目前使用udevadm和解析输出:

def get_udev_properties(dev_name):   
    cmd = ["udevadm", "info", "--query=property", "--name", dev_name] 
    result = subprocess.run(cmd, stdout=subprocess.PIPE) 
    return parse_properties(result.stdout) 

此外应注意:从我acutal抽象的问题,人们可能要问更普遍的:

  • 对于Linux系统调用和内核文件系统,块设备的规范标识或表示是什么?
  • 什么是通过主要和次要号码获得表示的正确方法?
  • 获取有关块设备的详细信息的正确方法是什么?
+1

当前'/斌/ mount'工作的版本中找到。 [这里解释文件的结构](https://www.kernel.org/doc/Documentation/filesystems/proc.txt)。 [问题的答案如何使用C](http://stackoverflow.com/questions/9280759/linux-function-to-get-mount-points)表示没有更好的选择。 – Phillip

+0

@Phillip如果从'/ proc'解析文件是规范的方式,那么这是一个有效的答案。我发现很难找到关于我想获得的数据的规范性参考资料/最佳实践。 –

+0

'os.stat'很好,没有什么不妥之处。 –

回答

1

这将意味着一些公用事业和anlyze输出。使用os.popen启动,您可以使用bklkid查找uuids,读取/etc/mtab文件许可证可以知道系统中安装了哪些文件系统,从而装入点。 sfdisk -l输出为您提供了磁盘解剖。 hdparm -I /dev/xxx会给你序列号。

3

这是一个script on GitHub我早些时候今天使用Python获取有关驱动器的品牌和型号(和许多其他人的)信息碰到。

/proc/partitions持有的分区信息;有关更详细的信息,您可以像现在一样运行子进程,或者例如GPT do the parsing yourself

+0

我将赏金赏给你,因为你的回答包含了我最有用的信息(或者指向我)。但是,我不会接受它,因为关于最佳实践或规范解决方案没有明确的答案。到现在为止,我甚至怀疑我会在SO上得到这样的答案。主要是因为它是一个特定的话题。 –

+0

谢谢,我同意不接受答案。可能你可以问SuperUser? – LSerni

+0

我现在可能会离开它。我目前的解决方案似乎运作良好,但我不太喜欢它。通过查看替代方案(例如,像'hdparm'那样花哨的'ioctl'调用或直接与'dbus'或'udev'交互)解析'/ proc'和'udevadm'的输出似乎是一个好主意。 –

2

做到这一点的最好办法是通过pyparted。 Pyparted是由Parted开发人员维护的Parted的python绑定。你可以找到源代码on github。不幸的是UUID的无法分开,所以你必须通过阅读'的/ proc /自/ mountinfo`解析blkid

相关问题