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çãoEstou 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?