Я знаю что есть /dev/disk/by-id/
папка, которая содержит ссылки на /dev/sd*
элементы. Я хотел бы знать, есть ли способ получить by-id
элемент, указывающий, например, на /dev/sda
,
П.С .: Да, я знаю, что я могу перебирать элементы в by-id
папка и /dev/sd*
, чтобы я мог сравнить серийные номера и сопоставить их. Но есть ли лучший способ?
РЕДАКТИРОВАТЬ: извините за мою ошибку. Это должно быть сделано в C / C ++. UUID были упомянуты. Это было бы здорово, они уникальны и так далее, но как я могу собрать все UUID одного жесткого диска? Я имею в виду основной, указывающий, например, на sda, и UUID раздела, указывающий на sda1, sda2 и так далее.
Прошу прощения за поздний ответ.
Мой вопрос был неправильным, мне не нужно /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
}
П.С .: Я использовал это в специальном дистрибутиве на основе LFS, который имеет серийные номера в /dev/disk/by-id/
название.
Хм, идентификатор — это не то, что вы обычно используете для уникальной идентификации раздела. Если UUID является опцией, вы можете сделать это:
# blkid /dev/sdf1
/dev/sdf1: UUID="1cdc1aec-5bde-45d4-9202-bc8fdec378f1" TYPE="ext2"
blkid
поддерживает несколько параметров командной строки, чтобы дать вам различные уровни детализации и форматирования.
Причина, по которой вы обычно не используете идентификатор, заключается в том, что он не гарантированно будет уникальным. UUIDs обычно есть.
Если это должен быть идентификатор, перебирать каталог / dev / disk / by-id и находить тот, который указывает на желаемое устройство, вероятно, проще всего.