Как получить подробную информацию о устройстве/разделе из пути к файлу в Linux (например, UUID, серийный номер жесткого диска и т.д.)

Начиная с абсолютного пути к файлу, я хочу получить следующую информацию:

  • Точка монтирования файловой системы, на которой хранится файл (для вычисления пути относительно точки монтирования)
  • UUID и метка файловой системы
  • Тип (или имя производителя) и серийный номер жесткого диска, который содержит раздел

Я знаю, что во многих случаях 2 и 3 могут быть undefined (например, для loopback, ramfs, encyrpted devices), что совершенно нормально. Я также знаю, как получить эту информацию с помощью оболочки и системных инструментов, таких как df и файловая система /sys или /proc. См. этот вопрос для справки.

Тем не менее, я ищу метод наименьшего количества cumbersone для программного программирования с Python 3.5. Это означает:

  • Предпочитают системные вызовы вместо разбора содержимого /proc или /sys (которые могут быть изменены или зависят от конфигурации ядра?)
  • Избегайте вызывать подпроцессы и анализировать их вывод (определение громоздкости)

До сих пор я использую os.stat() на пути к тому, чтобы получить главное и второстепенное число блочного устройства с stat_result.st_dev. Но каков правильный путь?

Существует, например,

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

Примечания: Что касается монтируемых блочных устройств, то разделы /proc/mounts и /proc/partitions кажутся каноническими источниками информации (это нормально). Для UUID, ярлыков, сериалов и т.д. В настоящее время я использую udevadm и анализирую вывод:

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 и файловых систем ядра?
  • Каков правильный способ получить это представление по основному и второстепенному числу?
  • Каков правильный способ получения подробной информации о блочном устройстве?

Ответ 1

Это script в GitHub. Сегодня я столкнулся с использованием Python для получения информации о модели и модели привода (и много другие).

/proc/partitions содержит информацию о разделах; для получения более подробной информации вам нужно либо выполнить подпроцесс, как сейчас, или, например, для GPT выполнить синтаксический анализ.

Ответ 2

Лучший способ сделать это - через pyparted. Pyparted - привязки python к Parted, поддерживаемые одним из разработчиков Parted. Вы можете найти исходный код в github. К сожалению, UUID не может быть найден из parted, поэтому вам нужно разобрать blkid

Ответ 3

Это подразумевает некоторые утилиты и вывод anlyze. Запущенный с помощью os.popen, вы можете использовать bklkid для поиска uuids, чтение файла /etc/mtab позволяет узнать, какая файловая система установлена ​​в вашей системе и, таким образом, точки монтирования. Результат sfdisk -l дает вам анатомию диска. hdparm -I /dev/xxx предоставит вам серийные номера.