在 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
,以了解当找不到匹配的设备时它为何会影响系统。