Как запустить скрипт оболочки _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 файл о том, почему это когда-либо влияет на систему, когда не найдено подходящих устройств.

Другие вопросы по тегам