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ónSoy 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?