Использование libblkid для поиска UUID раздела

Я просматривал libblkid и был сбит с толку документация. Может ли кто-нибудь предоставить мне пример того, как я могу найти UUID корневого раздела Linux с помощью этой библиотеки?


person HighLife    schedule 19.07.2011    source источник


Ответы (2)


Это так же просто, как показано в руководстве: вы создаете структуру зонда, инициализируете ее, запрашиваете некоторую информацию, а затем освобождаете ее. А можно объединить первые два шага в один. Это рабочая программа:

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <blkid/blkid.h>

int main (int argc, char *argv[]) {
  blkid_probe pr;
  const char *uuid;

  if (argc != 2) {
    fprintf(stderr, "Usage: %s devname\n", argv[0]);
    exit(1);
  }

  pr = blkid_new_probe_from_filename(argv[1]);
  if (!pr) {
    err(2, "Failed to open %s", argv[1]);
  }

  blkid_do_probe(pr);
  blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);

  printf("UUID=%s\n", uuid);

  blkid_free_probe(pr);

  return 0;
}

blkid_probe_lookup_value задает uuid для указания на строку, принадлежащую структуре pr, поэтому аргумент имеет тип const char *. Если вам нужно, вы можете скопировать его на char *, которым вы управляете самостоятельно, но для простого перехода на printf в этом нет необходимости. Четвертый аргумент blkid_probe_lookup_value позволяет вам получить длину возвращаемого значения, если вам это тоже нужно. Есть некоторые тонкие различия между blkid_do_probe, blkid_do_safeprobe и blkid_do_fullprobe, но в случаях, когда устройство имеет известную файловую систему, и вы просто хотите извлечь из нее UUID, следует взять первый результат из blkid_do_probe.

person hobbs    schedule 25.07.2011
comment
Этот пример требует, чтобы я ввел раздел в качестве аргумента правильно? Как мне проверить UUID раздела ROOT? - person HighLife; 25.07.2011
comment
Определите КОРНЕВОЙ раздел. Устройство установлено на / ? - person hobbs; 26.07.2011
comment
Я включил ‹blkid/blkid.h› и установил необходимые пакеты для использования libblkid, но все еще получаю сообщения об ошибках, например, blkid_somefuction не был объявлен в этой области. Я что-то забыл? - person HighLife; 26.07.2011
comment
используйте /dev/root в качестве раздела - person Vinicius Kamakura; 31.07.2011
comment
Есть ли API для программного определения имени диска и раздела?? например откуда взять /dev/sda1 - person Ravi Bhushan; 04.08.2015
comment
Ps: blkid_new_probe_from_filename требует привилегированного доступа (например, root) на случай, если кэш libblkid не существует. - person Sdra; 09.02.2021

Сначала вам нужно найти устройство, смонтированное как root. См. man getmntent (3). Как только вы узнаете устройство, используйте blkid_new_probe_from_filename, как описано hobbs.

#include <stdio.h>
#include <mntent.h>

int main() {
    FILE* fstab = setmntent("/etc/mtab", "r");
    struct mntent *e;
    const char *devname = NULL;
    while ((e = getmntent(fstab))) {
        if (strcmp("/", e->mnt_dir) == 0) {
            devname = e->mnt_fsname;
            break;
        }
    }
    printf("root devname is %s\n", devname);
    endmntent(fstab);
    return 0;
}
person Michał Šrajer    schedule 25.07.2011
comment
Это очень полезно, я объединяю это с постом о хобби, и я посмотрю, что произойдет. Спасибо - person HighLife; 26.07.2011