Перейти к содержанию

Подводные камни

Неочевидные вещи, на которые реально натыкались при работе со Станцией Лайт.

Файловая система

  • / только для чтения. Правки: 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 на свой сервер.