[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 дійсно підкреслюється дуже виразно, і це не може не вражати. Продемонстрований приклад – може, трохи немногообещающий або посередній – цілком розкриває потенціал цього інструменту.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.