我知道/dev/disk/by-id/
文件夹包含指向/dev/sd*
元素的链接。我想知道,有没有办法让by-id
元素指向,例如/dev/sda
。
P.S。:是的,我知道我可以遍历by-id
文件夹和/dev/sd*
中的元素,这样我就可以比较序列号并匹配它们。但还有更好的方法吗?
答案 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目录并找到指向所需设备的目录可能是最简单的。