我为此做了一些网络搜索,但只能找到有关获取与设备节点关联的内核模块的结果。无论如何我可以获得当前系统的根设备的主要和次要编号,如果适用,根设备的父设备(例如,/dev/sda
是 的“父”/dev/sda2
)?内核是否导出了一些函数来获取它,还是我需要间接获取它?
最佳答案
没有与设备节点关联的模块。可能你知道根目录是进程本地的东西(进程结构存储根目录的 inode 引用 --- 这可以通过特权 chroot(2)
系统调用更改)和当前工作目录(解决对于不以 /
开头的路径)
如果您想知道负责根目录的设备,您有两个选择:
您的流程尚未成为
chroot(2)
系统调用,所以你opendir("/")
然后做fstat(2)
在它上面(或者你可以在stat(2)
目录上执行"/"
系统调用)。这将使根目录所在的设备成为st_dev
。struct 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/