跳转至

07 规则赋值

特性描述

测试11种赋值规则的功能

特性约束

子场景 1

NAME规则赋值的功能测试

备注

同场景 6.4

准备工作

不涉及

测试步骤

不涉及

结果验证

不涉及

测试结束

不涉及

测试场景约束

不涉及

子场景 2

SYMLINK规则赋值的功能测试

备注

同场景 6.6

准备工作

不涉及

测试步骤

不涉及

结果验证

不涉及

测试结束

不涉及

测试场景约束

不涉及

子场景 3

ENV规则赋值的功能测试

备注

同场景 6.9

准备工作

不涉及

测试步骤

不涉及

结果验证

不涉及

测试结束

不涉及

测试场景约束

不涉及

子场景 4

TAG规则所有标签和当前标签机制测试。首先给设备赋予current和all标签,然后删除all标签,/run/devmaster/tags目录下包含所有标签,因此期望存在current和all子目录,且子目录中包含该设备的id,查看/run/devmaster/data目录下的设备数据库,其中所有标签G包含all和current,当前标签Q仅包含current。

备注

所有标签会记录设备所有新增的标签,如果某个标签在某条规则中删除,所有标签中仍然会保有已删除标签的记录。当前标签则剔除已被删除的标签。

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建规则文件:/tmp/1/rules.d/00-test.rules

TAG+="currenat"
TAG+="all"
TAG-="all"

启动devmaster

# devmaster &> log.txt &

测试步骤

触发任意设备的uevent事件,比如/sys/class/net/lo:

# devctl trigger /sys/class/net/lo

结果验证

查看/run/devmaster/tags下是否生成标签目录all和current,且标签目录中包含n1:

# tree /run/devmaster/tags/
/run/devmaster/tags/
├── all
│   └── n1
└── current
    └── n1

2 directories, 2 files

查看/sys/class/net/lo的数据库文件中,G(历史标签)包含current和all,Q(当前标签)仅包含current:

# cat /run/devmaster/data/n1
I:1691248068
G:current
G:all
Q:current

测试结束

清理devmaster残留数据

# rm -rf /run/devmaster/*

测试场景约束

子场景 5

MODE, OWNER, GROUP规则测试。使用OWNER、GROUP、MODE分别改变设备节点的用户、属组和权限。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建回环块设备$loop0, $loop1

创建规则文件:/tmp/1/rules.d/00-test.rules

KERNEL=="$loop0", OWNER="devmaster", GROUP="devmaster", MODE="444"
KERNEL=="$loop1", OWNER="1659", GROUP="1659", MODE="444"

创建用户devmaster、属组devmaster

# useradd -u 1659 devmaster

记录\(loop0、\)loop1原本的用户、属组、权限

# origin_mod=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $2 }' | awk -F'/' '{ print $1 }' | awk -F'(' '{ print $2 }')
# origin_user=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $5 }' | awk -F'/' '{ print $1 }')
# origin_group=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $8 }' | awk -F'/' '{ pri
nt $1 }')

启动devmaster

# devmaster &> log.txt &

测试步骤

触发$loop0的uevent事件,有结果1:

# devctl trigger /dev/$loop0

触发$loop1的uevent事件,有结果2:

# devctl trigger /dev/$loop1

结果验证

结果1:$loop0的用户、属组、权限变更为tss、tss和444

# ll /dev/$loop0
br--r--r-- 1 tss tss 7, 0 Apr 11  4459341 /dev/$loop0

结果2:$loop1的用户、属组、权限变更为tss、tss和444:

# ll /dev/$loop1
br--r--r-- 1 tss tss 7, 1 Apr 11  4459341 /dev/$loop1

测试结束

删除devmaster数据残留

# rm -rf /run/devmaster/*

恢复\(loop0、\)loop1的用户、属组、权限

# chmod $origin_mod /dev/$loop0
# chmod $origin_mod /dev/$loop1
# chown $origin_user /dev/$loop0
# chown $origin_user /dev/$loop1
# chgrp $origin_group /dev/$loop0
# chgrp $origin_group /dev/$loop1

测试场景约束

子场景 6

ATTR赋值规则测试。接收到设备的add事件后,使用ATTR{uevent}="change"规则,在设备事件触发后再次触发一个change事件。接收到change事件后,创建/dev/attr_assign软链接。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建规则文件:/tmp/1/rules.d/00-test.rules

ACTION=="add", ATTR{uevent}="change"
ACTION=="change", SYMLINK+="attr_assign"

创建回环块设备$loop0

启动devmaster

# devmaster &> log.txt &

测试步骤

触发$loop0的add事件:

# devctl trigger /dev/$loop0 --action add

结果验证

检查软链接/dev/attr_assign:

# ll /dev/attr*
lrwxrwxrwx 1 root root 5 Aug  6 10:22 /dev/attr_assign -> $loop0

测试结束

删除devmaster数据残留

# rm -rf /run/devmaster/*

删除软链接残留

# rm -f /dev/attr_assign

测试场景约束

子场景 7

RUN赋值规则测试。首先使用RUN{program}规则,将/bin/touch /tmp/assign_run_program_1加入program执行列表,再使用RUN规则,将/bin/touch /tmp/assign_run_program_2加入program执行列表。RUN规则如果未指明builin或program,则默认转换为RUN{program}规则。最后使用RUN{builtin}将mod load loop加入到builtin执行列表中。规则执行的最后阶段,统一运行执行列表中的program命令和builtin命令。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建规则文件:/tmp/1/rules.d/00-test.rules

SUBSYSTEM!="net", GOTO="end"

RUN{program}+="/bin/touch /tmp/assign_run_program_1"
RUN+="/bin/touch /tmp/assign_run_program_2"

RUN{builtin}+="kmod load joydev"

LABEL="end"

卸载loop内核模块

# rmmod joydev

启动devmaster

# devmaster &> log.txt &

测试步骤

触发虚拟回环网卡/sys/class/net/lo的uevent事件:

# devctl trigger /sys/class/net/lo

结果验证

检查loop内核模块是否加载完毕:

# lsmod | grep joydev
joydev                   28672  0

检查临时文件是否创建成功:

# ll /tmp/assign_run_program_*
-rw-r--r-- 1 root root 0 Aug  6 13:12 /tmp/assign_run_program_1
-rw-r--r-- 1 root root 0 Aug  6 13:12 /tmp/assign_run_program_2

测试结束

删除devmaster数据残留

# rm -rf /run/devmaster/*

删除临时文件

# rm -rf /tmp/assign_run_program_*

测试场景约束

系统中存在joydev内核模块。该用例和其他涉及joydev内核模块的用例存在冲突,需要串行执行。

子场景 8

OPTIONS="link_priority=xxx"赋值规则测试。通过OPTIONS="link_priority=xxx"规则,设置\(loop0的软链接优先级为10,优先级较大的设备优先设置同名软链接。然后通过SYMLINK+="assign_options_link_priority"给 \(loop0和\)loop1设备赋予软链接,并分别触发两者的事件,结果应是assign_options_link_priority指向 \(loop0。触发\)loop0的remove事件后,软链接assign_options_link_priority则指向\)loop1。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建规则文件:/tmp/1/rules.d/00-test.rules
KERNEL=="$loop0", OPTIONS="link_priority=10"

SYMLINK="assign_options_link_priority"

创建回环块设备\(loop0和\)loop1

# dd if=/dev/zero of=loop0.img bs=1M count=100
# loop0=$(losetup -f)
# losetup $loop0 loop0.img
#
# dd if=/dev/zero of=loop1.img bs=1M count=100
# loop1=$(losetup -f)
# losetup $loop1 loop1.img

启动devmaster

# devmaster &> log.txt &

测试步骤

触发\(loop0和\)loop1的uevent事件,有结果1:

# devctl trigger /dev/$loop0 /dev/$loop1

间隔1s后,触发$loop0的remove事件,有结果2:

# devctl trigger /dev/$loop0 --action=remove

结果验证

结果1:生成/dev/assign_options_link_priority 软链接,指向$loop0,/run/devmaster/links/assign_options_link_priority/下生成两个空软链接 device id -> link_priority:devnode

# ll /dev/assign_options_link_priority
lrwxrwxrwx 1 root root 5 Aug  6 13:46 /dev/assign_options_link_priority -> $loop0
# tree /run/devmaster/links/assign_options_link_priority/
/run/devmaster/links/assign_options_link_priority/
├── b7:0 -> 10:/dev/$loop0
└── b7:1 -> 0:/dev/$loop1

0 directories, 2 files

结果2:/dev/assign_options_link_priority 软链接指向 \(loop1,/run/devmaster/links/assign_options_link_priority/下保留指代\)loop1的软链接

# ll /dev/assign_options_link_priority
lrwxrwxrwx 1 root root 5 Aug  6 13:56 /dev/assign_options_link_priority -> $loop1
# tree /run/devmaster/links/assign_options_link_priority/
/run/devmaster/links/assign_options_link_priority/
└── b7:1 -> 0:/dev/$loop1

0 directories, 1 file

测试结束

删除devmaster数据残留

# rm -rf /run/devmaster/*

删除临时文件

# rm -f /dev/assign_options_link_priority

测试场景约束

子场景 9

OPTIONS="string_escape=none|replace"赋值规则测试。首先通过OPTIONS="string_escape=replace"规则,使本规则行中后续SYMLINK+="link1 link2"规则添加link1_link2软链接。string_escape=replace仅影响当前行的SYMLINK、ENV和NAME赋值规则的字符串空格转译,使得空格转移为下划线,执行到下一行后重制。默认不转译字符串空格,因此执行SYMLINK+="link3 link4"规则后,分别生成link3和link4软链接。OPTIONS="string_escape=none"规则取消字符串空格转移,和默认行为相同。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建规则文件:/tmp/1/rules.d/00-test.rules

OPTIONS="string_escape=replace", SYMLINK+="link1 link2"

SYMLINK+="link3 link4"
OPTIONS="string_escape=none", SYMLINK+="link5 link6"

创建回环块设备$loop0

# dd if=/dev/zero of=loop0.img bs=1M count=100
# loop0=$(losetup -f)
# losetup $loop0 loop0.img

启动devmaster

# devmaster &> log.txt &

测试步骤

触发$loop的uevent事件:

# devctl trigger /dev/$loop0

结果验证

生成link_link2、link3、link4、link5、link6软链接

# ll /dev/link*
lrwxrwxrwx 1 root root 5 Aug  6 14:51 /dev/link1_link2 -> loop0
lrwxrwxrwx 1 root root 5 Aug  6 14:51 /dev/link3 -> loop0
lrwxrwxrwx 1 root root 5 Aug  6 14:51 /dev/link4 -> loop0
lrwxrwxrwx 1 root root 5 Aug  6 14:51 /dev/link5 -> loop0
lrwxrwxrwx 1 root root 5 Aug  6 14:51 /dev/link6 -> loop0

测试结束

删除devmaster数据残留

# rm -rf /run/devmaster/*

清理软链接

# rm -rf /dev/link*

测试场景约束

string_escape选项仅影响当前规则行的字符串空格转译行为,到新行后重制。string_escape仅影响ENV、NAME、SYMLINK三类赋值规则。

子场景 10

OPTIONS="static_node="赋值规则测试。OPTIONS="static_node="规则会使devmaster启动后立即将该规则行中的MODE、OWNER、GROUP三类赋值规则作用在设备节点上。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建回环块设备$loop0

# dd if=/dev/zero of=loop0.img bs=1M count=100
# loop0=$(losetup -f)
# losetup $loop0 loop0.img

创建用户、属组

# useradd devmaster

获取$loop0原来的用户、属组、权限

# origin_mod=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $2 }' | awk -F'/' '{ print $1 }' | awk -F'(' '{ print $2 }'))
# origin_user=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $5 }' | awk -F'/' '{ print $1 }')
# origin_group=$(stat /dev/$loop0 | grep Access | grep Uid | awk '{ print $8 }' | awk -F'/' '{ pri
nt $1 }')

创建规则文件:/tmp/1/rules.d/00-test.rules

MODE="444", OWNER="devmaster", GROUP="devmaster", OPTIONS="static_node=$loop0"

测试步骤

启动devmaster:

# devmaster &> log.txt &

结果验证

/dev/$loop0的权限、用户、属组变为444、devmaster、devmaster

# ll /dev/loop0
br--r--r-- 1 devmaster devmaster 7, 0 Aug  6  2991088 /dev/$loop0

测试结束

删除devmaster残留数据

# rm -rf /run/devmaster/*

恢复$loop0的用户、属组、权限

# chmod $origin_mod /dev/$loop0
# chown $origin_user /dev/$loop0
# chgrp $origin_group /dev/$loop0

测试场景约束

静态节点选项在devmaster启动后仅将本行中的OWNER、GROUP、MODE赋值选项作用在设备节点上,其他规则不生效。

子场景 11

OPTIONS="db_persist"赋值规则测试。OPTIONS="db_persist"规则使数据库文件的权限变为1644,默认权限为0644。生成数据库需要满足规则处理后设备包含数据库条目,因此通过ENV赋值规则添加任意环境变量。

备注

准备工作

创建配置文件:/etc/devmaster/config.toml

rules_d = ["/tmp/1/rules.d"]

创建回环块设备$loop0

# dd if=/dev/zero of=loop0.img bs=1M count=100
# loop0=$(losetup -f)
# losetup $loop0 loop0.img

创建规则文件:/tmp/1/rules.d/00-test.rules

ENV{hello}="world"
OPTIONS="db_persist"

启动devmaster:

# devmaster &> log.txt &

测试步骤

触发回环块设备/dev/$loop0的uevent事件

# devctl trigger /dev/$loop0

结果验证

/dev/$loop0的数据库权限为1644:

# stat /run/devmaster/data/b7\:0
  File: /run/devmaster/data/b7:0
  Size: 27              Blocks: 8          IO Block: 4096   regular file
Device: 0,25    Inode: 770940      Links: 1
Access: (1644/-rw-r--r-T)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-08-06 15:36:10.433211063 +0800
Modify: 2023-08-06 15:36:04.833576196 +0800
Change: 2023-08-06 15:36:04.833576196 +0800
 Birth: -

测试结束

删除devmaster残留数据

# rm -rf /run/devmaster/*

测试场景约束


最后更新: November 4, 2023
创建日期: August 23, 2023