我是 LUbuntu 22.04.2 LTS 用户。当我插入 ERGO LTE USB Wi-Fi 路由器 WO2-CRC9 时,笔记本电脑(HP Probook)在电流负载下会保持非常非常热的状态,风扇持续运转,即使路由器的 Wi-Fi 功能已关闭,电池也会在 1...2 小时内放电,而不是 5 小时。
systemd-udevd 进程消耗了近 100% 的处理器资源。“TOP”输出的片段如下:
PID КОР. PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
**** root ** 0 154488 136432 4664 R 99,7 0,2 70:54.78 systemd-udevd
**** root ** 0 25060 4840 2272 S 22,3 0,0 15:36.65 systemd-udevd
...
解决方案来自https://unix.stackexchange.com/questions/233247/why-is-systemd-udev-pegging-my-cpu通过编辑 /lib/udev/rules.d/69-libmtp.rules 没有帮助。
udevadm monitor
UDEV [104.881828] change /devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1/1-2/1-2:1.5/host0/target0:0:0/0:0:0:0/block/sr0 (block)
KERNEL[104.890895] change /devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1/1-2/1-2:1.5/host0/target0:0:0/0:0:0:0/block/sr0 (block)
KERNEL[104.898884] change /devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1/1-2/1-2:1.5/host0/target0:0:0/0:0:0:0/block/sr0 (block)
KERNEL[104.914578] change /devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1/1-2/1-2:1.5/host0/target0:0:0/0:0:0:0/block/sr0 (block)
#(infinite loop)
看来,在断开虚拟 CD-ROM 与 Windows 驱动程序的连接后,UDEV 会尝试找到它,从而导致无限循环。
解决方法是使用宏(从 Ubuntu 16 升级到 18.04 后,systemd-udevd 使用 100% CPU)每次插入调制解调器后,而不是每次系统启动时:
#!/bin/sh
sudo systemctl stop systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket
sleep 5
sudo systemctl start systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket
这也允许在不重启的情况下移除和插入调制解调器。但宏必须重复。如何避免额外的手动操作?
致以最诚挚的问候。维克多。
答案1
警告:此解决方案会导致调制解调器后连接的所有设备运行不正确!抱歉!
为了解决这个问题,需要创建一个 UDEV 规则。但这里有一个问题:
udevadm info --attribute-walk --path=/devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1/1-2/1-2:1.5/host0/target0:0:0/0:0:0:0/block/sr0
显示没有唯一属性。为父设备找到了唯一有用的属性:ATTRS{model}=="Mobile CMCC CD "
但在绑定之后,设备开始运行之前会有很多事件。如果在此过程中我们重新启动 UDEV,这个复杂的设备将无法运行。因此,我们应该留出足够的时间来执行所有功能。
解决方案。
创建一个名为restart-udev-from-rule.sh的宏,使其可执行,并将其放入/usr/bin(由于未知原因,无法将以下行格式化为代码):
/bin/sh #!/bin/sh 复制代码
睡 5
systemctl 停止 systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket
睡 5
systemctl 启动 systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket
创建文件 80-local.rules 并将其放入 /etc/udev/rules.d :
SUBSYSTEM=="scsi", ATTRS{model}=="移动CMCC CD ", ACTION=="添加", RUN+="/usr/bin/restart-udev-from-rule.sh"
重新开始。
为了测试效果,
udevadm monitor
插入调制解调器后运行。
已知限制:
插入调制解调器后 10 秒内不要插入/移除设备,因为 UDEV 将无法运行。即使没有必要,也可以为任何其他调制解调器激活该规则。这是因为没有唯一标识符。