4

I am trying out to find information related to Disk and partitions. Following are my code. But problem is that, I am passing disk name through command line by querying disk name from "/proc/partitions". Is there any api which can give me disk name as well.

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

}
4

3 回答 3

1

我使用的一种方法是解析信息lshw

lshw -class disk |grep "logical name"

另一种方法是检查ls /sys/block/sd*

于 2015-08-11T17:23:33.703 回答
1

您可以通过使用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);
于 2016-02-11T14:10:45.510 回答
0

有几种方法可以解释您的问题。

也许您想解析findmnt -Ar命令的输出。这以安全的可解析格式提供了系统上所有当前安装的文件系统。

但是,如果您正在寻找磁盘设备,那就有点棘手了。Linux 系统上有很多东西可能是磁盘设备,但目前实际上并未用作磁盘。

您可能希望在 mch 推荐/dev/sd*的目录中找到所有设备/dev,但这不会涵盖所有可能的设备。例如,我的 Linode 已将 root 安装在/dev/xvda.

我在strace命令上运行了一个findmnt,发现它只是看着/proc/filesystems(我想只是为了学习一些神奇的数字),/usr/lib/locale/locale-archive(也许是一些输出格式信息,我不知道)然后/proc/self/mountinfo(用实际信息来阅读当前挂载的文件系统)。如果您想直接从内核中学习信息,那就是这样做的方法。

于 2015-08-11T02:27:32.830 回答