概述
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
- /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 优先。
nvme lis
t查看盘符信息,udevadm info -a -p $(udevadm info -q path -n /dev/nvme1)
查看需要操作的盘的相关信息,主要是kernel、SUBSYSTEM、ATTR{address}、- 编写 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复