我是靠谱客的博主 专注荷花,最近开发中收集的这篇文章主要介绍udev规则编写1、 插拔操作时,用户态获取pciehp相关事件接口函数2、nvme盘符生成规则udev_root where in the filesystem to place the device nodesudev_rules The name and location of the udev rules fileudev_log set to “yes” if you want logging, else “no”3、nvme list替代方法4、盘符和slot对应关系5、轮循获取ss,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

udev 规则编写

  • 1、 插拔操作时,用户态获取pciehp相关事件接口函数
    • 热插拔响应:
  • 2、nvme盘符生成规则
    • 寻找磁盘nvme0设备信息
    • 实验步骤
  • udev_root where in the filesystem to place the device nodes
  • udev_rules The name and location of the udev rules file
  • udev_log set to "yes" if you want logging, else "no"
    • 常用udev键
  • 3、nvme list替代方法
  • 4、盘符和slot对应关系
  • 5、轮循获取ssd插拔情况(即时插拔)#
  • 6、Slot号和ssd磁盘SN号对应关系
  • 7、udev规则实例
    • 文档链接

1、 插拔操作时,用户态获取pciehp相关事件接口函数

94插拔盘实验,盘符nvme1拔盘后,在插入盘符变成nvme20(使用power on , power off 对磁盘激活)
盘符nvme0拔盘后,在插入盘符变成nvme21(使用power on , power off 对磁盘激活)
注意:盘符nvme1对应的磁盘没有进行异步IO读写,盘符nvme0对应的磁盘有异步IO读写操作。

Pciehp模块相关文件:drivers/pci/hotplug/ pciehp.h、pciehp_core.c、pciehp_ctrl.c、pciehp_hpc.c、pciehp_pci.c

Pciehp相关接口函数:
int __init pcie_hp_init(void)
static int pciehp_probe(struct pcie_device *dev)
static void pciehp_remove(struct pcie_device *dev)

pciehp在内核态响应热插拔时间,通过uevent将时间发送到用户空间,udev在用户态接受事件信息,可以通过udevadm monitor监控uevent信息

热插拔响应:

nvme盘的热插拔软件层面主要依赖pciehp这个模块支持,这个模块是内嵌在操作系统中的,不是以 .ko 形式加载在内核中。网上关于pciehp这个子系统文档资料很少,源码中能看到一些起作用的接口函数。 也就是热插拔由pciehp这个模块支持,包括槽位slot初始化和盘符初始化,插拔响应。然后通过uevent将事件发送到用户空间。udev在用户空间接收事件,根据规则做相应操作,比如创建移除相关节点。

2、nvme盘符生成规则

/* 实例的id,第一个加入的nvme dev,它的instance为0,第二个加入的nvme,instance为1,也用于做/dev/nvme%d的显示,%d实际就是instance的数值 */

Nvme_ctrl

Uevent是一种在内核空间和用户空间之间通信的机制,主要用于热插拔事件(hotplug)

nvme驱动加载好后,如果有新的nvme设备加入,那么会通过nvme_probe来初始化这个nvme设备,下面是nvme_probe这个函数。

Ll /dev/disk/by-id/ 盘符软连接 目录 /dev/下面

udevadm monitor 监控内核的uevents

udevadm monitor的监控,能够看到sysfs给用户空间发过来的uevent消息:监控

/lib/udev/rules.d/60-persistent-storage.rules   nvme设备命名规则

寻找磁盘nvme0设备信息

udevadm info -q path -n /dev/nvme0
udevadm info -a -p /devices/pci0000:00/0000:00:1c.0/0000:01:00.0/nvme/nvme0
=>udevadm info -a -p $(udevadm info -q path -n /dev/nvme0)

实验步骤

https://images2015.cnblogs.com/blog/1045927/201703/1045927-20170303164629673-1549048336.png

  1. /etc/udev/udev.conf

udev_root where in the filesystem to place the device nodes

udev_root="/dev/"

udev_rules The name and location of the udev rules file

udev_rules="/etc/udev/rules.d/"

udev_log set to “yes” if you want logging, else “no”

udev_log=“no”

 硬件数据库文件(hwdb)位于 操作系统发行商维护的 /usr/lib/udev/hwdb.bin 目录中, 以及二进制文件的 /etc/udev/hwdb.d 目录中   udevadm hwdb --update 更新文件数据库    

/etc/udev/rules.d 比 /lib/udev/rules.d 优先。

  1. nvme list查看盘符信息,udevadm info -a -p $(udevadm info -q path -n /dev/nvme1)查看需要操作的盘的相关信息,主要是kernel、SUBSYSTEM、ATTR{address}、
  2. 编写 udevadm 规则文件:匹配键和赋值键。

常用udev键

  • ACTION: 一个时间活动的名字,比如add,当设备增加的时候
  • KERNEL: 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
  • DEVPATH : 内核设备录进,比如/devices/*
  • SUBSYSTEM: 子系统名字,比如sound,net
  • BUS: 总线的名字,比如IDE,USB
  • DRIVER: 设备驱动的名字,比如ide-cdrom
  • ID: 独立于内核名字的设备名字
  • SYSFS{ value}: sysfs属性值,他可以表示任意
  • ENV{ key}: 环境变量,可以表示任意
  • PROGRAM: 可执行的外部程序,如果程序返回0值,该键则认为为真(true)
  • RESULT: 上一个PROGRAM调用返回的标准输出。
  • NAME: 根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。 如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
  • SYMLINK: 根据规则创建的字符连接名
  • OWNER: 设备文件的属组
  • GROUP: 设备文件所在的组。
  • MODE: 设备文件的权限,采用8进制
  • RUN: 为设备而执行的程序列表
  • LABEL: 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
  • GOTO: 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
  • IMPORT{ type}: 导入一个文件或者一个程序执行后而生成的规则集到当前文件
  • WAIT_FOR_SYSFS: 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。
  • PTIONS: 特定的选项: last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求。all_partitions 为所有的磁盘分区创建设备文件。

赋值键:NAME,SYMLINK,OWNER,GROUP,MODE,ENV{key}

3、nvme list替代方法

udevadm monitor

4、盘符和slot对应关系

在年前的disk-mgr0130有介绍

5、轮循获取ssd插拔情况(即时插拔)#

可以通过udevadm monitor实时监控uevent发送到用户空间的插拔事件记录

6、Slot号和ssd磁盘SN号对应关系

disk-mgr0130

7、udev规则实例

在这里插入图片描述

文档链接

https://www.cnblogs.com/fah936861121/p/6496608.html

参考链接:udev规则编写

最后

以上就是专注荷花为你收集整理的udev规则编写1、 插拔操作时,用户态获取pciehp相关事件接口函数2、nvme盘符生成规则udev_root where in the filesystem to place the device nodesudev_rules The name and location of the udev rules fileudev_log set to “yes” if you want logging, else “no”3、nvme list替代方法4、盘符和slot对应关系5、轮循获取ss的全部内容,希望文章能够帮你解决udev规则编写1、 插拔操作时,用户态获取pciehp相关事件接口函数2、nvme盘符生成规则udev_root where in the filesystem to place the device nodesudev_rules The name and location of the udev rules fileudev_log set to “yes” if you want logging, else “no”3、nvme list替代方法4、盘符和slot对应关系5、轮循获取ss所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部