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

0

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

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

EDIT: извините за мою ошибку. Это должно быть сделано в документе C/C++. Были упомянуты UUID. Это было бы здорово, они уникальны и так далее, но как я могу собрать все UUID одного hdd? Я имею в виду основной, указывающий на sda, например, и раздел UUID раздела, указывающий на sda1, sda2 и так далее.

  • 0
    readlink -f "path-to-by-id-link" это то, что вы хотите?
  • 1
    Этот вопрос не о программировании, он должен был быть размещен на SuperUser . В любом случае попробуйте это: ls -l /dev/disk/by-uuid/ | grep "sda" --color .
Показать ещё 2 комментария
Теги:
serial-number
hdd

2 ответа

1
Лучший ответ

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

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

Я использовал 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/ name.

0

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

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

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

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

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

  • 0
    Хм, я думал, что они включили серийный номер, поэтому я хотел использовать их.
  • 0
    @cheetahfm Не обязательно. Например, мой рабочий стол Linux Mint имеет устройства в /dev/disk/by-id с именами, такими как: dm-name-rroot , md-name-mint:0 . Это могут быть необычные случаи (RAID, LUKS-шифрование), но у вас нет гарантии на наличие серийных номеров. Для реальных аппаратных разделов вы должны быть в безопасности. by-id не реализован во всех дистрибутивах Linux. Например, в Centos 6.x у вас есть by-uuid , by-label и by-name , но не by-id .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню