Cómo obtener información detallada del dispositivo / partición desde la ruta del archivo en Linux (como UUID, disco duro en serie, etc.)

Comenzando con una ruta de archivo absoluta, quiero obtener la siguiente información:

El punto de montaje del sistema de archivos en el que se almacena el archivo (para calcular la ruta relativa al punto de montaje)El UUID y la etiqueta del sistema de archivosEl tipo (o nombre del proveedor) y el número de serie del disco duro que contiene la partición

Soy consciente de que 2 y 3 pueden estar indefinidos en muchos casos (por ejemplo, para loopback, ramfs, dispositivos encriptados), lo cual está totalmente bien.También sé cómo obtener esa información utilizando un shell y herramientas del sistema comodf y el/sys o/proc sistema de archivos Veresta pregunta para referencia.

Sin embargo, estoy buscando el método menos complicado para hacerlo programáticamente con Python 3.5. Eso significa:

Prefiere llamadas del sistema en lugar de analizar el contenido de/proc o/sys (que puede estar sujeto a cambios o depender de la configuración del núcleo)Evite llamar a subprocesos y analizar su salida (la definición de engorroso)

Hasta ahora, estoy usandoos.stat() en el camino para obtener el número mayor y menor del dispositivo de bloquestat_result.st_dev. Pero, ¿cuál es la forma correcta de proceder?

Hay por ejemplo

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

Notas: En cuanto a dispositivos de bloque montados y particiones,/proc/mounts y/proc/partitions parece ser la fuente de información canónica (que está bien). Para UUID, etiquetas, seriales, etc. Actualmente usoudevadm y analizar la salida:

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)

Nota adicional: haciendo un resumen de mi problema acutal, uno podría preguntar de manera más general:

¿Cuál es la identificación o representación canónica de un dispositivo de bloque con respecto a las llamadas al sistema Linux y los sistemas de archivos del núcleo?¿Cuál es la forma correcta de obtener esa representación por número mayor y menor?¿Cuál es la forma correcta de obtener información detallada sobre un dispositivo de bloque?

Respuestas a la pregunta(3)

Su respuesta a la pregunta