3

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

我创建了一个 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 身份运行,我终于看到了设备、分区和类型。当我返回用户时,如果我再次运行,我可以看到与 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

有谁知道发生了什么?

4

1 回答 1

3

从 BLKID(8) 手册页:

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

...

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

从 LIBBLKID(3) 手册页:

库的高级部分将有关块设备的信息保存在缓存文件中,并在返回给用户之前验证是否仍然有效(如果用户对原始块设备具有读取权限,否则没有)。 缓存文件还允许非特权用户(通常是 root 以外的任何人,或不在“磁盘”组中的用户)通过标签/ID 定位设备。 缓存文件的标准位置可以被环境变量 BLKID_FILE 覆盖。

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

于 2019-06-04T20:25:00.493 回答