Начиная с абсолютного пути к файлу, я хочу получить следующую информацию:
- Точка монтирования файловой системы, на которой хранится файл (для вычисления пути относительно точки монтирования)
- 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 и файловых систем ядра?
- Каков правильный способ получить это представление по основному и второстепенному числу?
- Каков правильный способ получения подробной информации о блочном устройстве?