переписать образ Linux на устройство через Ethernet

Вопрос или проблема

У меня есть встроенное устройство с Linux (сохранено в EMMC). Когда мне нужно обновить образ Linux (у меня есть один .img файл), я подключаюсь через последовательный терминал, редактирую boot_targets, чтобы запустить систему с SD-карты, а затем переписываю EMMC с хоста через команду dd. Но что если устройство находится в другом городе, и я могу подключиться к нему только через удаленный SSH?

Как я могу тогда обновить новый образ Linux?

Я попытался сделать копию существующей fs в tmpfs, но застрял на переносе существующей fs в tmpfs…

…только использовать удаленный SSH для подключения к нему.
Как я могу тогда обновить новый образ Linux?

Вы практически близки к решению. Вам нужно:

  1. система, способная работать с SSH, и
  2. не зависит от того, чтобы разделы данных были в рабочем состоянии.

Классическое встраиваемое решение для этого — иметь место, где можно подготовить новую систему, а затем перезагрузить для использования этой системы.

Вы можете подойти к этому разными способами; один из способов — “просто” иметь A/B загрузку, т.е. два разных корневых раздела. Один, с которого ваш Linux в настоящее время работает, “активный”. Обновление — это замена содержимого раздела, который в данный момент не используется (т.е. “пассивного”), затем указание загрузчику загрузиться с другого в будущем, затем перезагрузка, таким образом обмен ролей “активного” и “пассивного” раздела. (Или LVM тома, или чего-то еще, загрузчики Linux могут быть довольно гибкими в этом плане.)

Существует готовые решения для этого, или вы сами можете это запрограммировать. Есть механизмы, которые масштабируют этот принцип на целые флоты устройств, например https://mender.io, что позволяет вам выбирать, какие устройства обновлять, выполняя обновления волнами (чтобы в случае возникновения неожиданной проблемы вы не “бриковали” все устройства сразу).

Другие способы включают такие вещи, как капсулы обновлений, когда вы загружаетесь в конкретную, меньшую систему, которая обновляет один корневой раздел, который у вас есть — это может сэкономить много места, если обновления редко происходят в виде полного образа, но в основном представляют собой различия, применяемые к последнему образу.

Более современный подход для больших устройств, подключенных к интернету, — это образные ОС. Вы определяете наложения, содержащие файлы, которые затрагивает ваше обновление (включая такие вещи, как ядро и системные службы, а также их конфигурацию), развертываете их на встроенных устройствах, просто выполняя команду на них, которая извлекает наложение с вашего сервера, и устройства переключаются на них. Если что-то не получилось, просто удалите наложение, создав видимость, что ничего не произошло, а если все хорошо, вы консолидируете наложение и экономите место, имея только одну версию структуры каталогов, сохраненную на устройстве. В экосистеме Fedora, фреймворком для этого является rpm-ostree, а для встроенных устройств вы бы использовали дистрибутив Fedora IoT, портированный на ваше устройство.

Я предлагаю вам попробовать запрограммировать то, что вы обычно делаете. Скопируйте файлы (один из них может быть самим скриптом) на устройство, а затем запустите скрипт на устройстве, который делает то, что вы бы сделали вручную в противном случае.

Когда вам удастся это сделать, все, что останется, это:

  • копировать файлы с помощью scp/sftp вместо последовательного порта
  • вызвать скрипт через SSH

Ответ или решение

Обновление образа Linux на удалённом устройстве через Ethernet, особенно когда у нас есть только доступ по SSH, предъявляет определённые требования и ограничения. В основе задачи лежит необходимость одного обновления системы на устройстве, которое может находиться в другой географической зоне. Ваша текущая практика состоит в использовании последовательного терминала для редактирования загрузочной конфигурации, но давайте рассмотрим, как этого можно избежать, действуя лишь с помощью SSH.

Теория

Для обновления изображения операционной системы на удалённом устройстве с Linux (хранящемся в EMMC), важно, чтобы наше решение позволяло:

  1. Управление доступом по SSH: Средства доступа позволяют изменять файлы и скрипты на удалённом устройстве, обеспечивая гибкость при выполнении различных команд.

  2. Механизм безопасного обновления: Гибридный механизм, сочетающий возможность отката (rollback) в случае неудачного обновления, особенно важен для критических систем.

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

  4. Скриптовое развертывание: Создание автоматизированных скриптовых решений, которые моделируют привычные физические действия через SSH и обеспечивают обновление системы без физического присутствия.

Пример

Один из практических методов, который можно привести в пример, это использование подхода A/B обновления. Этот подход состоит в использовании двух отдельных корневых разделов на устройстве: активного и пассивного. При подготовке обновления производится замена содержимого пассивного раздела. Затем устройство конфигурируется для загрузки из нового обновленного раздела при следующем перезапуске.

Этапы работы данной системы могут включать:

  • Создание резервных копий данных или состояние системы перед началом обновления для возможности возврата.
  • Копирование обновленного образа в пассивный раздел устройства.
  • Изменение конфигурации загрузчика для загрузки с обновленного раздела.
  • Перезагрузка устройства для проверки обновления.

Приложение

  1. Подготовка удаленного устройства:

    • Настройка SSH доступа и обеспечение стабильного подключения к сети.
    • Убедитесь, что у вас есть все необходимые права для выполнения изменений на системе.
  2. Разработка и создание скрипта:

    • Разработайте скрипт, который автоматизирует шаги обновления, включая команды, которые вы обычно выполняете вручную. Это может включать команды для копирования файлов, изменения конфигураций загрузчика и перезагрузки устройства.
  3. Безопасное копирование файлов:

    • Используйте scp или sftp для передачи обновлённого образа системы на устройство. Команда может выглядеть так: scp new_image.img user@device:/desired/path.
  4. Запуск обновления:

    • Подключитесь к устройству по SSH и выполните предварительно созданный скрипт. Это можно сделать следующей командой: ssh user@device 'bash /path/to/update_script.sh'.
  5. Мониторинг и проверка:

    • После выполнения скрипта и перезагрузки устройства проверьте, правильно ли работает обновлённое устройство. Важно проверить все основные функции, чтобы убедиться, что обновление прошло успешно.
  6. План rollback в случае проблем:

    • Настройте механизм отката для возврата к предыдущему рабочему состоянию в случае, если обновление приводит к ошибкам или неустойчивой работе системы. Это может быть реализовано через перегрузку устройства с предыдущего раздела.

Системы, которые поддерживают обновления по схемам A/B или используют решения, такие как mender.io, позволяют автоматизировать и обезопасить процессы обновлений, устраняя необходимость физического вмешательства при работе с большим количеством устройств. Такой подход особенно полезен в архитектурах, где устройства распределены по разным городам или даже странам, минимизируя риск человеческой ошибки и обеспечивая стабильность работы систем.

Оцените материал
Добавить комментарий

Капча загружается...