06 规则匹配¶
特性描述¶
19种匹配规则,支持类shell模式匹配或正则表达式匹配
特性约束¶
规则行中需要包含至少GOTO、PROGRAM、IMPORT类token之一,否则在规则执行过程中会跳过该规则行。
子场景 1¶
ACTION规则匹配功能测试,针对add、change和move事件,每种事件生成对应的软链接。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
ACTION=="add", SYMLINK+="action_add"
ACTION=="change", SYMLINK+="action_change"
ACTION=="move", SYMLINK+="action_move"
启动devmaster
创建回环设备:
# dd if=/dev/zero of=loop.img bs=1M count=100
# loopnum=$(losetup -f)
# losetup $loopnum loop.img
# mkfs.ext4 $loopnum
测试步骤¶
触发回环设备的uevent事件:
# devctl trigger $loopnum --action=add
# devctl trigger $loopnum --action=change
# devctl trigger $loopnum --action=move
结果验证¶
查看/dev目录下是否生成指向$loop0设备的action_*软链接:
# ll /dev/action*
lrwxrwxrwx 1 root root 5 Aug 5 17:29 /dev/action_add -> $loop0
lrwxrwxrwx 1 root root 5 Aug 5 17:29 /dev/action_change -> $loop0
lrwxrwxrwx 1 root root 5 Aug 5 17:29 /dev/action_move -> $loop0
测试结束¶
回收回环设备
删除软链接残留:
清理devmaster残留数据
测试场景约束¶
无
子场景 2¶
DEVPATH规则匹配功能测试,如果设备事件的devpath以$loopnum为后缀,则创建match_devpath软链接。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
创建回环设备:
# dd if=/dev/zero of=loop.img bs=1M count=100
# loopnum=$(losetup -f)
# losetup $loopnum loop.img
# mkfs.ext4 $loopnum
启动devmaster
测试步骤¶
触发$loopnum块设备的uevent事件:
结果验证¶
查看/dev目录下是否生成指向/dev/$loopnum设备的match_devpath软链接:
测试结束¶
删除软链接残留:
清理devmaster残留数据
测试场景约束¶
无
子场景 3¶
KERNEL规则匹配的功能测试,如果设备的内核名等于lo,则创建/tmp/match_kernel临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发sda块设备的uevent事件:
结果验证¶
查看match_kernel是否生成:
测试结束¶
删除临时文件:/tmp/match_kernel
清理devmaster残留数据
测试场景约束¶
无
子场景 4¶
NAME规则匹配和赋值的功能测试,首先给网卡设备命名为test,然后匹配网卡名是否是test,如果是的话创建/tmp/match_name临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发虚拟网卡lo的uevent事件:
结果验证¶
查看/tmp目录下是否生成match_name文件:
测试结束¶
删除临时文件
清理devmaster残留数据
测试场景约束¶
无
子场景 5¶
SUBSYSTEM规则匹配的功能测试。如果设备的子系统是块设备,则创建软链接/dev/match_subsystem指向该设备。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
创建回环块设备/dev/$loopnum
启动devmaster
测试步骤¶
触发回环块设备/dev/$loopnum的uevent事件:
结果验证¶
查看/dev目录下是否生成指向/dev/$loopnum的match_subsystem软链接:
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
NAME规则仅作用于网卡设备事件
子场景 6¶
SYMLINK规则匹配和赋值的功能测试。先给设备添加软链接symlink_1,再检查设备的软链接中是否包含symlink_1,如果包含的话,添加软链接symlink_2。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
创建回环设备/dev/$loopnum
启动devmaster
测试步骤¶
触发块设备/dev/sda的uevent事件:
结果验证¶
查看/dev目录下是否生成指向/dev/$loopnum的symlink_*软链接:
# ll /dev/symlink*
lrwxrwxrwx 1 root root 3 Aug 5 18:14 /dev/symlink_1 -> $loopnum
lrwxrwxrwx 1 root root 3 Aug 5 18:14 /dev/symlink_2 -> $loopnum
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
无
子场景 7¶
DRIVER规则匹配的功能测试。如果设备的driver属性为processor,则创建/tmp/match_driver临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发/sys/devices/system/cpu/cpu0的uevent事件:
结果验证¶
查看临时文件/tmp/match_driver是否创建:
测试结束¶
删除临时文件
清理devmaster残留数据
测试场景约束¶
环境中存在多核cpu,其中包含cpu0
子场景 8¶
ATTR规则匹配的功能测试。判断sda的ro属性是否为0,若为0则创建/dev/match_attr软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_attr软链接是否创建:
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
系统中存在sda1分区块设备,sda1的ro属性为0。
子场景 9¶
ENV规则匹配和赋值的功能测试。首先给设备赋予ID_TEST=test环境变量,然后检查ID_TEST环境变量的值是否是test,如果是则创建/tmp/match_env临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发任意设备的uevent事件,比如/sys/class/net/lo:
结果验证¶
查看临时文件/tmp/match_env是否创建:
测试结束¶
删除临时文件
清理devmaster残留数据
测试场景约束¶
无
子场景 10¶
TAG规则匹配和赋值的功能测试。首先给设备赋予test标签,然后检查设备是否携带test标签,如果是则创建/tmp/match_tag临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发任意设备的uevent事件,比如/sys/class/net/lo:
结果验证¶
查看临时文件/tmp/match_tag是否创建:
查看/run/devmaster/tags目录下是否存在test子目录,且test子目录中包含n1文件(回环网卡设备/sys/class/net/lo的设备id):
测试结束¶
删除临时文件
清理devmaster残留数据
测试场景约束¶
无
子场景 11¶
TEST规则匹配的功能测试。如果存在/tmp/test_file则创建/dev/match_test2软链接;若其权限为0660,则创建/dev/match_test软链接。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
创建权限为0660的文件 /tmp/test_file
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_test软链接是否创建:
# ll /dev/match_test*
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_test -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_test2 -> sda1
测试结束¶
删除临时软链接
清理devmaster残留数据
删除文件
测试场景约束¶
系统中存在sda1分区块设备
子场景 12¶
PROGRAM匹配规则的功能测试。首先执行PROGRAM=="/bin/echo hello world"规则,规则中声明的命令运行成功,PROGRAM规则成功匹配,创建/dev/match_program软链接。然后执行PROGRAM!="/bin/cat none"规则,由于none文件不存在,cat命令返回非零值,PROGRAM!=规则由于使用了不等于操作符,在命令返回非零值时规则判断为真,因此创建/dev/nomatch_program软链接。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
PROGRAM=="/bin/echo hello world", SYMLINK+="match_program"
PROGRAM!="/bin/cat none", SYMLINK+="nomatch_program"
创建回环块设备/dev/$loopnum
启动devmaster
测试步骤¶
触发回环块设备的uevent事件:
结果验证¶
查看软链接是否创建:
# ll /dev/*match_program
lrwxrwxrwx 1 root root 5 Aug 6 00:27 /dev/match_program -> $loopnum
lrwxrwxrwx 1 root root 5 Aug 6 00:27 /dev/nomatch_program -> $loopnum
测试结束¶
删除devmaster数据残留
删除软链接
测试场景约束¶
无
子场景 13¶
RESULT匹配规则的功能测试。首先使用PROGRAM规则执行/bin/echo hello world命令,devmaster捕获hello world标准输出,并用于下一次RESULT规则匹配。RESULT匹配规则中检查最近的PROGRAM规则中执行命令的标准输出内容是否为hello world,如果是,则创建/tmp/match_result临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发任意设备的uevent事件,比如/sys/class/net/lo:
结果验证¶
查看临时文件/tmp/match_result是否创建:
测试结束¶
删除devmaster数据残留
删除临时文件
测试场景约束¶
无
子场景 14¶
IMPORT{program}规则测试。首先使用IMPORT{program}=="/bin/echo hello=world"规则,获取hello=world环境变量并导入到设备中,然后使用ENV{hello}规则检查hello变量的值是否是world,如果是则创建/tmp/match_import_program临时文件。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
IMPORT{program}=="/bin/echo hello=world"
ENV{hello}=="world", PROGRAM=="/bin/touch /tmp/match_import_program"
启动devmaster
测试步骤¶
触发回环虚拟网卡的uevent事件
结果验证¶
/tmp/match_import_program已创建:
数据库中包含hello=world环境变量:
测试结束¶
删除devmaster数据残留
删除临时文件
测试场景约束¶
无
子场景¶
IMPORT{builtin}规则测试。使用IMPORT{builtin}=="path_id"规则,获取PCI总线上注册设备的ID_PATH等环境变量。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发PCI总线上注册设备的uevent事件
结果验证¶
数据库中包含ID_PATH等环境变量:
# cat /run/devmaster/data/+pci\:0000\:00\:00.0
I:1691260364
E:ID_PATH=pci-0000:00:00.0
E:ID_PATH_TAG=pci-0000_00_00_0
测试结束¶
删除devmaster数据残留
测试场景约束¶
环境中包含PCI总线pci0000\:00,且总线上注册了/sys/devices/pci0000\:00/0000\:00\:00.0设备
子场景 16¶
IMPORT{file}规则测试。使用IMPORT{file}规则,从某个文件中获取满足key=value形式的键值文本行,并导入到设备数据库中。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
创建临时文件:/tmp/import_file
启动devmaster
测试步骤¶
触发虚拟回环网卡的uevent事件:
结果验证¶
数据库中包含hello=world环境变量:
测试结束¶
删除devmaster数据残留
删除临时文件
测试场景约束¶
无
子场景 17¶
IMPORT{db}规则测试。使用IMPORT{db}规则,从设备原来的数据库中获取某个环境变量,并导入到新的数据库中,老数据库中剩余的环境变量则被抛弃。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
构造虚拟回环网卡的数据库内容
启动devmaster
测试步骤¶
触发虚拟回环网卡的uevent事件:
结果验证¶
数据库中包含name=jonny环境变量,无hello=world环境变量:
测试结束¶
删除devmaster数据残留
测试场景约束¶
无
子场景 18¶
IMPORT{cmdline}规则测试。使用IMPORT{cmdline}规则,系统的启动参数/proc/cmdline中获取配置项,并导入到数据库的环境变量中。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发虚拟回环网卡的uevent事件:
结果验证¶
数据库中包含root环境变量:
测试结束¶
删除devmaster数据残留
测试场景约束¶
系统启动参数中配置了root选项
子场景 19¶
IMPORT{parent}规则测试。使用IMPORT{parent}规则,从直接父设备的数据库中获取某个环境变量,并导入到自己的数据库中。
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
依此触发块设备sda和sda的分区设备sda1的事件,两次触发动作间保留一定的时隙:
结果验证¶
sda1的数据库中包含ID_PATH环境变量,其值和sda一致:
# cat /run/devmaster/data/b8\:1
I:1691263274
E:ID_PATH=pci-0000:00:10.0
# cat /run/devmaster/data/b8\:0
I:1691263270
E:ID_PATH_TAG=pci-0000_00_10_0
E:ID_PATH=pci-0000:00:10.0
测试结束¶
删除devmaster数据残留
测试场景约束¶
环境中存在块设备sda,且sda拥有分区sda1。
子场景 20¶
KERNELS匹配规则的功能测试。KERNELS规则会匹配设备自身和所有父设备的内核名,如果找到任一满足匹配的父设备,则匹配为真。首先使用KERNELS规则匹配sda1设备自身的内核名sda1,匹配成功后创建/dev/match_kernel1软链接;然后匹配sda1的一级父设备的内核名sda,匹配成功则创建/dev/match_kernel2软链接;最后匹配与sda1二级父设备的内核名2:0:0:0并创建/dev/match_kernel3软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
KERNELS=="sda1", SYMLINK+="match_kernel1"
KERNELS=="sda",SYMLINK+="match_kernel2"
KERNELS=="2:0:0:0",SYMLINK+="match_kernel3"
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_kernel软链接是否创建:
# ll /dev/match_kernel*
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_kernel1 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_kernel2 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_kernel3 -> sda1
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
环境中存在块设备sda,sda拥有分区sda1,sda注册在pci总线的2:0:0:0插槽上。
子场景 21¶
SUBSYSTEMS匹配规则的功能测试。规则文件中写的SUBSYSTEM属性与sda1的subsystem相等,则创建/dev/match_subsystem1软链接;与sda1一级父设备subsystems相等,则创建/dev/match_subsystem2软链接;与sda1二级父设备subsystems相等,则创建/dev/match_subsystem3软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
SUBSYSTEMS=="block", SYMLINK+="match_subsystem1"
SUBSYSTEMS=="block",SYMLINK+="match_subsystem2"
SUBSYSTEMS=="scsi",SYMLINK+="match_subsystem3"
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_subsystem软链接是否创建:
# ll /dev/match_subsystem*
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_subsystem1 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 15:13 /dev/match_subsystem2 -> sda1
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
环境中存在块设备sda,sda拥有分区sda1。
子场景 22¶
DRIVERS匹配规则的功能测试。DRIVERS规则会递归匹配所有父设备的driver属性,匹配成功后创建/dev/match_driver1和/dev/match_driver2软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_driver软链接是否创建:
# ll /dev/match_driver*
lrwxrwxrwx. 1 root root 4 8月 10 14:59 /dev/match_driver1 -> sda2
lrwxrwxrwx. 1 root root 4 8月 10 14:59 /dev/match_driver2 -> sda2
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
环境中存在块设备sda,sda拥有分区sda1。sda1自身或者父设备的driver属性为sd或者mptspi。
子场景 23¶
ATTRS匹配的功能测试。规则文件中ATTRS{ro}与sda1的ro属性相等时,创建/dev/match_attrs1软链接;ATTR{queue/iostats}与sda1一级父设备的queue/iostats相等时,创建/dev/match_attrs2软链接;ATTR{scsi_level}与sda1二级父设备的scsi_level相等时,创建/dev/match_attrs3软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
ATTRS{ro}=="0", SYMLINK+="match_attrs1"
ATTRS{queue/iostats}=="1", SYMLINK+="match_attrs1"
ATTRS{scsi_level}=="3", SYMLINK+="match_attrs1"
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_attrs软链接是否创建:
# ll /dev/match_attrs*
lrwxrwxrwx. 1 root root 4 8月 10 16:02 /dev/match_attrs1 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 16:02 /dev/match_attrs2 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 16:02 /dev/match_attrs3 -> sda1
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
环境中存在块设备sda,sda拥有分区sda1。sda1自身或者父设备存在ro为0的属性、queue/iostats为1的属性和scsi_level为3的属性。
子场景 24¶
TAGS匹配的功能测试。分别为sda1、其一级父设备、二级父设备设置标签,使用TAGS匹配这些标签,若标签存在,则创建对应的/dev/match_tags*软链接
备注¶
无
准备工作¶
创建配置文件:/etc/devmaster/config.toml
创建规则文件:/tmp/1/rules.d/00-test.rules
KERNELS="sda1", TAG+="d0"
KERNELS="sda", TAG+="d1"
KERNELS="2:0:0:0", TAG+="d2"
TAGS=="d0",SYMLINK+="match_tags0"
TAGS=="d1",SYMLINK+="match_tags1"
TAGS=="d2",SYMLINK+="match_tags2"
启动devmaster
测试步骤¶
触发块设备/dev/sda1的uevent事件:
结果验证¶
查看match_tags软链接是否创建:
# ll /dev/match_tags*
lrwxrwxrwx. 1 root root 4 8月 10 17:25 /dev/match_tags0 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 17:25 /dev/match_tags1 -> sda1
lrwxrwxrwx. 1 root root 4 8月 10 17:25 /dev/match_tags2 -> sda1
测试结束¶
删除临时软链接
清理devmaster残留数据
测试场景约束¶
环境中存在块设备sda,sda拥有分区sda1,sda注册在pci总线的2:0:0:0插槽上。
Created: August 23, 2023