Получить элемент /dev/disk/by-id из элемента /dev/sd*

Я знаю что есть /dev/disk/by-id/ папка, которая содержит ссылки на /dev/sd* элементы. Я хотел бы знать, есть ли способ получить by-id элемент, указывающий, например, на /dev/sda,

PS: да, я знаю, что могу перебирать элементы в by-id папка и /dev/sd*, чтобы я мог сравнить серийные номера и сопоставить их. Но есть ли лучший способ?

РЕДАКТИРОВАТЬ: извините за мою ошибку. Это должно быть сделано в C/C++. UUID были упомянуты. Это было бы здорово, они уникальны и так далее, но как я могу собрать все UUID одного жесткого диска? Я имею в виду основной, указывающий, например, на sda, и UUID раздела, указывающий на sda1, sda2 и так далее.

3 ответа

Решение

Прошу прощения за поздний ответ.

Мой вопрос был не прав, мне не нужно /dev/sd* элемент, чтобы получить /dev/disk/by-id/ элементы.

Я использовал libudev и получил эти элементы:

#include <libudev.h>

...

struct udev *udev;
udev = udev_new();

udev_enumerate *enumerate;
enumerate = udev_enumerate_new(udev);

udev_list_entry *udev_entries;
udev_list_entry *dev_list_entry;
udev_device *dev;

udev_enumerate_add_match_subsystem(enumerate, "block");
udev_enumerate_scan_devices(enumerate);
udev_entries = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, udev_entries)
{
    const char* path = udev_list_entry_get_name(dev_list_entry);
    dev = udev_device_new_from_syspath(udev, path);
    const char* bus = udev_device_get_property_value(dev, "ID_BUS");
    const char* type = udev_device_get_property_value(dev, "ID_TYPE");

    if (!bus || !type)
        continue;

    // strncmp return 0 if equal
    if (!(strncmp(bus, "ata", 3) &&
            !strncmp(type, "disk", 4))
        continue;

    // i wanted to get only partitions, so parent is empty
    udev_device *parent = 
        udev_device_get_parent_with_subsystem_devtype(dev, "block", "disk");
    if (!parent)
        continue;

    // get /dev/disk/by-id/...-partX
    struct udev_list_entry* devlinks = udev_device_get_devlinks_list_entry(dev);
    std::string partition(udev_list_entry_get_name(devlinks));
    // now we have /dev/disk/by-id/...-partX in partition and can save it somewhere
}

PS: я использовал это в специальном дистрибутиве на основе LFS, который имеет серийные номера в /dev/disk/by-id/ название.

Я знаю, что это старый вопрос, но все же это первый результат, когда его задают в Google, но ни один из приведенных выше ответов не относится к вопросу ОП (который, как они признали, был неправильным, но он соответствует вопросу, который я задавал)

Оказывается, решение, которое я нашел, заключалось в том, что для диска «sda» вы можете найти идентификатор, запустив

      udevadm info -q symlink --path=/sys/block/sda | awk '{print "/dev/" $1}'

Хм, идентификатор - это не то, что вы обычно используете для уникальной идентификации раздела. Если UUID является опцией, вы можете сделать это:

# blkid  /dev/sdf1
/dev/sdf1: UUID="1cdc1aec-5bde-45d4-9202-bc8fdec378f1" TYPE="ext2" 

blkid поддерживает несколько параметров командной строки, чтобы дать вам различные уровни детализации и форматирования.

Причина, по которой вы обычно не используете идентификатор, заключается в том, что он не гарантированно будет уникальным. UUIDs обычно есть.

Если это должен быть идентификатор, перебирать каталог /dev/disk/by-id и находить тот, который указывает на желаемое устройство, вероятно, проще всего.

Другие вопросы по тегам