gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:57 25 4
gpt4 key购买 nike

我知道有 /dev/disk/by-id/ 文件夹,其中包含指向 /dev/sd* 元素的链接。我想知道,有什么方法可以让 by-id 元素指向例如 /dev/sda

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

编辑:对不起我的错误。它应该在 C/C++ 中完成。提到了 UUID。那太好了,它们是独一无二的等等,但是我怎样才能收集一个硬盘的所有 UUID?我的意思是 main,例如指向 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
}

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

关于c++ - 从/dev/sd* 元素获取/dev/disk/by-id 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com