Требуемая информация существует в sysfs, которая предоставляет дерево устройств linux.Это моделирует отношения между устройствами в системе, и, так как вы пытаетесь определить родительское дисковое устройство из раздела, это место для поиска.Я не знаю, существуют ли какие-либо жесткие и быстрые правила, на которые можно положиться, чтобы остановить разрыв кода с будущими версиями ядра, но разработчики ядра стараются поддерживать sysfs как стабильный интерфейс.
Есливы посмотрите на /sys/dev/block/<major>:<minor>
, вы увидите, что это символическая ссылка с компонентами хвоста, равными block/<disk-device-name>/<partition-device-name>
.Если вы должны выполнить системный вызов readlink(2)
, вы можете проанализировать место назначения ссылки, чтобы получить имя дискового устройства.В оболочке (так как это проще выразить, но сделать это в C будет довольно просто):
$ echo $(basename $(dirname $(readlink /sys/dev/block/8:33)))
sdc
В качестве альтернативы, вы можете воспользоваться вложенностью каталогов разделов в каталогах дисков (опять же вshell, но из C, это open(2)
, read(2)
и close(2)
):
$ cat /sys/dev/block/8:33/../dev
8:32
Предполагается, что ваш начальный мажор: младший на самом деле для раздела, а не какой-то другойустройство.