libblkid работает только с root и после запуска от имени root - PullRequest
2 голосов
/ 04 июня 2019

Это самая странная вещь, которую я когда-либо видел (на самом деле, у нее есть хорошее объяснение).

Я создал код 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 Ответ

1 голос
/ 04 июня 2019

Из справочной страницы BLKID (8):

Библиотека libblkid используется для идентификации блочных устройств (дисков) в отношении их содержимого (например, типа файловой системы), а также для извлечения дополнительной информации, такой как метки файловой системы / имена томов, уникальные идентификаторы / серийные номера. Берс. Обычно используется для разрешения использования тегов LABEL = и UUID = вместо жесткого кодирования определенных имен блочных устройств в файлах конфигурации.

...

Обратите внимание, что blkid читает информацию непосредственно с устройств, а для пользователей без полномочий root возвращает кэшированную непроверенную информацию.

Из справочной страницы LIBBLKID (3):

В высокоуровневой части библиотеки хранится информация о блоке. устройства в файле кэша и проверяется, чтобы быть действительным, прежде чем возвращается пользователю (если у пользователя есть разрешение на чтение в необработанном блоке устройство, в противном случае не). Файл кэша также позволяет находить непривилегированных пользователей (как правило, любого, кроме root, или тех, кто не входит в группу «disk»). устройства по метке / идентификатору. Стандартное расположение файла кэша может быть переопределены окружающей средой переменная переменной BLKID_FILE.

Так что после того, как вы запустите его как root, информация будет кэширована. После этого эта информация извлекается при повторном запуске без полномочий root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...