Como obter informações detalhadas do dispositivo / partição do caminho do arquivo no Linux (como UUID, disco rígido serial etc.)

Começando com um caminho de arquivo absoluto, desejo obter as seguintes informações:

O ponto de montagem do sistema de arquivos no qual o arquivo está armazenado (para calcular o caminho relativo ao ponto de montagem)O UUID e o rótulo do sistema de arquivosO tipo (ou nome do fornecedor) e o número de série do disco rígido que contém a partição

Estou ciente de que 2 e 3 podem ser indefinidos em muitos casos (por exemplo, para loopback, ramfs, dispositivos criptografados), o que é totalmente aceitável.Eu também sei como obter essas informações usando um shell e ferramentas de sistema comodf e a/sys ou/proc sistema de arquivo. Vejoessa questão para referência.

No entanto, estou procurando o método menos pesado para fazer isso programaticamente com o Python 3.5. Que significa:

Prefira chamadas do sistema em vez de analisar o conteúdo de/proc ou/sys (que pode estar sujeito a alterações ou depender da configuração do kernel?)Evite chamar subprocessos e analisar sua saída (a definição de complicado)

Até agora, estou usandoos.stat() no caminho para obter o número maior e menor do dispositivo de bloco destat_result.st_dev. Mas qual é a maneira correta de proceder?

Existe por exemplo

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

Notas: Em relação aos dispositivos de bloco montados e partições,/proc/mounts e/proc/partitions parece ser a fonte de informação canônica (o que é bom). Para UUIDs, etiquetas, periódicos, etc. Atualmente, usoudevadm e analise a saída:

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: Abstraindo do meu problema acutal, pode-se perguntar mais geral:

Qual é a identificação ou representação canônica de um dispositivo de bloco com relação às chamadas do sistema linux e aos sistemas de arquivos do kernel?Qual é a maneira correta de obter essa representação por número maior e menor?Qual é a maneira correta de obter informações detalhadas sobre um dispositivo de bloco?

questionAnswers(3)

yourAnswerToTheQuestion