Модем в системе есть, eSIM не грузится: разбираем подводные камни Dell DW5821e и DW5829e под Linux

Подключил LTE-модем к ноутбуку с Linux, ядро его увидел, драйвер подхватился - казалось бы, вот он, мобильный интернет. На практике пользователь открывает терминал и обнаруживает, что до сети ещё далеко: профиль eSIM не загружается, оператор не выбирается, соединение висит в статусе "поднимается", а трафик при этом упорно идёт через Wi-Fi. С такой реальностью сталкиваются владельцы ноутбучных модемов Dell DW5821e и DW5829e, и именно для них команда энтузиастов собрала открытый проект dell-dw5821e-dw5829e-esim-linux. Разработчики не стали писать новый драйвер - они собрали воедино существующие компоненты и подробно задокументировали каждую ошибку, встреченную при работе с этими устройствами. Дальше разберём, что именно даёт этот обвес поверх стандартных драйверов Linux, почему две внешне одинаковые модели требуют разного подхода и где обычно прячется причина "мёртвого" соединения. Ниже разбор идёт по документации репозитория, а не по собственным экспериментам, - с испытаниями можно ознакомиться на странице методики.

Модем в системе есть, eSIM не грузится: разбираем подводные камни Dell DW5821e и DW5829e под Linux

Зачем нужен программный слой поверх драйверов

Ядро Linux действительно умеет общаться с этими модемами - модули qmi_wwan, cdc_mbim и option уже входят в поставку. Но чтобы получить работающий мобильный канал, нужно пройти всю цепочку: перевести устройство в нужный режим, загрузить профиль, выбрать активного оператора, поднять сессию и направить в неё проверочный запрос. Разорванная на любом шаге цепочка не даёт интернета, а понять, где именно провал, без логов почти невозможно.

Репозиторий как раз закрывает пространство пользователя: скрипты переключения профилей, правила udev для стабильных имён портов, юниты systemd для подготовки окружения после загрузки и подробное описание отказов. Центральный элемент - сторонняя утилита lpac под AGPL-3.0, которая управляет eSIM через APDU-бэкенд. Для двух моделей её нужно собирать с разными бэкендами: у DW5829e это QMI поверх qmi-proxy, у DW5821e - AT на последовательном порту, и в момент работы порт должен быть свободен от pppd.

Отдельного упоминания заслуживает ModemManager. Эта служба при появлении модема сразу забирает управляющий интерфейс и AT-порты, после чего lpac падает с сообщениями, которые легко принять за неисправность eUICC. Авторы проекта прямо рекомендуют отключать и маскировать эту службу до начала автоматизации.

Две модели - два разных подхода

DW5829e-eSIM и DW5821e-eSIM построены на Qualcomm Snapdragon X20 со встроенной eUICC и физического слота для карты не имеют. Но Linux общается с ними по-разному. DW5829e по умолчанию определяется в конфигурации MBIM, и правило udev переключает его в QMI. У DW5821e доступ к eUICC идёт через AT-команды, а данные передаются по PPP.

Сверяйте USB ID до начала настройки: у DW5821e идентификатор 413c:81e0 соответствует версии с eSIM, а 413c:81d7 - варианту без неё. Внешне устройства не отличить, но заставить работать eUICC на втором невозможно в принципе.

Для DW5829e смена профиля включает остановку сессии, отвязку и привязку USB, активацию нужного профиля и сброс через DMS - модем возвращается в систему примерно через полминуты. У DW5821e используется пара AT+CFUN=0 и AT+CFUN=1. Важно помнить: несколько сохранённых профилей не означают одновременную работу нескольких операторов, активен всегда ровно один.

Ловушка с APN и застрявшее радио

Самый показательный сбой на DW5821e связан с APN - точкой доступа, через которую модем выходит в пакетную сеть. После переключения профиля устройство могло подключиться со старым APN предыдущего оператора. Причина в порядке действий: радио включается раньше, чем скрипт успевает задать новые параметры, и регистрация проходит со старыми настройками. Снаружи картина приличная - адрес получен, соединение поднято, - но пакеты не проходят. Один оператор молчал, второй отвечал сбросом TCP, третий переадресовывал запросы на служебную страницу с жалобой на неверный APN.

В проекте для этого есть отдельный скрипт: он задаёт APN при включённом радио, сверяет его с фактическим через AT+CGCONTRDP и при расхождении переприсоединяет модем к сети. Проверка идёт по реальному состоянию, а не по отправленным командам.

Вторая проблема - выключенное радио после прерванного переключения. Если процесс завершается между AT+CFUN=0 и AT+CFUN=1, модем остаётся без питания на eUICC, lpac не видит ни одного профиля, а скрипт соединения зацикливается. В документации зафиксирован случай, когда узел провёл в таком состоянии около тридцати часов. Лечится проверкой AT+CFUN перед обращением к lpac и принудительным включением. Злоупотреблять частыми циклами CFUN тоже нельзя: сто семьдесят переключений за два часа однажды привели к тому, что модем остался на USB-шине, но перестал отвечать на команды.

Раздельные маршруты и пространства имён

На узле с модемом почти всегда есть и проводной канал. Если мобильная сессия не поднялась, обычный запрос уйдёт через него, а проверка запишет успех, ничего не говорящий о выбранном операторе. В проекте для этого применяются network namespaces - отдельные сетевые пространства Linux - вместе с правилами маршрутизации. Мобильный аплинк живёт в своём пространстве, а проводное соединение остаётся для управления.

Полученный адрес и статус "поднято" ещё не гарантируют, что трафик уйдёт через нужный интерфейс. Без изоляции маршрутов результат измерения может относиться к совершенно другому каналу.

Тот же приём применяется в Freedom Checker для проверки доступности средств обхода и прокси через сети разных операторов.

Восстановление после сбоя: почему частые перезапуски вредят

Автоматика восстановления требует не меньше настройки, чем первичный запуск. Для DW5829e обновление соединения включает переподключение модема на USB: устройство исчезает из системы на десять-двадцать секунд. Если проверка состояния в этот момент решит, что модем мёртв, она запустит новое восстановление, и рабочие задачи оборвутся стараниями самой автоматики.

В проекте описана лестница восстановления с интервалами: проверка раз в минуту, три последовательных отказа до обновления соединения, не более трёх сбросов модема в час. Пока аплинк восстанавливается, новые задания на него не отправляются. Для удалённого узла это критично: бесконечные попытки "починить" соединение делают его менее доступным, чем исходный сбой.

С чего начать

Сначала сверьте модель и USB ID, затем выберите нужную инструкцию: QMI для DW5829e или вариант через PPP для DW5821e. Авторы проверяли сборку на Ubuntu 24.04 с ядром 6.8 - на другой системе могут потребоваться правки в зависимостях. Полезно сначала добиться стабильного соединения с одним профилем, затем проверить переключение и восстановление после перезапуска: так проще отделить ошибки базового подключения от ошибок автоматики. Скрипты и документация распространяются по лицензии MIT, lpac ставится отдельно под AGPL-3.0. Код и разбор ошибок лежат в репозитории на GitHub - начинать стоит с README и раздела с описанными сбоями.