Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libblkid仅在以root身份运行后与root一起工作_C_Linux_Blkid - Fatal编程技术网

C libblkid仅在以root身份运行后与root一起工作

C libblkid仅在以root身份运行后与root一起工作,c,linux,blkid,C,Linux,Blkid,这是我见过的最奇怪的事情(事实上,它有一个很好的解释) 我创建了一个C代码来列出分区及其自己的类型: char *get_luks_partition(void) { blkid_dev dev; blkid_cache cache; blkid_dev_iterate iter; const char *devname = NULL; char *ret = NULL; const char *type = NULL; if (blki

这是我见过的最奇怪的事情(事实上,它有一个很好的解释)

我创建了一个C代码来列出分区及其自己的类型:

char *get_luks_partition(void) {
    blkid_dev dev;
    blkid_cache cache;
    blkid_dev_iterate iter;
    const char *devname = NULL;
    char *ret = NULL;
    const char *type = NULL;

    if (blkid_get_cache(&cache, NULL))
        return NULL;
    blkid_probe_all(cache);

    iter = blkid_dev_iterate_begin(cache);

    while (!blkid_dev_next(iter, &dev)) {
        devname = blkid_dev_devname(dev);
        type = blkid_get_tag_value(cache, "TYPE", devname);

        if (type)
            printf("dev: %s type: %s\n", devname, type);

        if (type && !strcmp(type, "crypto_LUKS")) {
            ret = (char *) devname;
            break;
        }
    }

    blkid_dev_iterate_end(iter);

    return ret;
}
当我作为普通用户运行时,它不会显示任何设备/分区和类型。 因此,我尝试以root用户身份运行,最终看到了设备、分区和类型。 当我返回到user时,如果我再次运行,我可以看到与root相同的输出。 请参见顺序:

$ ./main 
dev: /dev/sr0 type: udf

$ sudo ./main 
dev: /dev/vda1 type: vfat
dev: /dev/vda2 type: xfs
dev: /dev/vda3 type: crypto_LUKS

$ ./main 
dev: /dev/vda1 type: vfat
dev: /dev/vda2 type: xfs
dev: /dev/vda3 type: crypto_LUKS
有人知道发生了什么吗?

从BLKID(8)手册页:

libblkid库用于识别块设备(磁盘)的内容(如文件系统类型),并提取附加信息,如文件系统标签/卷名、唯一标识符/序列号 贝尔斯。一个常见的用途是允许使用LABEL=和UUID=标记,而不是将特定的块设备名称硬编码到配置文件中

请注意,blkid直接从设备读取信息,对于非root用户,它返回缓存的未验证信息。

从LIBBLKID(3)手册页:

库的高级部分保存有关块的信息 缓存文件中的设备,并且在被 返回给用户(如果用户对原始块具有读取权限 设备,否则 不)缓存文件还允许未经授权的用户(通常是root用户以外的任何人,或不在“磁盘”组中的用户)查找 按标签/id列出的设备。缓存文件的标准位置可以是 被环境所覆盖 环境变量BLKID_文件

因此,在以root用户身份运行之后,信息将被缓存。之后,当您以非root身份再次运行时,将检索该信息