Posix 将 fs 路径映射到 syspath

Posix 将 fs 路径映射到 syspath

是否有一种安全的方法将文件系统路径映射到 /sys/block/ 节点。

例如在我的系统(Ubuntu)上,我的 / 路径是从 /dev/disk/by-uuid/7f6a93a7-1e63-48a3-a7e3-b336a2f9dbf7 挂载的,它是 /dev/sda1 的符号链接,而 /dev/sda1 是 /dev/sda 的一个分区,映射到 /sys/block/sda

我如何从:

/ -> /sys/block/sda

以一种我可以依赖的安全方式在所有发行版中工作?

答案1

fstat()文件返回一个struct stat包含 类型的字段dev_t。有一些宏可以提取主设备号和次设备号。它们唯一地标识了系统上的驱动器和分区。

答案2

感谢 caskey 为我指明了正确的方向。如果其他人需要相同的功能,以下是将路径转换为设备的函数:

#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string>

std::string getPhysicalDiskSerialNumber(const char *path) {
    struct stat s;
    char syspath[256];
    syspath[0] = '\0';
    stat(path,&s);
    sprintf(syspath,"/sys/dev/block/%d:%d",major(s.st_dev),minor(s.st_dev));

    struct udev *context = udev_new();
    struct udev_device *device = udev_device_new_from_syspath(context, syspath);
    const char *id = udev_device_get_property_value(device, "ID_SERIAL");
    std::string serial = id;

    // Cleanup
    udev_device_unref(device);
    udev_unref(context);
    return serial;
}

相关内容