Как программно получить имя диска в Linux(например, "/dev/sda" или "/dev/sdb")?
Я пытаюсь найти информацию, связанную с диском и разделами. Ниже приведен мой код. Но проблема в том, что я передаю имя диска через командную строку, запрашивая имя диска из "/proc/partitions". Есть ли API, который может дать мне имя диска.
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <blkid/blkid.h>
int main (int argc, char *argv[])
{
blkid_probe pr;
blkid_partlist ls;
int nparts, i;
pr = blkid_new_probe_from_filename(argv[1]);
if (!pr)
err(2, "faild to open device %s", argv[1]);
ls = blkid_probe_get_partitions(pr);
nparts = blkid_partlist_numof_partitions(ls);
for (i = 0; i < nparts; i++)
{
blkid_partition par = blkid_partlist_get_partition(ls, i);
printf("PartNo = %d\npart_start = %llu\npart_size = %llu\npart_type = 0x%x\n",
blkid_partition_get_partno(par),
blkid_partition_get_start(par),
blkid_partition_get_size(par),
blkid_partition_get_type(par));
}
blkid_free_probe(pr);
return 0;
}
3 ответа
Один из способов, которые я использовал, - это анализ информации из lshw
:
lshw -class disk |grep "logical name"
Другой способ проверить ls /sys/block/sd*
Вы можете сделать это с помощью API libudev для регистрации в подсистеме "блок", анализа списка блочных устройств и получения пути, соответствующего блочному устройству. Ниже приведен фрагмент
struct udev_list_entry *devices;
struct udev_enumerate *enumerate;
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "block");
udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, devices) {
char *path;
path = udev_device_get_devnode(dev));
}
udev_enumerate_unref(enumerate);
Есть несколько способов интерпретировать ваш вопрос.
Может быть, вы хотите проанализировать вывод findmnt -Ar
команда. Это обеспечивает все смонтированные в настоящее время файловые системы в системе в безопасном разбираемом формате.
Но если вы ищете дисковые устройства, это немного сложнее. В системе Linux есть много вещей, которые потенциально могут быть дисковыми устройствами, но на самом деле не используются в качестве дисков в данный момент.
Вы можете найти все /dev/sd*
устройства в /dev
Каталог, подобный mch, рекомендуется, но он не охватывает все возможные устройства. Например, мой Linode имеет root на /dev/xvda
,
Я побежал strace
на findmnt
команда, и нашел это просто смотрит на /proc/filesystems
(Я думаю, чтобы просто узнать некоторые магические числа), /usr/lib/locale/locale-archive
(может быть, для некоторой информации о форматировании вывода, я не знаю), а затем /proc/self/mountinfo
(с актуальной информацией для чтения о текущих смонтированных файловых системах). Если вы хотите узнать информацию прямо из ядра, это способ сделать это.