Пакет 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 действительно подчёркивается очень выразительно, и это не может не впечатлять. Продемонстрированный пример – может, немного немногообещающий или посредственный – всецело раскрывает потенциал этого инструмента.
Комментарии (7)

mickvav
29.09.2016 07:14Ну и к 0 как к индексу тогда лучше не привязываться.

kalterfive
29.09.2016 14:26Серийные порты генерируются в зависимости от конкретного устройства, к которому как раз и привязана конфигурация. Хотя я иногда замечал, что при некоторых обстоятельствах они менялись с ttyUSB0… 2 соответственно на ttyUSB1… 3 – но это нештатная ситуация.
Или нет?

evg_krsk
29.09.2016 14:33для некоторых последовательных устройст udev генерирует т.н. persistent имена — симлинки из /dev/serial/by-id/ЧТО-то-ТАМ. В частности для usb2com у меня это работает.

evg_krsk
29.09.2016 13:49+1Не сталкивался с usb_modeswitch, но не проще было добавить в нужный юнит Requires=dev-serial-by\x2did-FOOBAR.device и After= на него же?
win32asm
Я бы посоветовал у ttyUSB0 дополнительно что-нибудь проверять — серийник, симлинк или тот же VID/PID.
Будет неприятно, если какое-то другое USB-Serial устройство — не модем — будет забрано ppp демоном.
Но общий подход, несомненно, верен. Спасибо. 8-)
kalterfive
Спасибо, корректное замечание.