如何在 Linux 中以编程方式获取磁盘名称(如“/dev/sda”或“/dev/sdb”)?
How to get disk name programmatically in Linux(Like "/dev/sda" or "/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;
}
有几种方法可以解释您的问题。
也许您想解析 findmnt -Ar
命令的输出。它以安全的可解析格式提供系统上所有当前安装的文件系统。
但是如果您正在寻找磁盘设备,那就有点棘手了。 Linux 系统上有很多东西可能是磁盘设备,但目前并没有真正用作磁盘。
您可能希望像 mch 推荐的那样在 /dev
目录中找到所有 /dev/sd*
设备,但这不会涵盖所有可能的设备。例如,我的 Linode 已将 root 挂载在 /dev/xvda
上。
我在 findmnt
命令上 运行 一个 strace
,发现它只看 /proc/filesystems
(我想只是为了学习一些神奇的数字), /usr/lib/locale/locale-archive
(可能是一些输出格式信息,我不知道)然后是 /proc/self/mountinfo
(带有实际信息以读取当前安装的文件系统)。如果你想直接从内核中学习信息,那就是这样做的方式。
我使用的一种方法是从 lshw
中解析信息:
lshw -class disk |grep "logical name"
另一种方法是检查 ls /sys/block/sd*
您可以通过使用 libudev API 注册到 "block" 子系统并解析块设备列表并获取与块设备对应的路径来实现。以下是片段
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);
我正在尝试查找与磁盘和分区相关的信息。 以下是我的代码。但问题是,我通过命令行从“/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;
}
有几种方法可以解释您的问题。
也许您想解析 findmnt -Ar
命令的输出。它以安全的可解析格式提供系统上所有当前安装的文件系统。
但是如果您正在寻找磁盘设备,那就有点棘手了。 Linux 系统上有很多东西可能是磁盘设备,但目前并没有真正用作磁盘。
您可能希望像 mch 推荐的那样在 /dev
目录中找到所有 /dev/sd*
设备,但这不会涵盖所有可能的设备。例如,我的 Linode 已将 root 挂载在 /dev/xvda
上。
我在 findmnt
命令上 运行 一个 strace
,发现它只看 /proc/filesystems
(我想只是为了学习一些神奇的数字), /usr/lib/locale/locale-archive
(可能是一些输出格式信息,我不知道)然后是 /proc/self/mountinfo
(带有实际信息以读取当前安装的文件系统)。如果你想直接从内核中学习信息,那就是这样做的方式。
我使用的一种方法是从 lshw
中解析信息:
lshw -class disk |grep "logical name"
另一种方法是检查 ls /sys/block/sd*
您可以通过使用 libudev API 注册到 "block" 子系统并解析块设备列表并获取与块设备对应的路径来实现。以下是片段
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);