Как программно получить имя диска в 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 (с актуальной информацией для чтения о текущих смонтированных файловых системах). Если вы хотите узнать информацию прямо из ядра, это способ сделать это.

Другие вопросы по тегам