如何从Linux上的文件path获取详细的设备/分区信息(如UUID,硬盘序列等)

从绝对文件path开始,我想获得以下信息:

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

我知道2和3在很多情况下可能是未定义的(例如,对于回送,ramfs,encyrpted设备),这是完全正确的。 我也知道如何使用shell和系统工具(如df/sys/proc文件系统)来获取这些信息。 看到这个问题作为参考。

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

  • 更喜欢系统调用,而不是parsing/proc/sys (可能会有所变化或依赖于内核configuration?)
  • 避免调用subprocess并parsing其输出(繁琐的定义)

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

有例如

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

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

 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) 

进一步说明:从我的问题中抽象出来,可以问一个更一般的问题:

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

Solutions Collecting From Web of "如何从Linux上的文件path获取详细的设备/分区信息(如UUID,硬盘序列等)"

这是我在今天早些时候遇到的GitHub上的一个脚本,它使用Python获取有关驱动器制造和模型(以及许多其他)的信息。

/proc/partitions保存/proc/partitions信息; 要得到更详细的信息,你可以像现在这样运行一个子进程,或者像GPT 那样自己进行解析 。

最好的方法是通过pyparted 。 Pyparted是由Parted开发人员维护的Parted的Python绑定。 你可以在github上找到源代码。 不幸的是UUID无法从分开找到,所以你必须解析blkid

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