编写udev规则
2019-04-26 11:15
274 查看
devfs设备文件管理方法
- linux早期采用的静态管理方法
- /dev目录下有大量静态文件
- 内核版本2.6.13开始被完全取代
- 只有连到系统上来的设备才在/dev 下创建设备文件
- 与主、次设备编号无关
- 为设备提供持久、一致的名字
- 内核发现设备并导入设备状态到sysfs
- udev接到事件通知
- udev创建设备节点或是运行指定程序
- udev通知hald守护进程
- HAL探测设备信息
- HAL创建设备对象结构
- HAL通过系统消息总线广播该事件
- 用户程序也可以监控该事件
- 从内核收到添加/移除硬件事件时,udev将会分析:
- /sys目录下信息
- /etc/udev/rules.d目录中的规则
- 基于分析结果,udev会:
- 处理设备命名
- 决定要创建哪些设备文件或链接
- 决定如何设置属性
- 决定触发哪些事件
编写udev规则,实现以下目标:
当插入一个U盘时,该U盘自动出现一个链接称为udisk
U盘上的第1个分区名称为udisk1,以此类推
终端上出现提示信息”udisk plugged in”
方案
问题:加载一个USB设备后,系统可能识别为sda也可能识别为sdb,能不能固定呢?
对于Linux kernel 2.6及更新的操作系统版本会将设备的相关信息动态写入/sys文件系统中,而udev程序可以通过读取这些设备系信息,并根据自己的udev规则进行设备管理器,实现如下功能:
- 处理设备命名
- 决定要创建哪些设备文件或链接
- 决定如何设置属性
- 决定触发哪些事件
udev默认规则存放在/etc/udev/rules.d目录下,通过修改此目录下的规则实现设备的命名、属性、链接文件等。
步骤
一:编写udev规则
- 准备USB设备(如果使用真实机演示,下面为虚拟机添加USB设备可以忽略)
使用virt-manager为虚拟机添加USB设备
(1)查看设备属性
加载USB设备的同时实时查看设备的相关属性,可以使用monitor指令。
[root@proxy ~]# udevadm monitor --property 如果设备已经加载则无法使用monitor查看相关属性。可以使用下面的命令查看设备属性。 [root@proxy ~]# udevadm info --query=path --name=/dev/sda [root@proxy ~]# udevadm info --query=property --path=/block/sda 单独查看某个磁盘分区的属性信息。 [root@proxy ~]# udevadm info --query=property --path=/block/sdada1
(2)编写udev规则文件(实现插拔USB设备时有屏幕提示信息)
注意:修改规则文件不能照抄,这里的变量都是需要根据实际情况而修改的!!!
每个设备的属性都有所不同!!!一定要根据前面查询的info信息填写。
[root@proxy ~]# vim /etc/udev/rules.d/70-usb.rules SUBSYSTEMS=="usb",ENV{ID_VENDOR}=="TOSHIBA",ENV{serial}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/wall udisk plugged in" 在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功。 排错方法:通过查看/var/log/messages日志文件排错。
(3)继续修改规则文件(实现给分区命名)
[root@proxy ~]# udevadm info --query=property --path=/block/sdb/sdb1 [root@proxy ~]# /etc/udev/rules.d/70-usb.rules ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{DEVTYPE}=="partition",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",SYMLINK="usb%n" 在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功。
(4)继续修改规则文件(修改设备所有者和权限)
[root@proxy ~]# /etc/udev/rules.d/70-usb.rules ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{DEVTYPE}=="partition",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",SYMLINK="usb%n",OWNER="root",GROUP="root",MODE="0644" 在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功。
(5)继续修改规则文件(插拔U盘等于启停服务)
注意:启动服务的程序systemctl,必须使用绝对路径。
[root@proxy ~]# /etc/udev/rules.d/70-usb.rules ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/systemctl start httpd" ACTION=="remove",ENV{ID_VENDOR}=="TOSHIBA",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/systemctl stop httpd"
在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功。
总结知识点:udev规则文件,常见指令操作符如表所示。
udev常用替代变量:
%k:内核所识别出来的设备名,如sdb1
%n:设备的内核编号,如sda3中的3
%p:设备路径,如/sys/block/sdb/sdb1
相关文章推荐
- 【原创】如何编写udev规则实现特定usb口设备创建指定的设备文件名?
- 在 Linux 中如何编写基本的 udev 规则
- 编写UDEV规则(howto)
- udev 规则编写
- udev规则以及编写
- 在 Linux 中如何编写基本的 udev 规则 | Linux 中国
- flash语法编写规则的技巧经验详解
- 跟我一起写udev规则(译)
- 静态扫描之Yara第四话--编写yara规则(3)
- UDEV规则参数详细解释使用
- C头文件编写基本规则
- kingcms自定义模块验证编写规则
- android jni代码编写规则--整理总结
- 编写跨平台Java程序的十二条规则
- C语言头文件编写的几个基本规则
- snort 规则编写
- 编写Java程序的三十个基本规则
- udev解析及规则配置文件
- Linux udev规则编写
- Suricata规则编写——常用关键字