You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需root权限,用C语言获取逻辑卷所属设备UUID的可行性及实现思路?

问题解答

能否无root权限获取逻辑卷设备UUID?

可以。Linux系统中,逻辑卷的UUID信息会通过sysfs文件系统暴露,相关文件的权限允许普通用户读取,因此无需root权限即可获取。

高效实现方案(C语言)

核心思路是直接读取sysfs中暴露的设备UUID信息,避免调用外部工具,实现高效且可靠的获取:

实现步骤

  1. 获取逻辑卷的设备号:通过stat()函数读取逻辑卷路径的设备属性,提取主、次设备号。
  2. 拼接sysfs UUID文件路径:利用主、次设备号拼接出sysfs中对应设备的UUID文件路径(格式为/sys/dev/block/<主设备号>:<次设备号>/uuid)。
  3. 读取UUID内容:直接打开并读取该文件的内容,得到设备UUID。

示例代码

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

#define SYSFS_BLOCK_PREFIX "/sys/dev/block/"
#define UUID_FILENAME "uuid"
#define UUID_BUF_LEN 64

char* get_logical_volume_uuid(const char* lv_path) {
    struct stat dev_stat;
    if (stat(lv_path, &dev_stat) != 0) {
        perror("Failed to access logical volume");
        return NULL;
    }

    // 构造sysfs下的UUID文件路径
    char uuid_file_path[256];
    snprintf(uuid_file_path, sizeof(uuid_file_path), 
             "%s%d:%d/%s", SYSFS_BLOCK_PREFIX, 
             major(dev_stat.st_rdev), minor(dev_stat.st_rdev), UUID_FILENAME);

    // 读取UUID文件
    FILE* uuid_file = fopen(uuid_file_path, "r");
    if (!uuid_file) {
        perror("Failed to open UUID file");
        return NULL;
    }

    char* uuid = malloc(UUID_BUF_LEN);
    if (!uuid) {
        perror("Memory allocation failed");
        fclose(uuid_file);
        return NULL;
    }

    if (fgets(uuid, UUID_BUF_LEN, uuid_file) == NULL) {
        perror("Failed to read UUID");
        free(uuid);
        fclose(uuid_file);
        return NULL;
    }

    // 移除换行符
    uuid[strcspn(uuid, "\n")] = '\0';
    fclose(uuid_file);
    return uuid;
}

int main(int argc, char* argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <logical_volume_path>\n", argv[0]);
        return 1;
    }

    char* uuid = get_logical_volume_uuid(argv[1]);
    if (uuid) {
        printf("Logical Volume UUID: %s\n", uuid);
        free(uuid);
        return 0;
    }
    return 1;
}

方案优势

  • 高效低开销:直接读取内核暴露的sysfs文件,无需启动外部进程(如blkid、lsblk),性能开销极小。
  • 权限友好:sysfs下的uuid文件默认对所有用户可读,完全不需要root权限。
  • 稳定性强:sysfs是Linux设备信息的标准暴露接口,输出格式固定,比解析命令行工具的输出更可靠,不易受版本更新影响。

注意事项

  • 确保系统已挂载sysfs(绝大多数Linux发行版默认会挂载/sys)。
  • 目标逻辑卷必须处于激活状态且可正常访问。

内容的提问来源于stack exchange,提问作者Giorgos Xou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:10:56