[systemd/udev] ppp: корректный автостарт system‐wide демона
Пакет usb_modeswitch
обычно поставляется с готовыми udev‐правилами для автоматического переключения режима модема. ppp
, независимо от него, помимо самого себя, включает сервис для демонизации. Эти конфигурации независимы друг от друга.
Если использовать их одновременно, может возникнуть конфликт: pppd
запустится до того, как udev переключит модем usb_modeswitch -J
‐ем.
Можно оставить на откуп Restart=on-failure
с RestartSec=5s
, но спортивно ли это?
«Just dying to be saved…» Converge
Для начала редактируем usb_modeswitch.conf — DisableSwitching=yes
. Этот файл неявно используется «дефолтными» правилами — они нам не пригодятся, хоть и мешать не будут.
Теперь — systemctl disable ppp@….service
. Втягивание юнита из multi-user.target
нам впредь не потребуется; [Install]
более не полезен.
Осталось сделать так, чтобы это всё заработало вновь — уже по‐другому.
«Beaten awake to murder again.» PsyOpus
Новое udev‐правило призвано решить проблему, поставленную ранее: оно должно сначала сообщить задачу usb_modeswitch
‐у, и только потом обратиться к systemd.
В подсистеме USB устройство можно определить двумя атрибутами‐идентификаторами: idVendor
и idProduct
. Их можно увидеть lsusb‐ом — они располагаются соответственно после «ID».
Сказанное почти в точности соответствует первой строке новой конфигурации:
$ su -
$ cd /etc/udev/rules.d
$ cat > 20-provider-modem.rules <<< …
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="…", ATTR{idProduct}=="…", RUN+="/usr/sbin/usb_modeswitch -v $attr{idVendor} -p $attr{idProduct} -J"
— уточнять систему счисления (0x
) не нужно.
Теперь мы переходим к рассмотрению другой подсистемы — теперь для нас важен ttyUSB0
. Снова обращаемся к любимому текстовому редактору:
$ cat >> 20-provider-modem.rules <<< …
SUBSYSTEM=="tty", KERNEL=="ttyUSB0", TAG+="systemd", ENV{SYSTEMD_WANTS}="ppp@provider.service"
— здесь udev в надлежащий момент сообщает systemd о возможности запуска ppp@
.
Наконец:
$ udevadm control --reload
«Well just cease the torment, it’s weighting on my mind, the pressure you apply…» TesseracT
Меня однажды очень заинтересовало умозаключение intelfx о взаимосвязи systemd и udev:
udev и systemd — офигенно мощные фреймворки, дополняющие друг друга.systemd основан на модели зависимостей: выполнить X, если Y доступно.
udev — на модели событий: когда Y станет доступным, выполнить X.
Связь userspace с kernel действительно подчёркивается очень выразительно, и это не может не впечатлять. Продемонстрированный пример — может, немного немногообещающий или посредственный — всецело раскрывает потенциал этого инструмента.
Комментарии (2)
29 сентября 2016 в 00:14
+3↑
↓
Я бы посоветовал у ttyUSB0 дополнительно что-нибудь проверять — серийник, симлинк или тот же VID/PID.
Будет неприятно, если какое-то другое USB-Serial устройство — не модем — будет забрано ppp демоном.Но общий подход, несомненно, верен. Спасибо. 8-)
29 сентября 2016 в 00:15
0↑
↓
Спасибо, корректное замечание.