这是我见过的最奇怪的事情(实际上,它有一个很好的解释)。
我创建了一个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
有人知道发生了什么事吗?
答案 0 :(得分:1)
在BLKID(8)手册页中:
libblkid库用于识别块设备(磁盘)的内容(例如文件系统类型)以及提取其他信息,例如文件系统标签/卷名,唯一标识符/序列号 啤酒。一种常见用法是允许使用LABEL =和UUID =标记,而不是将特定的块设备名称硬编码到配置文件中。
...
请注意,blkid直接从设备读取信息,对于非root用户,它将返回缓存的未验证信息。
在LIBBLKID(3)手册页中:
该库的高级部分保留有关块的信息 缓存文件中的设备,并且在被验证之前仍然有效 返回给用户(如果用户对原始块具有读取权限 设备,否则 不)。 缓存文件还允许非特权用户(通常是root用户以外的任何人,或者不在“ disk”组中的用户)找到 缓存文件的标准位置可以是 被环境覆盖 ronment变量BLKID_FILE。
因此,以根用户身份运行后,信息将被缓存。之后,当您再次以非root用户身份运行时,将检索该信息。