Я знаю, что есть /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 и так далее.
Прошу прощения за поздний ответ.
Мой вопрос был неправильным, мне не нужен элемент /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.
Hm, id - это не то, что вы обычно используете, чтобы однозначно идентифицировать раздел. Если UUID является вариантом, вы можете сделать это:
# blkid /dev/sdf1
/dev/sdf1: UUID="1cdc1aec-5bde-45d4-9202-bc8fdec378f1" TYPE="ext2"
blkid
поддерживает несколько параметров командной строки, чтобы дать вам разные уровни многословности и форматирования.
Причина, по которой вы обычно не используете идентификатор, заключается в том, что они не гарантированы быть уникальными. Обычно UUID.
Если это будет идентификатор, то итерация через каталог /dev/disk/by-id и поиск того, который указывает на нужное устройство, вероятно, проще всего.
/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
.
readlink -f "path-to-by-id-link"
это то, что вы хотите?ls -l /dev/disk/by-uuid/ | grep "sda" --color
.