Продолжение. Начало здесь.
Для тех, кто недавно присоединился к радиоканалу "Боян-FM" читателям моей уютненькой™, напомню, что затеял всё это ради того, чтобы построить достаточно скоростной IPSec-канал через "Йоту". А для этого, в свою очередь, необходимо получить прямой "честный" IP с SIM-карты на каком-либо сетевом интерфейсе, притом минуя PPP.
Конкретно я использую модем iRZ TL21, построенный на базе модуля Sierra (он же AirPrime) MC7710, в составе которого находится чип Qualcomm MDM9200. Система - стабильный дистрибутив Debian (в данном случае Wheezy).
Сразу оговорюсь, что в какой-нибудь свежей Ubuntu данный модем заработает прям "из коробки": его хорошо понимает NetworkManager. Но мы ж реальные пацаны, у нас реальный сервак, GUI на нём нетути. Да и подниматься линк должен сам по себе при старте системы. Поэтому пойти по простому пути не получится, придётся никакой механизма всё вручную.
Итак, суём модем в USB-порт, заправшиваем "lsusb" и видим...
Bus 006 Device 002: ID 03f0:1027 Hewlett-Packard Virtual keyboard and mouse
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 003: ID 1199:68a2 Sierra Wireless, Inc. MC7710 Modem
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Ага, третья строчка - вот оно как раз самое. Выделенные жирным шрифтом цифирки нам потом ещё пригодятся. Ну что-ж, вроде как всё хорошо. Смотрим "ls /dev/ttyUSB*" и видим... а ничего мы не видим. Как говорится, "***в панама". Нету псевдотерминалов.
Иногда затык может заключаться в том, что некоторые модемы "тянут" за собой виртуальный CD-ROM, на котором типа лежат типа драйвера для этого модема. И пока не пнёшь этот модем правильной AT-командой, собственно в модем он не превратится. А будет и дальше себе с настойчивостью кретина прикидываться CD-приводом. Ну это лечится элементарной установкой пакета "usb-modeswitch": "apt-get install usb-modeswitch".
Ладно, установили. Но псевдотерминалы всё равно не появились. Чешем репу. И вспоминаем, что в Debian-е по умолчанию идёт довольно боянистый софт, и нужных драйверов "из коробки" нет. Чтобы не париться уж слишком сильно, можно тупо поставить свежее ядрышко из backports. На момент написания этого псто оно было версии 3.16:
Перезагрузились. Смотрим "modinfo qmi_wwan" и "modinfo sierra_net". Если выделенные жирным циферки из выхлопа lsusb (см. выше) оказались в одном из двух списков, то всё пучком. Можем продолжать. Если же нет, увы. Идем искать драйвера к нашему "мопеду". Хорошо если найдём. А если не найдем - значит "упс". В моём случае всё ништяк:
Внезапно, и псевдотерминалы появились в большом количестве:
Дальше тыкаем каким-нибудь minicom-ом в каждый терминал по очереди ("minicom -D /dev/ttyUSB0", "minicom -D /dev/ttyUSB1" и т.п.) и смотрим который из них откликнется на какой нибудь "AT!GSTATUS?", тот и есть нужный нам. Заодно проверим, что модем сцепился с сотовой сетью.
Вроде работает. Тут наступает небольшая засада. В дальнейшем нам придётся из различных скриптов ссылаться на найденный псевдотерминал. Но никто не может гарантировать нам, что после очередной перезагрузки сервера имя устройства останется таким же. Поэтому придётся помучать udev для того чтобы создать символическую ссылку (symlink), дабы увековечить нашу бесценную находку. Для начала смотрим к каким атрибутам мы могли бы привязаться.
Копипаста ниже была взята с другой конфигурации оборудования, поэтому некоторые буквы-цифры там будут расходиться с моим примером. Самые внимательные, наверное, даже найдут где именно. Но общий смысл от этого не меняется. Текстовое поле можно растянуть, чтобы было удобнее читать.
Смотрим к каким атрибутам оборудования мы можем "привязаться". Однозначно придётся использовать критерий SUBSYSTEM=="tty" из первой секции, иначе получится ерунда. Но этого мало. Нужно что-то ещё. Большой соблазн взять ATTRS{product}=="MC7710", чтобы однозначно идентифицировать устройство, но... тогда мы не сможем указать номер интерфейса. Ибо udev позволяет брать параметры устройства и только одного родителя. Поэтому придётся довольствоваться ATTRS{bInterfaceNumber}=="03" и DRIVERS=="qcserial" из третьей секции. Итоговое правило будет выглядеть так:
Записываем его куда-нибудь в "/etc/udev/rules.d/80-LTE.rules", после чего заклинаем "udevadm control --reload-rules", "udevadm trigger". Первое нужно, чтобы udev перечитал список правил, второе - чтобы не топать ногами в серверную и не "перевтыкать" руками модем.
Итак, у нас появилась символическая ссылка "/dev/LTE-control". Что же с ней делать дальше? А дальше надо указать модему APN и логин-пароль, если есть. Но каждый раз мы это делать руками, понятно, не будем. Поэтому имеет смысл либо написать скрипт, либо запихнуть вызов соответствующих команд прямо в "/etc/network/interfaces". У меня получилось что-то типа того.
В директиве "pre-up" описываем действия до поднятия интерфейса: указать название APN, немного подождать, запустить пакетный драйвер QMI (или как он там правильно называется). То есть софтинку, которая разбирает-собирает поток данных и контрольный канал. С этого момента всё должно заработать. Если не взлетит, то вдумчиво раскуривать мануалы по модему, искать там диагностические AT-команды и пытаться разобраться что же пошло не так. После опускания интерфейса останавливаем QMI-драйвер.
Вроде бы на этом можно и успокоиться. Но я же ж извращенец, мне этого мало. Я хочу не просто подключить модем к серваку, а стать владычицей морскою "закинуть" его вовнутрь QEMU/KVM-виртуалки. В принципе, можно потанцевать с бубном и попробовать сделать это "прям щас". Но мой модем помимо режима QMI умеет ещё Direct IP, при котором не надо запускать никакого QMI-драйвера. Поэтому я пошёл дальше.
Сперва попросил уважаемого rustedowl разобраться как именно переключить модем в другой режим. Сложность там в том, что у данного устройства есть два разных набора AT-команд. Один лоховский универсальный, который является стандартным для любых UMTS-устройств. А второй - пацанский расширенный, для того чтобы можно было трогать модем за яйца крутить всякие хитрые инженерные параметры. Спустя какое-то время поспели вот такие заклинания:
Где набор символов "A710" является... паролем. Дабы всякие ничтоже сумнящиеся не совали свои шаловливые ручки куда не просят. И что сцуко характерно, энтот пароль в официальной документации к хитропопому прибору напрочь отсутствует. Он был найден на бескрайних просторах интернета и подходит к большинству модемов от данного производителя (Sierra Wireless). Параметр второй команды - собственно режим. "68A2" - это QMI, "68A3" - Direct IP. Данные значения актуальны только для данной модели (MC7710). Но в любом случае будет очень кстати лишний раз свериться с документацией чтобы не напортачить, поскольку операция смены PID является весьма щекотливой и может привести к самым разным последствиям. Третья команда перезагружает мопед.
После перезагрузки супостат перекрашивается яки киллер из GTA2. Он теперь в lsusb виден как "Bus 004 Device 003: ID 1199:68a3 Sierra Wireless, Inc. MC8700 Modem". Обратите внимание, что поменялся ID оборудования и даже название модели. Раньше он представлялся как MC7710, а теперь внезапно стал MC8700. И драйвер теперь к нему подключился другой:
Также увеличилось количество псевдотерминалов ажно до пяти штук. И несколько изменился набор допустимых AT-команд.
Дальше всё "как обычно". Находим среди этой пачки "телетайпов" контрольный канал, фиксируем его udev-ом. Точно так же, как и в предыдущем случае, указываем точку доступа ("AT+CGDCONT=1,"IP","yota.ru""). А вот процесс "дозвона" намного проще: "at!scact=1,1". Где последняя циферка является номером профиля, указанного в "CGDCONT". То есть, внутри модема можно создать несколько разных профилей с разными точками доступа и переключаться между ними. Теоретически это может пригодиться если нужно время от времени использовать то "честный" IP от оператора, то "серый", которые раздаются разными APN. Практически я не знаю случаев, когда такое может реально понадобиться.
Проверить, что "всё хорошо" можно командой "at!scpaddr=1", где цифра означает номер пресловутого "профиля". В ответ модем должен откликнуться полученным от оператора IP-адресом.
Но самой главной "плюшкой" режима Direct IP является то, что конкретно Sierr-овские модемы можно настроить на "автодозвон". Для этого нужно установить профиль по умолчанию: "at!scdftprof=1" и включить автодозвон в этом профиле: "at!scprof=1,"",1,0,0,0". Теперь после перезагрузки сервера либо отключения-включения питания модема он будет устанавливать линк автоматически. Аллилуйя!
IP-шник на системный интерфейс прилетает как обычно, по DHCP. Однако wwan0 - это всё-таки не ethernet. Попытки объединить его в bridge с другими системными интерфейсами ("brctl addif br0 wwan0") не увенчались успехом. Для того, чтобы получить беспроводной LTE-линк с честным IP-адресом внутри виртуальной машины, пришлось ещё немного поизгаляться. Как - напишу в третьей части, если когда-нибудь дойдут руки.
Какой вывод можно сделать из вышеописанных половых сношений с модемом умозаключений? Sierra Wireless делает вполне годные железки, которые довольно неплохо поддерживаются Linux-ом. Даже таким консервативным, как Debian. Собратьям по несчастью разуму могу порекомендовать брать устройства, которые понимает драйвер "sierra_net", ибо при прочих равных секса с ними будет меньше. К сожалению, таковых не так уж и много. Пока что их можно пересчитать по пальцам одной руки. Если кто будет выбирать, вот вам их VID-PID: "0f3d:68a3", "0f3d:68aa", "1199:68a3", "1199:68aa". Однако имейте в виду, что VID-PID также зависит и от режима работы и может изменяться в результате переключения последнего.