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