跳转至

使用devmaster替换udev启动

使用devmaster替换sysmaster虚拟机启动场景的udev,使得虚拟机启动后可以正常激活逻辑卷、挂载分区、加载网络等等。

sysmaster源码根目录下执行如下命令进行安装:

# sh -x tools/run_with_devmaster/install_devmaster.sh [debug|release]

测试环境

  • 测试的虚拟机环境如下:
# uname -a
Linux localhost.localdomain 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
  • devmaster的规则直接取自虚拟机环境中的udev规则,在此基础上对sysmaster环境中不支持的规则进行了适配。引用的规则以及适配情况见规则清单适配差异

安装方法

  1. 参考sysmaster虚拟机启动方案搭建启动环境。

  2. 安装devmaster的二进制以及相关配置文件,在sysmaster源码根目录下执行如下命令:

# sh -x tools/run_with_devmaster/install_devmaster.sh [debug|release]
  1. 重启系统,选择sysmaster启动项。进入主系统后检查devmaster服务状态和网络连通情况。

规则清单

编号 规则 是否需要适配
1 01-md-raid-creating.rules mdadm-4.1-5.oe2203.x86_64
2 10-dm.rules device-mapper-1.02.181-4.oe2203.x86_64
3 11-dm-lvm.rules lvm2-2.03.14-4.oe2203.x86_64
4 11-dm-mpath.rules multipath-tools-0.8.7-2.oe2203.x86_64
5 11-dm-parts.rules kpartx-0.8.7-2.oe2203.x86_64
6 13-dm-disk.rules device-mapper-1.02.181-4.oe2203.x86_64
7 40-elevator.rules systemd-udev-249-16.oe2203.x86_64
8 40-openEuler.rules systemd-udev-249-16.oe2203.x86_64
9 50-udev-default.rules systemd-udev-249-16.oe2203.x86_64
10 60-autosuspend.rules systemd-udev-249-16.oe2203.x86_64
11 60-block.rules systemd-udev-249-16.oe2203.x86_64
12 60-cdrom_id.rules systemd-udev-249-16.oe2203.x86_64
13 60-drm.rules systemd-udev-249-16.oe2203.x86_64
14 60-evdev.rules systemd-udev-249-16.oe2203.x86_64
15 60-fido-id.rules systemd-udev-249-16.oe2203.x86_64
16 60-infiniband.rules none package
17 60-input-id.rules systemd-udev-249-16.oe2203.x86_64
18 60-net.rules initscripts-10.12-1.oe2203.x86_64
19 60-persistent-alsa.rules systemd-udev-249-16.oe2203.x86_64
20 60-persistent-input.rules systemd-udev-249-16.oe2203.x86_64
21 60-persistent-storage.rules systemd-udev-249-16.oe2203.x86_64
22 60-persistent-storage-tape.rules systemd-udev-249-16.oe2203.x86_64
23 60-persistent-v4l.rules systemd-udev-249-16.oe2203.x86_64
24 60-raw.rules util-linux-2.37.2-5.oe2203.x86_64
25 60-rdma-ndd.rules rdma-core-35.1-2.oe2203.x86_64
26 60-rdma-persistent-naming.rules rdma-core-35.1-2.oe2203.x86_64
27 60-sensor.rules systemd-udev-249-16.oe2203.x86_64
28 60-serial.rules systemd-udev-249-16.oe2203.x86_64
29 60-srp_daemon.rules rdma-core-35.1-2.oe2203.x86_64
30 62-multipath.rules multipath-tools-0.8.7-2.oe2203.x86_64
31 63-md-raid-arrays.rules mdadm-4.1-5.oe2203.x86_64
32 64-btrfs-dm.rules btrfs-progs-5.15-1.oe2203.x86_64
33 64-btrfs.rules systemd-udev-249-16.oe2203.x86_64
34 64-md-raid-assembly.rules mdadm-4.1-5.oe2203.x86_64
35 66-kpartx.rules kpartx-0.8.7-2.oe2203.x86_64
36 68-del-part-nodes.rules kpartx-0.8.7-2.oe2203.x86_64
37 69-dm-lvm.rules lvm2-2.03.14-4.oe2203.x86_64
38 69-md-clustered-confirm-device.rules mdadm-4.1-5.oe2203.x86_64
39 70-camera.rules none package
40 70-joystick.rules systemd-udev-249-16.oe2203.x86_64
41 70-memory.rules systemd-249-16.oe2203.x86_64
42 70-mouse.rules systemd-udev-249-16.oe2203.x86_64
43 70-power-switch.rules systemd-udev-249-16.oe2203.x86_64
44 70-touchpad.rules systemd-udev-249-16.oe2203.x86_64
45 70-uaccess.rules systemd-udev-249-16.oe2203.x86_64
46 71-seat.rules systemd-udev-249-16.oe2203.x86_64
47 73-idrac.rules systemd-udev-249-16.oe2203.x86_64
48 73-seat-late.rules systemd-udev-249-16.oe2203.x86_64
49 75-net-description.rules systemd-udev-249-16.oe2203.x86_64
50 75-probe_mtd.rules systemd-udev-249-16.oe2203.x86_64
51 75-rdma-description.rules rdma-core-35.1-2.oe2203.x86_64
52 78-sound-card.rules systemd-udev-249-16.oe2203.x86_64
53 80-drivers.rules systemd-udev-249-16.oe2203.x86_64
54 80-net-setup-link.rules systemd-udev-249-16.oe2203.x86_64
55 80-tpm-udev.rules tpm2-tss-3.1.0-1.oe2203.x86_64
56 80-udisks2.rules udisks2-2.9.4-2.oe2203.x86_64
57 81-net-dhcp.rules systemd-249-16.oe2203.x86_64
58 84-nm-drivers.rules NetworkManager-1.32.12-8.oe2203.x86_64
59 85-nm-unmanaged.rules NetworkManager-1.32.12-8.oe2203.x86_64
60 90-iprutils.rules iprutils-2.4.19-1.oe2203.x86_64
61 90-iwpmd.rules rdma-core-35.1-2.oe2203.x86_64
62 90-nm-thunderbolt.rules NetworkManager-1.32.12-8.oe2203.x86_64
63 90-rdma-hw-modules.rules rdma-core-35.1-2.oe2203.x86_64
64 90-rdma-ulp-modules.rules rdma-core-35.1-2.oe2203.x86_64
65 90-rdma-umad.rules rdma-core-35.1-2.oe2203.x86_64
66 90-vconsole.rules systemd-udev-249-16.oe2203.x86_64
67 91-drm-modeset.rules libdrm-2.4.109-2.oe2203.x86_64
68 95-dm-notify.rules device-mapper-1.02.181-4.oe2203.x86_64
69 96-e2scrub.rules e2fsprogs-1.46.4-7.oe2203.x86_64
70 98-kexec.rules kexec-tools-2.0.23-4.oe2203.x86_64
71 99-systemd.rules systemd-udev-249-16.oe2203.x86_64

systemd相关命令无法在sysmaster启动环境中使用,使用到这些命令的规则需要进行适配。部分适配动作会对功能造成影响,比如注释某条规则。某些适配动作不影响功能,但会产生行为差异,比如规则中调用systemd-run <cmd>命令会生成一个systemd的服务并执行cmd命令,适配后会去除systemd-run前缀,直接由devmaster创建子进程来执行cmd。另外清理了规则中的一些语法告警,比如IMPORT{}类规则使用了赋值操作符等,此类修改不影响规则执行结果。

规则适配差异

40-openEuler.rules

# diff tools/run_with_devmaster/rules.d/40-openEuler.rules /lib/udev/rules.d/40-openEuler.rules
17c17
< # ACTION=="add", SUBSYSTEM=="module", KERNEL=="bridge", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/proc/sys/net/bridge"
---
> ACTION=="add", SUBSYSTEM=="module", KERNEL=="bridge", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/proc/sys/net/bridge"

60-srp_daemon.rules

# diff 60-srp_daemon.rules /lib/udev/rules.d/60-srp_daemon.rules
1c1
< #SUBSYSTEM=="infiniband_mad", KERNEL=="*umad*", PROGRAM=="/bin/systemctl show srp_daemon -p ActiveState", RESULT=="ActiveState=active", ENV{SYSTEMD_WANTS}+="srp_daemon_port@$attr{ibdev}:$attr{port}.service"
---
> SUBSYSTEM=="infiniband_mad", KERNEL=="*umad*", PROGRAM=="/bin/systemctl show srp_daemon -p ActiveState", RESULT=="ActiveState=active", ENV{SYSTEMD_WANTS}+="srp_daemon_port@$attr{ibdev}:$attr{port}.service"

62-multipath.rules

# diff 62-multipath.rules /lib/udev/rules.d/62-multipath.rules
74,75c74
< # RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Wants=multipathd.service --property After=multipathd.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
< RUN+="/usr/bin/devctl trigger --action=add $sys$devpath"
---
> RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Wants=multipathd.service --property After=multipathd.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
85,90c84,89
< IMPORT{db}=="FIND_MULTIPATHS_WAIT_CANCELLED"
< # ENV{FIND_MULTIPATHS_WAIT_CANCELLED}!="?*", \
< #     ENV{FIND_MULTIPATHS_WAIT_UNTIL}=="?*", \
< #     ENV{FIND_MULTIPATHS_WAIT_UNTIL}!="0", \
< #     ENV{FIND_MULTIPATHS_WAIT_CANCELLED}="1", \
< #     RUN+="/usr/bin/systemctl stop cancel-multipath-wait-$kernel.timer"
---
> IMPORT{db}="FIND_MULTIPATHS_WAIT_CANCELLED"
> ENV{FIND_MULTIPATHS_WAIT_CANCELLED}!="?*", \
>       ENV{FIND_MULTIPATHS_WAIT_UNTIL}=="?*", \
>       ENV{FIND_MULTIPATHS_WAIT_UNTIL}!="0", \
>       ENV{FIND_MULTIPATHS_WAIT_CANCELLED}="1", \
>       RUN+="/usr/bin/systemctl stop cancel-multipath-wait-$kernel.timer"

69-dm-lvm.rules

# diff 69-dm-lvm.rules /lib/udev/rules.d/69-dm-lvm.rules
82,84c82,83
< IMPORT{program}=="/usr/sbin/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}"
< # ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run -r --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay --nohints $env{LVM_VG_NAME_COMPLETE}"
< ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/sbin/lvm vgchange -aay --nohints $env{LVM_VG_NAME_COMPLETE}"
---
> IMPORT{program}="/usr/sbin/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}"
> ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run -r --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay --nohints $env{LVM_VG_NAME_COMPLETE}"

98-kexec.rules

# diff 98-kexec.rules /lib/udev/rules.d/98-kexec.rules
14,16c14
< #RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'"
<
< RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/lib/udev/kdump-udev-throttler'"
---
> RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'"

90-vconsole.rules

# diff tools/run_with_devmaster/rules.d/90-vconsole.rules /lib/udev/rules.d/90-vconsole.rules
3c12
< # ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="/usr/lib/systemd/systemd-vconsole-setup"
---
> ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="/usr/lib/systemd/systemd-vconsole-setup"

99-systemd.rules

99-systemd.rules规则中的所有内容均被注释。


最后更新: November 6, 2023
创建日期: September 5, 2023