Назад | Перейти на главную страницу

Posix map fs путь к syspath

Есть ли безопасный способ сопоставить путь файловой системы с / sys / block / node.

Например, в моей системе (Ubuntu) мой / путь монтируется из / dev / disk / by-uuid / 7f6a93a7-1e63-48a3-a7e3-b336a2f9dbf7, который является символической ссылкой на / dev / sda1, который является разделом / dev / sda который соответствует / sys / block / sda

Как мне получить:

/ -> /sys/block/sda

безопасным способом, на который я могу положиться при работе со всеми дистрибутивами?

Спасибо 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;
}

fstat() в файле возвращает struct stat который содержит поле типа dev_t. Есть макросы, которые извлекают старший и младший номера устройств. Они однозначно идентифицируют диск и раздел в системе.