【问题标题】:Getting the root device in a kernel module在内核模块中获取根设备
【发布时间】:2016-09-05 04:00:53
【问题描述】:

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

【问题讨论】:

    标签: linux kernel-module


    【解决方案1】:

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

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

    • 您的进程尚未进行chroot(2) 系统调用,因此您先opendir("/") 然后对其执行fstat(2)(或者您可以在"/" 目录上执行stat(2) 系统调用)。这将在struct statst_dev 字段返回时给出根目录所在的设备。它被格式化为dev_t 数字,其中一些位代表主要数字和一些次要数字。您可以使用<linux/kdev_t.h> 中定义的MKDEV(ma,mi)MAJOR(dev)MINOR(dev) 宏来访问主要和次要号码。要获取物理磁盘,只需用0xf0 屏蔽次要编号,您将获得整个磁盘的次要编号。

    • 您的进程进行了chroot(2) 系统调用,因此您无法访问系统中的真正根目录。如果您有权访问/proc 文件系统,那么您可能可以调用mount(1) 命令来获取挂载表。您可以在该表中搜索 / 条目,然后获取 /dev/sd<disk> 条目。获得设备后,获取父设备很容易。您可以像上一点一样屏蔽该数字,以获取物理磁盘的次要编号。

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

    注意

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

    【讨论】:

    • 这不能回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多