如何在 systemd-udevd 运行之前运行 shell 脚本?

如何在 systemd-udevd 运行之前运行 shell 脚本?

在 Ubuntu 18.04 上,我想在systemd-udevd启动前运行一个 shell 脚本。

造成这种情况的原因是这个错误:Ubuntu 18.04 systemd-udevd 使用高 CPU,与 nvidia 显卡冲突

解决方案是移动规则,71-nvidia.rules这样它就不会被发现,但对我来说不起作用:我有一台 Razer Blade Stealth,我可以在有或没有 Razer Core(带 Nvidia 卡)的情况下操作它。当笔记本电脑连接到 Razer Core(通过 Thunderbolt-3)时,一切都很好。但是当笔记本电脑未连接时,我遇到了与另一个问题中描述的相同的问题。

作为一种解决方法,我想转到/lib/udev/rules.d/71-nvidia.rules/lib/udev/rules.available/71-nvidia.rules然后,shell 脚本应该使用lspci来确定是否找到了 nvidia 卡。如果找到了 Nvidia 卡,它将创建一个指向 的符号链接/lib/udev/rules.available/71-nvidia.rules/lib/udev/rules.d/71-nvidia.rules如果没有找到 Nvidia 卡,它将删除该符号链接。

#!/bin/bash
set -e ; set -o pipefail

mkdir -p /lib/udev/rules.available/
if [ ! -e /lib/udev/rules.available/71-nvidia.rules ] ; then
    mv /lib/udev/rules.{d,available}/71-nvidia.rules
fi

rm -f /lib/udev/rules.d/71-nvidia.rules
if lspci | grep nvidia ; then
    ln -s /lib/udev/rules.{available,d}/71-nvidia.rules
fi

那么,如何才能让上述 shell 脚本在 systemd-udevd 启动之前运行呢?

附言:如果有人知道更好、更智能的解决方法,也许是利用的内置功能systemd-udevd,我也很想知道。

答案1

为了回答当前的问题,您可以简单地编写一个.service具有Before=排序依赖关系的单元systemd-udevd.service

[Unit]
Before=systemd-udevd.service

请注意,systemd-udevd.service在早期启动期间启动,因此您还需要使用DefaultDependencies=no并手动列出任何实际需要的依赖项。否则,您将得到一个排序循环。

把所有这些放在一起,这个单元看起来就像这样:

# /etc/systemd/system/udev-nvidia-hack.service
[Unit]
DefaultDependencies=no
Before=systemd-udevd.service
RequiresMountsFor=/lib/udev /etc/udev /path/to/script

[Service]
Type=oneshot
ExecStart=/path/to/script.sh

[Install]
WantedBy=sysinit.target

然而,在检查文件时,您将有一个更好的解决方案71-nvidia.rules,以了解当找不到匹配的设备时它为何会影响系统。

相关内容