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

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

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

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

Тем не менее, я ищу наименее громоздкий метод, чтобы сделать это программно с 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 и файловых систем ядра?Как правильно получить это представление по старшему и младшему числу?Как правильно получить подробную информацию о блочном устройстве?
 code_onkel13 сент. 2016 г., 13:49
@qarmastatfs не возвращает полезную информацию в моем случае. Кстати, мне особенно нравится эта цитата со страницы руководства: «Никто не знает, что должен содержать f_fsid (но см. Ниже)».
 Dima Tisnek13 сент. 2016 г., 13:42
os.stat хорошо, нет ничего плохого в этом
 code_onkel12 сент. 2016 г., 12:05
@Phillip Если разбирать файлы из/proc это канонический способ, это правильный ответ. Мне трудно найти нормативные ссылки / лучшие практики относительно данных, которые я хотел бы получить.
 Dima Tisnek13 сент. 2016 г., 13:44
еще один системный вызов, который вы можете использовать:statfsесть обёртка для этого в libcstatfs/fstatfs/statfs64/fstatfs64 который вы можете достичь черезctypes.CDLL(None) поскольку libc уже загружен в текущем процессе.
 Phillip12 сент. 2016 г., 10:55
Актуальные версии/bin/mount работать чтением/proc/self/mountinfo. Структура файла объясняется здесь. Ответы на вопросы, как сделать то же самое с помощью C указать, что нет лучшей альтернативы.

Ответы на вопрос(3)

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

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

 LSerni19 сент. 2016 г., 11:28
Спасибо, и я согласен не принимать ответ. Возможно вы могли бы спросить на SuperUser?
 code_onkel19 сент. 2016 г., 11:43
Я, вероятно, оставлю это на этом пока. Мое текущее решение, кажется, работает хорошо, хотя мне оно не очень нравится. Рассматривая альтернативы (например, делая фантазииioctl звонки какhdparm или взаимодействовать сdbus или жеudev напрямую) разбор/proc и выходudevadm кажется, хорошая идея.
 code_onkel19 сент. 2016 г., 11:22
Я вручил вам награду, потому что ваш ответ содержал для меня наиболее полезную информацию (или указывал на нее). Однако я не приму это, потому что нет однозначного ответа относительно лучших практик или канонического решения. Сейчас я даже сомневаюсь, что получу такой ответ на SO. Главным образом потому, что это такая конкретная тема.

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

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

Ваш ответ на вопрос