从/ dev / sd *元素获取/ dev / disk / by-id元素

时间:2014-11-21 18:06:35

标签: c++ c linux serial-number hdd

我知道/dev/disk/by-id/文件夹包含指向/dev/sd*元素的链接。我想知道,有没有办法让by-id元素指向,例如/dev/sda

P.S。:是的,我知道我可以遍历by-id文件夹和/dev/sd*中的元素,这样我就可以比较序列号并匹配它们。但还有更好的方法吗?

编辑:抱歉我的错误。它应该在C / C ++中完成。提到了UUID。那将是伟大的,它们是独一无二的等等,但我如何收集一个硬盘的所有UUID?我的意思是主要的,例如指向sda,并分区UUID,指向sda1,sda2等等。

2 个答案:

答案 0 :(得分:1)

对不起,我很抱歉。

我的问题是错的,我不需要/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
}

P.S。:我在基于LFS的特殊发行版中使用了它,它的序列号都是/dev/disk/by-id/

答案 1 :(得分:0)

嗯,id不是你通常用来唯一标识分区的东西。如果UUID是一个选项,您可以这样做:

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

blkid支持一些命令行选项,为您提供不同级别的详细程度和格式。

您不能正常使用该ID的原因是它们不能保证是唯一的。 UUID通常是。

如果它必须是id,则遍历/ dev / disk / by-id目录并找到指向所需设备的目录可能是最简单的。

相关问题