Я просматривал libblkid и был сбит с толку документация. Может ли кто-нибудь предоставить мне пример того, как я могу найти UUID корневого раздела Linux с помощью этой библиотеки?
Использование libblkid для поиска UUID раздела
Ответы (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; 26.07.2011
/dev/root
в качестве раздела
- person Vinicius Kamakura; 31.07.2011
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;
}