NoneLibblkid работает только с root и после запуска от имени root
Это самая странная вещь, которую я когда-либо видел (на самом деле, у нее есть хорошее объяснение).
Я создал 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
Кто-нибудь знает, что происходит?
1 ответ
Со страницы руководства BLKID(8):
Библиотека libblkid используется для идентификации блочных устройств (дисков) в отношении их содержимого (например, типа файловой системы), а также для извлечения дополнительной информации, такой как метки файловой системы / имена томов, уникальные идентификаторы / серийные номера. Обычно используется для разрешения использования тегов LABEL= и UUID= вместо жесткого кодирования определенных имен блочных устройств в файлах конфигурации.
...
Обратите внимание, что blkid читает информацию непосредственно с устройств, а для пользователей без полномочий root возвращает кешированную непроверенную информацию.
Со страницы руководства LIBBLKID(3):
В высокоуровневой части библиотеки хранится информация о блочных устройствах в файле кэша, и проверяется, что она все еще действительна, прежде чем будет возвращена пользователю (если пользователь имеет разрешение на чтение на необработанном блочном устройстве, в противном случае - нет). Кэш-файл также позволяет непривилегированным пользователям (обычно всем, кроме root или пользователям, не входящим в группу "disk") определять устройства по метке / идентификатору. Стандартное расположение файла кэша может быть переопределено переменной среды BLKID_FILE.
Так что после того, как вы запустите его как root, информация будет кэширована. После этого эта информация извлекается при повторном запуске с правами root.