Страницы

Показаны сообщения с ярлыком Fedora. Показать все сообщения
Показаны сообщения с ярлыком Fedora. Показать все сообщения

четверг, 16 ноября 2023 г.

Настройка и использование 4G LTE модема Quectel EC25 на микросервере в режиме MBIM mode

Для подключения микросервера к сети Интернет по протоколу IPv6 можно воспользоваться особенностями подключения сотового провайдера MTS, выдающего клиентскому устройству (модему) динамические глобально доступные IPv6-адреса.

Клиентское устройство - модем Quectel EC25, в форме Mini-PCIe, подключенное через USB-mini-PCIe адаптер Kroks-Cse PCI. При подключении к микросерверу, создаёт символьное устройство /dev/cdc-wdm0 и 4 устройства /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2, /dev/ttyUSB3.

Выкопировка из вывода команды dmesg: 

[   25.713111] usbcore: registered new interface driver usbserial_generic
[   25.713136] usbserial: USB Serial support registered for generic
[   26.165617] usbcore: registered new interface driver cdc_wdm
[   26.175326] usbcore: registered new interface driver cdc_ether
[   26.184329] usbcore: registered new interface driver qmi_wwan
[   26.189100] usbcore: registered new interface driver cdc_ncm
[   26.225016] cdc_mbim 1-2:1.4: cdc-wdm0: USB WDM device
[   26.225389] cdc_mbim 1-2:1.4 wwan0: register 'cdc_mbim' at usb-0000:00:12.2-2, CDC MBIM, f1:f2:f3:f4:f5:f6
[   26.225540] usbcore: registered new interface driver cdc_mbim
[   26.282997] usbcore: registered new interface driver option
[   26.283023] usbserial: USB Serial support registered for GSM modem (1-port)
[   26.283123] option 1-2:1.0: GSM modem (1-port) converter detected
[   26.284695] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB0
[   26.284793] option 1-2:1.1: GSM modem (1-port) converter detected
[   26.284924] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB1
[   26.284987] option 1-2:1.2: GSM modem (1-port) converter detected
[   26.285092] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB2
[   26.285151] option 1-2:1.3: GSM modem (1-port) converter detected
[   26.285236] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB3

 

Драйвер (модуль ядра) cdc_mbim поддерживает USB устройства соответствующие спецификации “Universal Serial Bus Communications Class Subclass Specification for Mobile Broadband Interface Model”. Модем видимо был ранее сконфигурирован в режиме MBIM.

 

Выкопировка из вывода команды lsusb:

Bus 001 Device 002: ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 LTE modem


Также создаётся сетевой интерфейс с именем wwan0, не сконфигурированный.

Выкопировка из вывода команды ip addr:

3: wwan0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000

Как пишется в ряде руководств - дальнейшее конфигурирование выполняется с помощью программ пользовательского окружения mbimcli, mbim-network.

Для их установки в систему микросервера, а это в моменте - Ubuntu 22.04 LTS на ядре linux 5.15.0-88-generic, выполняется установка следующего пакета - libmbim-utils.

apt-get install libmbim-utils


Конфигурирование настроек провайдера

Для команды mbim-network нужно создать и заполнить файл /etc/mbim-network.conf. В данном случае, для сотового провайдера MTS.

root@microserver:/# cat /etc/mbim-network.conf
APN=internet.mts.ru
APN_USER=mts
APN_PASS=mts
APN_AUTH=mschapv2
PROXY=yes


PROXY - чем-то важен, без него модем странно реагирует на команды.


Проверка первого подключения

Для начала, выполнив команду mbimcli --help-all, показывающую все доступные опции, можно растеряться, т.к. непонятно, в какой последовательности их надо выполнять. Эту головную боль снимает скрипт-команда mbim-network.

Для начала посмотрим что выдаёт команда --query-device-caps

--query-device-caps. Опция -p важна! (--device-open-proxy).

root@microserver:/home/macibuki# mbimcli --device /dev/cdc-wdm0 --device-open-proxy --query-device-caps

или

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-device-caps
[/dev/cdc-wdm0] Device capabilities retrieved:
          Device type: 'remote'
       Cellular class: 'gsm'
          Voice class: 'no-voice'
            SIM class: 'removable'
           Data class: 'gprs, edge, umts, hsdpa, hsupa, lte'
             SMS caps: 'pdu-receive, pdu-send'
            Ctrl caps: 'reg-manual'
         Max sessions: '8'
    Custom data class: 'unknown'
            Device ID: '0000'
        Firmware info: 'EC25ECGAR06A09M1G'
        Hardware info: 'QUECTEL Mobile Broadband Modul'

 

Device ID - содержит чувствительную информацию и не приводится.

Что выдаёт команда --query-subscriber-ready-status.

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-subscriber-ready-status
[/dev/cdc-wdm0] Subscriber ready status retrieved:
          Ready state: 'initialized'
        Subscriber ID: '000000000000000'
            SIM ICCID: '00000000000000000000'
           Ready info: 'none'
    Telephone numbers: (1) '+79100000000'


Вывод команды содержит чувствительную информацию по SIM-карте, абоненту, номеру телефона.


Важная проверка состояния радио, перед запуском mbim-network - команда --query-radio-state

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-radio-state
[/dev/cdc-wdm0] Radio state retrieved:
         Hardware radio state: 'on'
         Software radio state: 'off'


Так и есть, обычно "Software radio state: Off" и тогда надо включить радио командой --set-radio-state=on

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --set-radio-state=on
[/dev/cdc-wdm0] Radio state retrieved:
         Hardware radio state: 'on'
         Software radio state: 'on'


Проверка состояния PIN-кода:

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p   --query-pin-state
[/dev/cdc-wdm0] PIN info:
             PIN state: 'unlocked'

Если PIN-код в состоянии 'locked', то его можно ввести командой --enter-pin, отключить ввод PIN-кода командой --disable-pin (придётся ввести один раз).


Также можно посмотреть выводы команды --query-registration-state (состояние регистрации), --query-signal-state (состояние сигнала).

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-registration-state
[/dev/cdc-wdm0] Registration status:
             Network error: 'none'
            Register state: 'home'
             Register mode: 'automatic'
    Available data classes: 'lte'
    Current cellular class: 'gsm'
               Provider ID: '25001'
             Provider name: 'MTS RUS'
              Roaming text: 'unknown'
        Registration flags: 'packet-service-automatic-attach'
root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-visible-providers
error: operation failed: Busy
root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-signal-state
[/dev/cdc-wdm0] Signal state:
              RSSI [0-31,99]: '11'
         Error rate [0-7,99]: '99'
    Signal strength interval: '5'
              RSSI threshold: '2'
        Error rate threshold: 'unspecified'
root@microserver:/#


Можно посмотреть состояние соединения (приведёно рабочее состояние):

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p  --query-connection-state
[/dev/cdc-wdm0] Connection status:
          Session ID: '0'
    Activation state: 'activated'
    Voice call state: 'none'
             IP type: 'ipv4v6'
        Context type: 'internet'
       Network error: 'none'

(не рабочее состояние):

[/dev/cdc-wdm0] Connection status:
          Session ID: '0'
    Activation state: 'deactivated'
    Voice call state: 'none'
             IP type: 'default'
        Context type: 'none'
       Network error: 'none'


Итак, пришло время запустить соединение командой mbim-network, если выводы команд ориентировочно похожи  на примеры в этой статье.

mbim-network /dev/cdc-wdm0 start

...

Если устройство определилось в системе, если включено радио, то по идее должно работать.

Посмотрим, для начала рабочее состояние, каким оно должно быть:

root@microserver:/# mbim-network /dev/cdc-wdm0 status
Loading profile at /etc/mbim-network.conf...
    APN: internet.mts.ru
    APN auth protocol: mschapv2
    APN user: mts
    APN password: mts
    mbim-proxy: yes
Getting status with 'mbimcli -d /dev/cdc-wdm0 --query-connection-state --device-open-proxy'...
Status: activated

 

Однако, если посмотреть ip addr, то можно продолжить смотреть на не настроенный интерфейс wwan0.

Присвоение IP-адресов сетевому интерфейсу wwan0

Важная особенность состоит в том, что даже получив работающее (activated) состояние на предыдущем этапе, надо получить у провайдера ip-адреса и настроить интерфейс wwan0 вручную или с помощью какого-либо скрипта.

Для соединений такого типа (mbim) не работает стандартный клиент dhcp - dhclient и ip-адреса получаются специфической командой --query-ip-configuration, которая выводит их просто в консоль, в текстовом виде, после чего их можно использовать для ручного конфигурирования командой ip.

root@microserver:/# mbimcli -d /dev/cdc-wdm0 -p --query-ip-configuration

[/dev/cdc-wdm0] IPv4 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '10.191.000.00/30'
    Gateway: '10.191.000.01'
    DNS [0]: '213.87.142.84'
    DNS [1]: '213.87.142.85'
        MTU: '1500'

[/dev/cdc-wdm0] IPv6 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '2a00:1fa0:000:0000:0000:0000:0000:0002/64'
    Gateway: '2a00:1fa0:000:000:0000:000:0000:0001'
    DNS [0]: '2a00:1fa0:3e00::1'
    DNS [1]: '2a00:1fa0:7e00::1'
        MTU: '1500'

Странно то, что при каждом запросе --query-ip-configuration возвращает новые адреса, особенно ipv6. Это не позволяет проверить текущую ip конфигурацию модема, что может привести и приводит к неработоспособности сети. Т.е. нельзя после установки соединения выполнять команду  --query-ip-configuration, т.к. модем будет иметь одну настройку ip, а интерфейс wwan0 другую, отличающуюся, старую.

Присвоение IPv4-адреса

Обычно, скрипт делает очистку адресов на конфигурируемом интерфейсе, перед новым присвоением.

root@microserver:/# ip addr flush dev wwan0

Взяв в строке IP [0]: адрес  с маской, выполним команду ip addr add ... и присвоим полученный ipv4-адрес интерфейсу wwan0.

root@microserver:/# ip addr add 10.191.000.02/30 dev wwan0 broadcast +


Присвоение IPv6-адреса

root@microserver:/# ip addr add 2a00:1fa0:000:0000:0000:0000:0000:0002/64 dev wwan0



Настройка маршрута по-умолчанию через шлюз (gateway), для сетевого интерфейса wwan0

Так как микросервер уже имеет маршрут по-умолчанию настроенный через сетевой интерфейс enp2s0, то надо удалить старый маршрут по-умолчанию (default) и добавить новый, но уже через сетевой интерфейс wwan0.

Вывод команды ip route до настройки нового маршрута:

root@microserver:/# ip route
default via 192.168.88.1 dev enp2s0
default via 192.168.88.1 dev enp2s0 proto dhcp src 192.168.88.3 metric 1024
192.168.88.0/24 dev enp2s0 proto kernel scope link src 192.168.88.3 metric 1024
192.168.88.1 dev enp2s0 proto dhcp scope link src 192.168.88.3 metric 1024

Удаление старого маршрута (можно удалить 2 раза):

root@microserver:/# ip route del default via 192.168.88.1 dev enp2s0


Добавление нового маршрута по-умолчанию:

root@microserver:/# ip route add default via 10.191.000.01 dev wwan0

 

root@microserver:/# ip route
default via 10.191.000.01 dev wwan0
10.191.000.02/30 dev wwan0 proto kernel scope link src 10.191.000.02
192.168.88.0/24 dev enp2s0 proto kernel scope link src 192.168.88.3 metric 1024
192.168.88.1 dev enp2s0 proto dhcp scope link src 192.168.88.3 metric 1024 

 

Настройка разрешения доменных имён с помощью команды resolvectl

Кое-что забыли, а именно добавить к интерфейсу wwan0 адреса DNS-серверов провайдера или иных публично открытых DNS-серверов.

Делается это с помощью команды resolvectl, которая входит в systemd-resolved.

Первоначальный запуск resolvectl показывает, что определение имён привязано к интерфейсу  enp2s0, а для wwan0 не настроено.

root@microserver:/# resolvectl status
Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: foreign
      DNS Domain: home

Link 2 (enp2s0)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.88.1
       DNS Servers: 192.168.88.1
        DNS Domain: home

Link 3 (wwan0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported

Добавим адрес DNS-сервера провайдера к интерфейс wwan0:

root@microserver:/# resolvectl dns wwan0 213.87.142.84

Что изменилось?

root@microserver:/# resolvectl status wwan0
Link 3 (wwan0)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 213.87.142.84

 

Запросы на разрешение имён продолжают идти через интерфейс  enp2s0, т.к. он тоже помечен как +DefaultRoute.

root@microserver:/# resolvectl query google.com
google.com: 2a00:1450:4010:c02::8a             -- link: enp2s0
            2a00:1450:4010:c02::8b             -- link: enp2s0
            2a00:1450:4010:c02::64             -- link: enp2s0
            2a00:1450:4010:c02::66             -- link: enp2s0
            74.125.205.139                     -- link: enp2s0
            74.125.205.113                     -- link: enp2s0
            74.125.205.101                     -- link: enp2s0
            74.125.205.100                     -- link: enp2s0
            74.125.205.138                     -- link: enp2s0
            74.125.205.102                     -- link: enp2s0

-- Information acquired via protocol DNS in 26.2ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

Отключаем у интерфейса enp2s0 опцию default-route (относящуюся именно к запросам DNS по-умолчанию).


root@microserver:/# resolvectl default-route enp2s0 no

Что изменилось?


root@microserver:/# resolvectl query google.com
google.com: 2a00:1450:4010:c02::8b             -- link: wwan0
            2a00:1450:4010:c02::66             -- link: wwan0
            2a00:1450:4010:c02::64             -- link: wwan0
            2a00:1450:4010:c02::8a             -- link: wwan0
            108.177.14.139                     -- link: wwan0
            108.177.14.101                     -- link: wwan0
            108.177.14.102                     -- link: wwan0
            108.177.14.138                     -- link: wwan0
            108.177.14.113                     -- link: wwan0
            108.177.14.100                     -- link: wwan0

-- Information acquired via protocol DNS in 173.8ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

Запросы на разрешение имён стали просачиватся через интерфейс  wwan0.

Если повторно запросить разрешение имени google.com, то запрос возвратит ответ из dns-cache, об этом скажет строка "Data from: cache".  Кэш отключается опцией --cache=no.

Кэш всех dns-записей очищается командой - resolvectl flush-caches.

Есть полезная команда revert, чтобы восстановить настройки интерфейса enp2s0 (встроенная сетевая карта ethernet), после всех внесённых изменений скрипта или пользователя.

root@microserver:/# resolvectl revert enp2s0


Автоматизация настройки с помощью модифицированного скрипта mbim-set-ip

Скрипт mbim-set-ip содержит настройку dns с помощью команды systemd-resolve, которая не присутствует в поставке Ubuntu 22.04 LTS, поэтому настройка заменена на resolvectl, который присуствует как в Ubuntu 22.04 LTS так и Fedora 39.

Скрипт скачан с репозитория: https://github.com/elementzonline/GSMModem/tree/master/SIM7600/mbim-set-ip

Закоментировать (#) строки с systemd-resolve в скрипте mbim-set-ip:

# printf "systemd-resolve -4 --interface=$DEV --set-dns=%s\n" "${ipv4_dns[@]}" >>$execfile

и заменить их на resolvectl:

printf "resolvectl dns $DEV %s\n" "${ipv4_dns[@]}" >>$execfile

И для ipv6:

# printf "systemd-resolve -6 --interface=$DEV --set-dns=%s\n" "${ipv6_dns[@]}" >>$execfile

printf "resolvectl dns $DEV %s\n" "${ipv6_dns[@]}" >>$execfile

Скрипт mbim-set-ip не делает за администратора работу по настройки сетевого окружения при наличии нескольких интерфейсов. Идея заложенная в скрипт mbim-set-ip предполагает, что LTE-модем является единственным выходом в Интернет.

В приципе, для своих целей и своего микросервера, скрипт mbim-set-ip можно упростить.

Автоматизация подключения с помощью собственного скрипта systemd

Цель - получить управление модемным подключением посредством systemd, т.к. на микросервере только консольный текстовый режим.

Интерфейс пользователя (администратора) будет содержать несколько стандартных команд (enable, start, status, stop, restart, disable).

systemctl enable modem4.service

systemctl start modem4.service

systemctl status modem4.service

systemctl stop modem4.service

systemctl restart modem4.service

systemctl disable modem4.service

enable, disable - включает подключение таким образом, что при нормальной загрузке устанавливается подключение к IPv6-сети.

start,stop - позволяет управлять состоянием подключения, при наличии ещё одного подключения к микросерверу.

status -  отображает состояние подключения, в том числе ip-адреса и прочее.

Согласно Filesystem Hierarchy Standard (FHS), администратор может расположить свои собственные скрипты (modem4.sh) и команды как в домашней директории, так и в общей системе, например /opt, настройки в /etc/opt и т.п.

Файл описания сервиса modem4.service разумно расположить в /etc/systemd/system

При выполнении команды enable - скрипт modem4 должен проверить наличие установленных утилит mbimcli и библиотек, проверить наличие в системе модема, по его PID-VID, возможно по серийному номеру, наличие символьного устройства (/dev/cdc-wdm0) и т.п.

Проверка наличия установленной поддержки MBIM:

root@microserver:/# apt list libmbim*
Вывод списка… Готово
libmbim-glib-dev/jammy-updates 1.28.0-1~ubuntu20.04.1 amd64
libmbim-glib-dev/jammy-updates 1.28.0-1~ubuntu20.04.1 i386
libmbim-glib-doc/jammy-updates,jammy-updates 1.28.0-1~ubuntu20.04.1 all
libmbim-glib4/jammy-updates,now 1.28.0-1~ubuntu20.04.1 amd64 [установлен, автоматически]
libmbim-glib4/jammy-updates 1.28.0-1~ubuntu20.04.1 i386
libmbim-proxy/jammy-updates,now 1.28.0-1~ubuntu20.04.1 amd64 [установлен, автоматически]
libmbim-proxy/jammy-updates 1.28.0-1~ubuntu20.04.1 i386
libmbim-utils/jammy-updates,now 1.28.0-1~ubuntu20.04.1 amd64 [установлен]
libmbim-utils/jammy-updates 1.28.0-1~ubuntu20.04.1 i386

 

Проверка наличия установленной поддержки QMI (Qualcomm MSM Interface):

root@microserver:/# apt-cache search libqmi
libqmi-glib5 - библиотека работы с протоколом Qualcomm MSM Interface (QMI)
libqmi-proxy - прокси для работы с QMI-портами
gir1.2-qmi-1.0 - GObject introspection data for libqmi-glib
libqmi-glib-dev - Header files for adding QMI support to applications that use glib
libqmi-glib-doc - API documentation for libqmi-glib
libqmi-utils - Utilities to use the QMI protocol from the command line

 

root@microserver:/# apt list libqmi*
Вывод списка… Готово
libqmi-glib-dev/jammy-updates 1.32.0-1ubuntu0.22.04.1 amd64
libqmi-glib-dev/jammy-updates 1.32.0-1ubuntu0.22.04.1 i386
libqmi-glib-doc/jammy-updates,jammy-updates 1.32.0-1ubuntu0.22.04.1 all
libqmi-glib5/jammy-updates 1.32.0-1ubuntu0.22.04.1 amd64
libqmi-glib5/jammy-updates 1.32.0-1ubuntu0.22.04.1 i386
libqmi-proxy/jammy-updates 1.32.0-1ubuntu0.22.04.1 amd64
libqmi-proxy/jammy-updates 1.32.0-1ubuntu0.22.04.1 i386
libqmi-utils/jammy-updates 1.32.0-1ubuntu0.22.04.1 amd64
libqmi-utils/jammy-updates 1.32.0-1ubuntu0.22.04.1 i386


Проверка наличия подключения модема конкретного типа, такого как Quectel EC25:

root@microserver:/# lsusb | grep "ID 2c7c:0125"
Bus 001 Device 002: ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 LTE modem

root@microserver:/# lsusb -d 2c7c:0125
Bus 001 Device 002: ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 LTE modem

root@microserver:/# echo $?

lsusb -d 2c7c:0125 возвращает 0 при наличии устройства с VID=2c7c и PID = 0125 и 1 при отсутствии указанного устройства.

 

Проверка наличия символьного устройства (/dev/cdc-wdm0) из командной строки:

root@microserver:/# if [ -c "/dev/cdc-wdm0" ]; then echo "True"; else echo "False"; fi

True

Проверка драйвера привязанного к символьному устройству /dev/cdc-wdm0:

cdc_mbim - драйвер (модуль ядра) поддерживающий протокол MBIM (Mobile Broadband Interface Model) для сотового модема.

qmi_wwan - драйвер (модуль ядра) поддерживающий протокол QMI (Qualcomm MSM interface) для сотового модема.

root@microserver:/# basename $(realpath /sys/class/usbmisc/cdc-wdm0/device/driver)
cdc_mbim

В данном случае, MBIM режим сотового модема.

Также можно подключиться в специальный порт /dev/ttyUSB2 предназначенный для AT-команд и запросить текущую конфигурацию протокола. Подразумевается, что в системе нет других устройств, захвативших /dev/ttyUSB2 и этот порт привязан к модему. Потребуется команда minicom (apt-get install minicom).

root@microserver:/# minicom -D /dev/ttyUSB2

AT
OK
AT+QCFG="usbnet"
+QCFG: "usbnet",2

OK

+QCFG: "usbnet",2 - подразумевает, что используется MBIM протокол.

+QCFG: "usbnet",1 - подразумевает, что используется ECM протокол.

+QCFG: "usbnet",0 - подразумевает, что используется QMI протокол.


Сам сервисный файл modem4.service (его надо создать в папке /etc/systemd/system) достаточно прост - всю работу делают скрипты startmodem4.sh и stopmodem4.sh

 

root@microserver:/etc/systemd/system# cat modem4.service
[Unit]
Description=LTE Module preparation and configuration
Documentation=man:microserver
After=network.target
Before=network-online.target

[Service]
Type=oneshot
ExecStart=/home/gimmor/startmodem4.sh
ExecStop=/home/gimmor/stopmodem4.sh
RemainAfterExit=yes
 

[Install]
WantedBy=network.target

Из особенностей, для того чтобы наблюдать красивый зелёный сигнал при выводе systemctl status modem4, используется опция RemainAfterExit=yes
 
startmodem4.sh - что-то такое, как например:
 
root@microserver:/home/gimmor# cat startmodem4.sh
#!/bin/bash
# сервер: microserver.local
# 16 ноября 2023 года
# startmodem4.sh - скрипт для настройки LTE модема с помощью systemd

modemdevice="/dev/cdc-wdm0"

if [ -c $modemdevice ]; then echo "Found character device..."; else echo "Not found character device..."; exit 19; fi


driver=$(realpath /sys/class/usbmisc/cdc-wdm0/device/driver)
drivertype=$(basename $driver)
if [ $drivertype == "cdc_mbim" ]; then echo "Found MBIM driver..."; else echo "Unknown driver: $drivertype"; exit 38; fi
if [ $drivertype == "qmi_wwan" ]; then echo "Found QMI driver..."; echo "QMI protocol not supported"; exit 93; fi

# check SIM card PIN state
mbimcli -d /dev/cdc-wdm0 --device-open-proxy --query-pin-state | grep "unlocked"
if [ $? == 0 ]; then echo "PIN code unlocked and no need to enter one" else echo "PIN locked and need to be provided. Aborting..."; exit 1; fi

# check PID&VID - можно пропустить такую проверку
lsusb -d 2c7c:0125
if [ $? == 0 ]; then echo "Found EC25 LTE modem..."; else echo "No modem..."; exit 19; fi

mbimcli -d /dev/cdc-wdm0 -p --set-radio-state=on
echo "LTE modem radio is on"
mbim-network /dev/cdc-wdm0 start
echo "Setting ip configuration ..."
/home/gimmor/mbim-set-ip /dev/cdc-wdm0 wwan0

# Configure DNS resover
resolvectl default-route enp2s0 no
resolvectl default-route wwan0 yes
echo "DNS resolver configured."
echo "LTE modem configured."

stopmodem4.sh - скрипт для остановки подключения через LTE модем.

root@microserver:/home/gimmor# cat stopmodem4.sh
#!/bin/bash

echo "Stopping LTE modem..."
mbim-network /dev/cdc-wdm0 stop
echo "Disabling radio modem off..."
mbimcli -d /dev/cdc-wdm0 -p --set-radio-state=off

ip addr flush dev wwan0
resolvectl revert wwan0
echo "LTE modem stopped"

 

Для удобства последующего использования, можно настроить (по-аналогии) подключение своего телефона к микросерверу, для последующего оперативного выхода в сеть Интернет, простым подключением в usb-порт.



суббота, 12 мая 2018 г.

Fedora Server 28. OpenVPN FAILURE. Отказ запуска через systemd

При настройке туннелей на VPS сервере Fedora Server 28, я столкнулся с неявными особенностями конфигурации.

1. Конфигурационный файл /etc/openvpn/server/server.conf


Ошибка вида:
systemd[1]: Failed to start OpenVPN service for server ...

Подготовленный конфигурационный файл надо сохранять в папку /etc/openvpn/server, под именем server.conf.
Это обеспечивает управление запуском и остановкой сервера OpenVPN посредством команды systemctl.

# systemctl enable openvpn-server@server.service
# systemctl start openvpn-server@server.service
# systemctl status openvpn-server@server.service

Все остальные трудности - это в конкретной конфигурации.

Примечание: В Ubuntu 18.04 LTS server - другое место конфигурационного файла - /etc/openvpn/server.conf

2. Для открытия доступа к VPN надо настроить Firewall


Просмотр некоторых сведений о Firewall.

# firewall-cmd --list-services | grep openvpn
# firewall-cmd --get-default-zone

Добавить службу openvpn в зону по умолчанию. На сервере, зоной по умолчанию является "FedoraServer"

# firewall-cmd --add-service=openvpn


Добавить возможность принимать openvpn-подключения по протоколу tcp, на стандартном порту 1194.

# firewall-cmd --permanent --service=openvpn --add-port 1194/tcp




Добавить возможность NAT
 
# firewall-cmd --permanent --add-masquerade
 
# firewall-cmd --reload

※※※

четверг, 10 мая 2018 г.

Fedora Workstation 28 systemd control. Под капотом операционки


Fedora Workstation уже давно использует систему инициализации Systemd. Это удобно, позволяет иметь единую входную точку управления - systemctl. Единый формат конфигурационных файлов (units).


Утилиты: systemctl, networkctl, journalctl

Конфигурация: /etc/systemd
Конфигурация сети: /etc/systemd/network


$ systemctl status

red
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 2018-05-10 20:43:56 MSK; 2h 59min left

Зелёное пятнышко слева свидетельствует что все запущенные модули (systemd units) работают и не выходят с кодом ошибки.

red
    State: running
     Jobs: 0 queued
   Failed: 3 units
    Since: Thu 2018-05-10 20:43:56 MSK; 2h 59min left

Красное пятнышко слева свидетельствует, что у некоторых запущенных модулей произошли ошибки и требуется их исправить, чтобы опять всё зазеленело.
Failed - сообщает о количестве сломанного.


У меня, возникло красное пятнышко и я полез смотреть, что не так. Оказалось, что проблема с сервисом журналирования , проблема с аппаратным генератором случайных чисел (в AMD-процессоре отсутствует) и ещё с одним.

Чтобы посмотреть состояние конкретного сломанного модуля используется команда systemctl status конкретный.service

$ systemctl status abrt-xorg.service

  abrt-xorg.service - ABRT Xorg log watcher
   Loaded: loaded (/usr/lib/systemd/system/abrt-xorg.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-05-10 17:43:58 MSK; 25min ago
 Main PID: 903 (abrt-dump-journ)
    Tasks: 1 (limit: 4915)
   Memory: 5.5M
   CGroup: /system.slice/abrt-xorg.service
           └─903 /usr/bin/abrt-dump-journal-xorg -fxtD

мая 10 17:43:58 red systemd[1]: Started ABRT Xorg log watcher.


Сейчас он уже исправлен, светит зелёным глазом, а светил красным и в его последних строчках лога был код выхода (EXIT CODE).
Из которых я и узнал, что проблема кроется в журналах.

Проверку системных журналов, выполнил:



$ journalctl --verify

Было показано много красных строчек из которых я понял, что надо почистить накопившиеся журналы.

С журналами, накопившимися за приличное время, я поступил так - посмотрел занимаемый объём (--disk-usage) очистил и ограничил их размер по времени 30 днями.

$ journalctl --disk-usage
Archived and active journals take up 40.0M in the file system.

$ sudo journalctl --vacuum-time=30days

Vacuuming done, freed 0B of archived journals from /var/log/journal/393e16c51f6....

После этого, перезапустил первый сервис, который падал из-за ошибок в журналах.

$ sudo systemctl restart abrt-xorg.service
$ systemctl status abrt-xorg.service

  abrt-xorg.service - ABRT Xorg log watcher
   Loaded: loaded (/usr/lib/systemd/system/abrt-xorg.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-05-10 17:43:58 MSK; 25min ago
 Main PID: 903 (abrt-dump-journ)
    Tasks: 1 (limit: 4915)
   Memory: 5.5M
   CGroup: /system.slice/abrt-xorg.service
           └─903 /usr/bin/abrt-dump-journal-xorg -fxtD

Приступил затем к следующим сервисам - я их отключил, т.к. из-за аппаратуры, они не пригодны.

$ sudo systemctl disable конкретный.service


※※※

среда, 2 мая 2018 г.

Fedora Workstation 27->28 upgrade fail. Сбой обновления

Ну что же, сегодня день был странный. Начал обновление операционной системы Fedora Workstation, с прежней 27-ой версии, на только что вышедшую 28-ю версию.
И как назло - сбой. После перезагрузки не смог попасть в рабочий стол.
Ладно, надо разбиратся, полез в консоль, после кнопки ресет.

Для загрузки в консоль надо установить runlevel 3, в параметрах загрузки GRUB2.


Обычно указывается в строке linux ...., в конце просто числом 3.

Загрузился в консоль. Вошёл. Нет нормального русского языка. Отображаются квадратики. Ладно. Это видимо вечная проблема. Пропустим.


1. Удаляю группу пакетов GNOME desktop environment.

$ sudo -s
# dnf group remove "GNOME desktop environment"

2. Перемещаю (переименовывая) папки конфигурации .local  и .config в домашней папке пользователя. Сохраняю, так как там все настройки всяких программ. Потом отдельно с каждой разберусь. Если несколько пользователей, соответственно несколько повторов пункта 2.

# mv -r /home/user/.local  /home/user/.local-old
# mv -r /home/user/.config /home/user/.config-old

# reboot

Любители экспериментов, могут попробывать без удаления настроек, но я не стал.

3. Также, после удаления среды GNOME (пункт 2) вход в консольный многопользователский режим с поддержкой сети (runlevel 3).

4. В принципе, после удаления, можно устанавливать. Требуется подключение к интернет-сети.
Обновляю пакеты, смотрю чтобы репозитории не глючили и пр.

# dnf update --refresh



5. Устанавливаю окружение Fedora Workstation (тоже группа пакетов).

# dnf group install "Fedora Workstation"

после успешной установки пакетов - перезагрузка.
# reboot

6. Опять попадаю в консоль. Но, зайдя под пользователем - доступен запуск командой startx.

$ startx

Попадаю на рабочий стол.
Говорит спасибо, что обновились. Пожалуйста.
Осматриваю потери. Фон поменялся. 

7. Перезагружаюсь и опять попадаю в консольный режим. Но тут уже, пробую:


# systemctl enable gdm.service
 Created symlink /etc/systemd/system/display-manager.service → /usr/lib/systemd/system/gdm.service
# systemctl set-default graphical.target
# systemctl restart gdm.service 
# reboot


8. Заработало. Теперь перенос настроек программ, и по возможности их переустановка.

P.S. Много ребутов - это по старой привычке от Windows. Reboot - это святое, прочищает много настроек системы.

P.P.S. Последовательное обновление системы, с версии где-то 24 до 28. Сломалась под тяжестью настроек.

※※※
 

пятница, 6 января 2017 г.

OpenCL radeon r600g. Параллельные вычисления. Проверка возможностей APU A10-6700 в Linux Fedora 25

Процессор AMD APU A10-6700 - это гибридный процессор, содержит встроенное ядро AMD Radeon HD8670D.
Это даёт надежду, что возможности встроенного графического ядра можно будет использовать для ускорения некоторых операций и расчётов, помимо трехмерной графики и аппаратного ускорения кодирования и декодирования видеопотоков (что поломали в Fedora 25 под Wayland).

Для задействования возможностей вычисления на графическом ядре,  надо установить инструменты: компилятор OpenCL C, различные реализации спецификации OpenCL, утилиты и пр.

Надо заметить, что в данной заметки, предпринята попытка разобраться с состоянием параллельных вычислений на графическом ядре, с использование открытых технологий.

В Linux, я сейчас использую Fedora 25, из-за окружения Gnome 3.
Устанавливать Ubuntu 16.04 LTS буду в крайнем случае, если ничего не выйдет. Драйвер AMD Catalyst он ведь под Ubuntu.


Инфраструктура OpenCL


Не буду ваваться в историю OpenCL, сразу к делу. Спецификации на OpenCL различных версий можно найти в реестре "Khronos OpenCL™ Registry" [1].

Можно пойти простым путём - установить реализацию спецификации OpenCL на процессорах общего назначения [3]. Это позволит писать программы на OpenCL C, но ускорение будет слабым, за счёт команд SSE,AVX и пр.

Есть вариант, задействовать набор инструментов и драйверов от компании AMD, catalyst & amd app sdk [4]. Но это, невозможно в Fedora 25, для меня по крайней мере. Catalyst - уже старый драйвер. Как его устанавливать в новой системе неясно.
Я предпринял попытку установить OpenCL окружение в Windows 8.1. Там тоже надо устанавливать старый драйвер Catalyst, вместо Radeon Crimson.
Вообщем, поддержка весьма условная. Графика в процессоре уже старая, с точки зрения AMD. Много затруднений.

Есть вариант, на котором я остановился - попытаться задействоать открытые драйверы и библиотеки и получить многократное ускорение.


ICD - Installable Client Driver



Спецификация OpenCL определяет способ, которым  несколько устройств ускорителей могут сосуществовать в одной системе [2].

Каждый ускоритель "может реализовывать" библиотеку, соответствующую спецификации OpenCL.

Менеджер, который заведует согласованием называется : Installable Client Driver (ICD).


В репозитории Fedora 25 (64-bit) это пакет: ocl-icd.x86_64

Список установленных драйверов ускорителей можно посмотреть в :
/etc/OpenCL/vendors

в файле с расширением .icd указана ссылка на конкретную библиотеку, конретного ускорителя.


Информационные утилиты clinfo & clpeak


Для того, чтобы ориентироваться в достижении цели - установки OpenCL, прежде всего установлю полезные информационные утилиты clinfo - для отображения возможностей платформ и clpeak для легкого тестирования.

clinfo
В репозитории Fedora 25 (64-bit) это пакет: clinfo.x86_64

Если запустить clinfo на системе без поддержки OpenCL, отобразится следующее:

$ clinfo
Number of platforms   0

В системе с настроенной поддержкой OpenCL можно будет видеть
кратко:

$ clinfo -l

Platform #0: Clover
 `-- Device #0: AMD ARUBA (DRM 2.46.0 / 4.8.15-300.fc25.x86_64, LLVM 3.8.0)
Platform #1: Portable Computing Language
 `-- Device #0: pthread-AMD A10-6700 APU with Radeon(tm) HD Graphics

Как видно доступно 2 платформы, внутри каждой по одному устройству ("Device" по терминологии OpenCL).


clpeak

В репозитории Fedora 25 (64-bit) это пакет: clpeak.x86_64

Позволяет посмотреть производительность некоторых операций OpenCL

$ sudo dnf install --enablerepo=updates-testing clpeak


Portable Computing Language


Реализация спецификации OpenCL для выполнения на процессорах общего назначения, имеющих поддержку SSE/SSE2 AVX и т.п.

В репозитории Fedora 25 (64-bit) это пакет: pocl.x86_64

После установки этого пакета появляется 1 доступная opencl платформа №0, с одним opencl-устройством (процессор AMD A10-6700), с четырьмя вычислительными модулями.

$ clinfo -l
Platform #0: Portable Computing Language
 `-- Device #0: pthread-AMD A10-6700 APU with Radeon(tm) HD Graphics

$ clpeak

Platform: Portable Computing Language
  Device: pthread-AMD A10-6700 APU with Radeon(tm) HD Graphics
    Driver version  : 0.13 (Linux x64)
    Compute units   : 4
    Clock frequency : 3700 MHz

    Global memory bandwidth (GBPS)
      float   : 2.73
      float2  : 2.87
      float4  : 3.11
      float8  : 3.44
      float16 : 3.35

    Single-precision compute (GFLOPS)
      float   : 20.64
      float2  : 3.21
      float4  : 10.92
      float8  : 20.60
      float16 : 39.28

    Transfer bandwidth (GBPS)
      enqueueWriteBuffer         : 2.88
      enqueueReadBuffer          : 1.71
      enqueueMapBuffer(for read) : 173184.17
        memcpy from mapped ptr   : 1.52
      enqueueUnmap(after write)  : 244032.22
        memcpy to mapped ptr     : 1.39

    Kernel launch latency : 0.94 us


OpenCL C


OpenCL C - язык программирования "opencl-ядер". Написан в инфрастуктуре LLVM и зависит  от неё. Это подмножество C. [5].

В репозитории Fedora 25 (64-bit) это пакет: libclc.x86_64



OpenCL для встроенного в APU ядра Radeon HD8670D


Что и удивительно, данная поддержка доступна для процессора AMD APU A10-6700, можно сказать "из коробки".
Кодовое имя семейства графики: "Nothern Islands", NI
Имя графического чипа: AMD ARUBA
Драйвер ядра: radeon
Драйвер Mesa: r600g
Пишется, что почти поддерживается спецификация OpenCL1.1 [11], см. колонку "Evergreen/NI" в [7].



В репозитории Fedora 25 (64-bit) это пакет:  mesa-libOpenCL.x86_64


После установки mesa-libOpenCL.x86_64, появляется платформа Clover [8].


$ clinfo -l

Platform #0: Clover
 `-- Device #0: AMD ARUBA (DRM 2.46.0 / 4.8.15-300.fc25.x86_64, LLVM 3.8.0)
Platform #1: Portable Computing Language
 `-- Device #0: pthread-AMD A10-6700 APU with Radeon(tm) HD Graphics


$ clpeak

Clpeak вываливает исключение на GPU. Вот это уже нерадостно. Это может привести к потерям времени на поиск и устранение трудностей.

Platform: Clover
  Device: AMD ARUBA (DRM 2.46.0 / 4.8.15-300.fc25.x86_64, LLVM 3.8.0)
    Driver version  : 13.0.2 (Linux x64)
    Compute units   : 6
    Clock frequency : 0 MHz
    Build Log: input.cl:48:2009: warning: null character ignored
unsupported call to function __floatunsidf in compute_dp_v1

Тут также есть проблема со старым багом: Clock frequency : 0 MHz. см.. https://people.freedesktop.org/~agd5f/0001-drm-radeon-add-query-to-fetch-the-max-engine-clock.patch

Ну отказала одна платформа (GPU), можно отлаживаться на другой (CPU). Тут и вступает в игру унифицированность OpenCL.

PyOpenCL обёртки для OpenCL на языке Python


Python - это интерпретатор - он выполняет команды пользователя немедленно. Очень удобен для пошагового изучения неизвестной зверюшки OpenCL.

PyOpenCL - заворачивает различные части OpenCL в синтаксис привычный в языке Python. Зовётся и так: opencl pyhton bindings.


В репозитории Fedora 25 (64-bit) это пакеты: python2-pyopencl.x86_64 и python3-pyopencl.x86_64

В моей системе на команду python отозвалась версия 2.7.12,  для неё и поставил.

Когда установлено почти всё, можно начать пробовать программировать на GPU.
Не факт, что в ближайшее время, но вот пара ссылок(en) [10] & [9]:


http://www.drdobbs.com/article/print?articleId=231002854&siteSectionName=parallel
http://www.drdobbs.com/article/print?articleId=240162614&siteSectionName=open-source


Заключение


Главное достоинство OpenCL в том, что оно делает доступным обычному пользователю ускорение на графическом ядре, на его имеющемся оборудовании. Это сохраняет деньги и продлевает срок использования существующих машин.
Как и раньше, в эпоху 286, 386 процессоров, ускорение операций с плавающей точкой требовало отдельного сопроцессора, так и сейчас. :-)

 
※※※

Ресурсы


1. Khronos OpenCL™ Registry. https://www.khronos.org/registry/cl/
2. Kronos ICD implementation: https://github.com/KhronosGroup/OpenCL-ICD-Loader


3. Portable Computing Language (PoCL). http://portablecl.org/

4. Страница загрузки AMD Catalyst. http://support.amd.com/en-us/download

5. OpenCL C implementation. http://libclc.llvm.org/


6. Clpeak. https://github.com/krrishnarraj/clpeak


7. http://dri.freedesktop.org/wiki/GalliumCompute/

8. Clover. https://people.freedesktop.org/~steckdenis/clover/

9. A Gentle Introduction to OpenCL.  http://www.drdobbs.com/article/print?articleId=231002854&siteSectionName=parallel

10.  Easy OpenCL with Python. http://www.drdobbs.com/article/print?articleId=240162614&siteSectionName=open-source

11. OpenCL 1.1 specification. https://www.khronos.org/registry/cl/specs/opencl-1.1.pdf

※※※