Горячая инициализация модуля LTE с использованием libqmi и systemd-network (networkd-dispatcher)
Я хочу инициализировать модуль lte, используя libqmi и networkd-dispatcher. На данный момент я получил сценарий оболочки, который находится в /etc/networkd-dispatcher/degraded.d/01-wwan.sh.
#!/bin/bash
interface="${IFACE}"
if [[ "$interface" == *"wwan"* ]]; then
device="/dev/cdc-wdm${interface: -1}"
is_wwan="y"
fi
if [[ "$is_wwan" == "y" ]]; then
ip link set dev "${interface}" down
echo "Y" > "/sys/class/net/${interface}/qmi/raw_ip"
qmi-network "${device}" start || true
qmicli -p -d "${device}" --wds-set-autoconnect-settings=enabled || true
ip link set dev "${interface}" up
fi
Моя проблема сейчас в том, что этот скрипт вызывается снова и снова, иногда после перезагрузки, и требуется некоторое время, чтобы он стал стабильным. Я думал, что если я добавлю сон на 10 секунд после подключения, это решит проблему, но это не так. Любые предложения, как это исправить?
1 ответ
Извините, что немного поздно, но только что наткнулся на этот вопрос.
Если просто для полноты картины, метод, который я нашел вполне предсказуемым и надежным, заключается в том, чтобы связать файл службы systemd, который запускает скрипт, с правилом udev :
Создайте в /etc/udev/rules.d файл, например 10-lte-modem.rules, который должен выглядеть так:
SUBSYSTEM=="net",ACTION=="add",ENV{PRODUCT}=="PID-of-modem", TAG+="systemd",ENV{SYSTEMD_WANTS}
Обратите внимание, что вы можете использовать разные триггеры, например, если ваш модем подключен к фиксированному порту USB-концентратора, вы можете использовать KERNELS=" 1-1.1 ". Дело в том, чтобы запустить службу systemd при перечислении модема (что позволяет перезагрузить модем, и ваш скрипт автоматически перезапустится). Вам также может понадобиться добавить поле NAME=, чтобы дать вашему интерфейсу детерминированное имя.
В вашем служебном файле systemd, который запустит ваш скрипт, у вас есть что-то вроде:
[Unit]
ConditionPathExists=|!/sys/class/net/wwan1
ConditionPathExists=|!/sys/class/net/wwan2
[Service]
Type=simple
Restart=always
RemainAfterExit=no
ExecStart=/bin/sh /etc/networkd-dispatcher/degraded.d/01-wwan.sh
|! синтаксис в systemd позволяет использовать ИЛИ различные условия.
В зависимости от точной настройки вашей системы, например, модем ли это PCIe или USB, вам, возможно, придется поиграть с настройками udev и systemd, чтобы получить то, что вы хотите, но я обнаружил, что это приводит к очень стабильному поведению.