2015-08-04 1 views
3

Я пытаюсь найти информацию о диске и разделах. Ниже приведен мой код. Но проблема в том, что я передаю имя диска через командную строку, запрашивая имя диска из «/ proc/partition». Есть ли api, который может дать мне имя диска.Как получить имя диска программно в Linux (например, «/ dev/sda» или «/ dev/sdb»)?

#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; 

} 
+0

Запросить одно и то же имя диска в программе. Откройте/proc/разделы и прочитайте все, что вам нужно –

+1

вы можете использовать 'glob' с' '/ dev/sd?" ', Чтобы найти все диски. – mch

ответ

1

Один из способов, я использовал, чтобы разобрать информацию из lshw:

lshw -class disk |grep "logical name"

другой способ, чтобы проверить ls /sys/block/sd*

0

Есть несколько способов интерпретировать ваш вопрос.

Возможно, вы хотите проанализировать вывод команды findmnt -Ar. Это обеспечивает все текущие смонтированные файловые системы в системе в безопасном формате синтаксического анализа.

Но если вы ищете дисковые устройства, это немного сложнее. В системе Linux есть много вещей, которые потенциально могут быть дисковыми устройствами, но на самом деле они не используются в настоящее время как диски.

Возможно, вы захотите найти все устройства /dev/sd* в каталоге /dev, например mch, но это не распространяется на все возможные устройства. Например, у моего Linode есть корень, установленный на /dev/xvda.

Я побежал strace по команде findmnt, и обнаружил, что смотрит на /proc/filesystems (я думаю, просто чтобы узнать некоторые магические числа), /usr/lib/locale/locale-archive (может быть, для какой-то выход форматирования информации, я не знаю), а затем /proc/self/mountinfo (с фактической информацией для чтения о смонтированных в настоящее время файловых системах). Если вы хотите узнать информацию прямо из ядра, это способ сделать это.

0

Вы можете сделать это с помощью libudev API, чтобы зарегистрироваться подсистема «блок» и проанализировать список блоков устройств и получить путь, соответствующий блочному устройству. Ниже приведен фрагмент

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);