Горячая инициализация модуля 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, чтобы получить то, что вы хотите, но я обнаружил, что это приводит к очень стабильному поведению.

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