Подводные камни¶
Неочевидные вещи, на которые реально натыкались при работе со Станцией Лайт.
Файловая система¶
/только для чтения. Правки:mount -o remount,rw /→ правка →sync→mount -o remount,ro /.- Без
syncправки теряются. UBIFS держит записи в памяти; при зависании или выдёргивании питания только что записанный файл может исчезнуть целиком. После любых важных правок —sync. syncможет зависнуть, если в ядре застрял упавшийmount(например, после oops драйвера ФС). Тогда сбрасывайте конкретные файлы черезfsyncи перезагружайтесь по питанию.
BusyBox¶
- нет
timeout; awkбез математики (exp,log→ «Math support is not compiled in»);tarбез-z(используйтеgunzip -c | tar -x);test -wговорит «можно писать» даже на read-only разделе — проверяйте режим монтирования в/proc/mounts;syncне принимает аргументы;- урезанный
lsusb(только ID без названий) — полноценный ставитсяyse install usbutils.
Звук (ALSA)¶
- Работающие плееры не видят правки
/etc/asound.conf. alsa-lib перечитывает конфиг, только если изменился главный/usr/share/alsa/alsa.conf, аasound.confподключается из него хуком. После правки:touch /usr/share/alsa/alsa.conf. softvolсоздаёт регулятор на карте своего выхода. Если выход — неcard0, появится второйMaster, и кнопки громкости перестанут работать. Указывайтеcard 0вcontrol { }.
Автозапуск и hotplug¶
mdev -dчитает/etc/mdev.confодин раз при старте: новые правила работают после перезапускаmdevили перезагрузки. Шаблон сравнивается сDEVNAMEцеликом, напримерsnd/controlC1./sbin/hotplugнет — события обрабатывает только демонmdev.
Отладка падений¶
- Причина последней перезагрузки:
cat /sys/class/aml_info/reboot_reason. pstoreочищается при обычной загрузке (S98pstore-clear) — лог ядра ловите вживую:ssh … 'cat /proc/kmsg'.- Логи демонов:
/data/quasar/daemons_logs/(maind.log,mediad.log,yiod.log…).
Память и ядро¶
devmem(mmap/dev/mem) работает, аread()из/dev/memвозвращает 0 байт./dev/kmemне читает образ ядра.- Модули ядра: подпись (vermagic) у Яндекса —
4.9.y, хотяuname -r=4.9.68. Но даже с правильной подписью модули из чистых исходников опасны:struct task_structу Яндекса другая. Подробности — USB Host → модули.
Сеть¶
- В
quasar.cfgесть сторож Wi-Fi (wifiReseter) и проверка связиgenerate_204. - Есть запасные адреса DNS (
DnsFallbackMap) — см. Сеть.
Свой mDNS (avahi) рядом с maind¶
Порт udp 5353 занимает сам maind --platformd: он объявляет колонку в сети как
yandexmicro-<серийный номер>.local (на Лайт; префикс зависит от модели) вместе с обратной
записью для её IP. Если запустить avahi (из Entware — для AirPrint, AirPlay и т. п.) с его
настройками по умолчанию, он тоже публикует адрес колонки, видит конфликт этой обратной
записи и без конца перебирает имена: в логе Host name conflict, retrying with <имя>-2, -3…,
а сервисы то появляются в сети, то пропадают. Другое имя хоста не помогает — конфликтует
именно запись для IP.
Решение — не публиковать адреса и взять имя, которое уже объявляет maind; тогда записи
сервисов avahi указывают на хост, который maind и так разрешает. В
/opt/etc/avahi/avahi-daemon.conf:
[server]
host-name=yandexmicro-XXXXXXXX # имя из avahi-resolve, без .local
use-ipv6=no
[publish]
publish-addresses=no
publish-hinfo=no
Имя узнайте после первого запуска avahi уже с publish-addresses=no:
avahi-resolve -a <IP колонки> (серийный номер в имени не публикуйте).
Проверено на Станции Лайт; то же наблюдали на Станции 2
(#15).
TLS: пиннинга сертификатов нет¶
Удобно для перевода колонки на свой сервер — не нужно возиться с CA и самоподписанными сертификатами:
- HTTP-клиент на
libcurlвыбирает протокол (HTTP/HTTPS) по схеме из URL; - WebSocket-клиент на
websocketppсобран с двумя бэкендами —asio_client(чистый TCP) иasio_tls_client(TLS); схема (ws:///wss://) выбирается по URI.
Поэтому в quasar.cfg можно прописать незашифрованные адреса — backendUrl: http://…,
uniProxyUrl: ws://… — и колонка пойдёт по ним без проверки сертификата. Это основа подмены
бэкенда и uniproxy на свой сервер.