Как запустить скрипт оболочки _before_ systemd-udevd?
На Ubuntu 18.04 я хотел бы запустить shell-скрипт перед systemd-udevd
начинается.
Причина этого заключается в следующем: Ubuntu 18.04 systemd-udevd использует высокую загрузку процессора, конфликтует с графикой 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
, Затем сценарий оболочки должен использовать 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
Итак, как мне получить скрипт оболочки, подобный приведенному выше, для запуска до запуска systemd-udevd?
PS: если кто-нибудь знает лучший, более умный обходной путь, возможно, со встроенными возможностями 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
файл о том, почему это когда-либо влияет на систему, когда не найдено подходящих устройств.