Получение ID контроллера при обновлении прошивки

Добрый вечер!
Как получить ID контроллера (cat /proc/sys/kernel/hostname) из скрипта install_update.sh при обновлении прошивки?

Оно же получается в usr/lib/wb-utils/prepare/wb-prepare.sh с помощью вызова /usr/bin/wb-gen-serial

Можете подсказать, на каком этапе обновления вызывается wb-prepare.sh?

Да, завтра освежу в памяти - напишу.

1 лайк

Доброго времени!

Тут зависит от конкретной задачи. Если нужно получить именно серийник контроллера (формата AXXXXXXX, пишется на заводской наклейке), то это можно сделать с помощью wb-gen-serial:

wb-gen-serial -s

У неё есть ограничение: она не будет доступна при обновлении с флешки, т.к. там для загрузки используется минимальный образ с linux и busybox, там нет python и необходимых для wb-gen-serial библиотек. Ещё одно ограничение: до WB6.7 при создании серийника используется IMEI модема, для чего понадобятся не только утилиты, но и запись в device-tree, которая при обновлении с флешки может быть недоступна.

Если в флоте только относительно новые wb6 (6.7 и новее), то теоретически при обновлении с флешки можно делать chroot в новый rootfs и вызывать wb-gen-serial оттуда, но это может сломаться на более старых контроллерах, причём сломаться молча, просто выдав неправильный серийник.

Наконец, если задача в том, чтобы просто как-то надёжным образом различить контроллеры, можно сравнивать серийный номер процессора из /proc/cpuinfo, он доступен в любом режиме работы и гарантированно разный для всех контроллеров:

cat /proc/cpuinfo | grep Serial
2 лайка

Понял, а если, например просто получить hostname? Планирую обновлять парк контроллеров начиная с версий WB 6.X + прошивать новые с полным сбросом, включая будущие WB 7. Ищу способ, который будет работать одинаково на всех версиях.

Ну вот серийник в hostname попадает при первой загрузке в полноценную ОС. Теоретически можно вытаскивать из старого rootfs вытаскивать файл /etc/hostname, но это будет довольно замысловатая процедура.

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

Плохая идея конфигурировать mosquitto на этом этапе?

Изначально были такие мысли, но это показалось нетривиальным. Нужно же будет определять и монтировать старый раздел, так же как это делается в install_update.sh?

Может же быть такая ситауция, когда предыдущий раздел пустой и не содержит файл /etc/hostname?

Можно же порядок запуска определить в systemd, что-то вроде

After=wb-prepare.service
Before=mosquitto.service

Например, если попытались обновиться один раз, загрузиться почему-то не получилось, и после этого обновились с флешки второй раз. Тогда в старом разделе будет неинициализированная система. Сценарий синтетический немного, но не совсем невероятный.

Вроде понял.
Мне кажется вариант получения hostname на стадии install_update.sh более стабильным. Займусь им.

Спасибо за разъяснения!

Рекомендовал бы всё-таки пойти от варианта с первым запуском, но право ваше :slight_smile:

Можете тогда подсказать или показать пример, как определяется первый запуск?

Если ваша цель - отредактировать конфиг mosquitto, то можно определить просто по наличию там изменений :slight_smile:

В крайнем случае можно ориентироваться на наличие файла /var/lib/firstboot_done.flag

1 лайк

Добрый вечер!

Наверно это уже другая тема, но я заметил, что конфигурация mosquitto при обновлении с флешки стирается (без полного сброса). Следовательно вопрос, можно ли как-то штатным образом оставить старый конфиг, или, получить старый hostname?

Но все важное, то есть содержимое /etc/mosquitto/conf.d - симлинки на /mnt/datae/etc, которое не обновляется.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.