linux - 在内核模块中获取根设备

标签 linux kernel-module

我为此做了一些网络搜索,但只能找到有关获取与设备节点关联的内核模块的结果。无论如何我可以获得当前系统的根设备的主要和次要编号,如果适用,根设备的父设备(例如,/dev/sda 的“父”/dev/sda2)?内核是否导出了一些函数来获取它,还是我需要间接获取它?

最佳答案

没有与设备节点关联的模块。可能你知道根目录是进程本地的东西(进程结构存储根目录的 inode 引用 --- 这可以通过特权 chroot(2) 系统调用更改)和当前工作目录(解决对于不以 / 开头的路径)

如果您想知道负责根目录的设备,您有两个选择:

  • 您的流程尚未成为 chroot(2)系统调用,所以你opendir("/")然后做 fstat(2)在它上面(或者你可以在 stat(2) 目录上执行 "/" 系统调用)。这将使根目录所在的设备成为 st_devstruct stat 的领域返回。它的格式为 dev_t数,其中一些位表示主数,一些表示次数。您可以使用 MKDEV(ma,mi)MAJOR(dev)MINOR(dev) <linux/kdev_t.h> 中定义的宏访问主要和次要号码。要获取物理磁盘,只需使用 0xf0 屏蔽次要编号即可你会得到整个磁盘的次要编号。

  • 您的流程已生成 chroot(2) syscall,所以你不能访问系统中真正的根目录。如果您有权访问 /proc文件系统,那么你可能可以调用 mount(1)命令获取挂载表。您可以在该表中搜索 /输入,然后得到 /dev/sd<disk>入口。拿到设备后,获取父设备就很容易了。您可以像上一点一样屏蔽该数字以获得物理磁盘的次要编号。

您还可以访问 /proc/diskstats文件,显示每个 block 设备的统计信息。您将在每行的前三个字段中获得主要名称、次要名称和设备名称。

注意

有一些磁盘配置不允许分区,如 RAID 设备或卷管理器磁盘。在这些情况下,访问物理磁盘(或多个磁盘,因为可能不止一个)更加困难。

关于linux - 在内核模块中获取根设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319322/

相关文章:

linux - 无法获得对 dbus-send 的任何回复

linux - 我如何允许*任何*用户从 `/sys/kernel/debug/...` 读取文件?

kernel-module - 内核之间的 Linux 内核模块 (*.ko) 兼容性

c - 从 Linux 内核模块写入 debugfs

用于重复行检索的 Linux 命令或/和脚本

linux - 我可以逐行读取hadoop文件吗

Android列表进程

linux - tar 存档包含的文件少于 find 命令的结果

c - 将更改恢复到内核模块中的文件

c - 系统调用未定义!编译内核模块