python

В помощь DevOps: сборщик прошивок для сетевых устройств на Debian за 1008 часов

  • пятница, 1 апреля 2016 г. в 03:13:13
https://habrahabr.ru/company/edison/blog/280550/
  • Сетевые технологии
  • Разработка под Linux
  • Разработка
  • Python
  • Блог компании Edison


Сегодня мы расскажем об успешно реализованном проекте для крупного немецкого производителя телекоммуникационного оборудования (хабы, роутеры, сетевые серверы и пр.)



Задача


Embedded Debian не предоставляет готовой к использованию среды для сборки произвольных образов системы. Чтобы ее подготовить, требуется использовать стандартный дистрибутив Debian, обладать навыками системного администрирования, подобрать и настроить набор утилит, написав при этом ряд shell скриптов для автоматизации процедуры кросс-компиляции пакетов. Проделав всю ручную работу, вы получите консольный инструмент, пользоваться которым может исключительно технический персонал с определенным уровнем навыков работы с ОС Linux, а это не удобно, встает вопрос по организации многопользовательского доступа к этой среде и ограничению прав, а также постоянной поддержки среды в актуальном состоянии.

Выбор производителя телекоммуникационного оборудования пал на дистрибутив Embedded Debian благодаря большому количеству пакетов входящих в состав ОС, позволяющих решать самые разнообразные задачи, и обилию поддерживаемых платформ.

Перед разработчиками EDISON была поставлена задача разработать веб-сервис с интуитивно понятным веб-интерфейсом в виде мастера, позволяющего подготовить произвольный образ системы на базе Embedded Debian на целевую платформу в несколько шагов, который также решает ряд смежных задач.

  • Многопользовательский доступ к системе сборки образов Debian.
  • Хранение подготовленных образов и предоставление доступа к ним.
  • Модификация и повторная сборка подготовленных ранее образов.
  • Клонирование и модификация подготовленных ранее образов.
  • Возможность делится созданным образом с другими пользователями.
  • Зеркалирование дистрибутива Embedded Debian, поддержка его в актуальном состоянии.
  • Предварительная сборка пакетов дистрибутива на различные платформы по расписанию.
  • Предоставление статистики по итогам сборки пакетов на различные платформы.
  • Поддержка классических img образов, а также iso образов, в том числе с поддержкой Live CD.


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

Реализация и технологии.
  • Python 2 / Django.
  • Bash shell scripts.
  • MySQL.
  • Debian 5.0 (Lenny).
  • Embedded Debian 1.0 (Grip / Crush).


Введение


Linux плотно обосновалась в сегменте серверного и клиентского телекоммуникационного оборудования, ведь данная ОС в коробке предоставляет все самое необходимое ПО для обеспечения работы и взаимодействия узлов сети, предоставляет различные сервисы над всевозможными сетевыми протоколами, а кроме того, система бесплатна.

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

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

Рынок ИТ предлагает продукт для решения данной проблемы в виде облачного сервиса SUSE Studio, который предоставляет возможность за считанные минуты собрать произвольный образ системы на базе дистрибутива Open Suse, в том числе и для Embedded устройств.

Но статья не об этом продукте, а о процессе создания аналогичного сервиса, автоматизирующего процесс сборки образов Debian для встраиваемых и стационарных устройств на базе дистрибутива Embedded Debian версии 1.0, для внутренних нужд одного из клиентов EDISON, занимающегося производством телекоммуникационного оборудования на базе архитектуры ARM, i386, amd6, PowerPC.

О дистрибутиве Embedded Debian


Embedded Debian (Emdebian) версии 1.0 базируется на ОС Debian 5.0 «Lenny» и включает дистрибутивы Grip, Crush.
Emdebian Grip представляет собой облегченную версию Debian для встраиваемых и стационарных устройств. Дистрибутив не содержит функциональных изменений и обеспечивает высочайший уровень функциональной совместимости с Debian. Включает поддержку для создания пользовательских пакетов на Emdebian, а также возможность смешивать и сочетать пакеты Emdebian и Debian с минимальными усилиями. Дистрибутив поддерживает архитектуры i386, amd64, PowerPC, ARM и ARMEL, MIPS и MIPSEL. Типичный образ системы на основе Emdebian Grip представляют собой ОС Debian для встраиваемых и стационарных устройств, c корневой файловой системой на основе coreutils и набором пакетов для поддержки графического интерфейса Gnome или KDE.

Emdebian Crush ориентирован на машины, которые не могут собирать пакеты для себя. В дистрибутиве нет поддержки компиляторов и инструментов сборки. Ряд пакетов дистрибутива сильно модифицирован. Дистрибутив поддерживает только архитектуру ARM. Типичный образ системы на основе Emdebian Crush представляют собой ОС Debian для встраиваемых устройств c корневой файловой системой на основе Busybox и набором пакетов для поддержки графического интерфейса G Palmtop для устройств PDA. Минимальный размер образа системы без графического интерфейса занимает около 24 MB. В отличие от дистрибутива Grip, сборка, установка и техническое обслуживание системы на основе дистрибутива Crush требует много ручной работы и детального знания Debian.

Дистрибутивы Grip и Crush также имеют по три ветки: stable, testing и unstable, которые соответственно включают стабильные, тестируемые и не стабильные версии пакетов.




Решение


Производитель только собирался переходить на ОС Debian, при выпуске новой линейки оборудования, поэтому у нас не оказалось каких-либо наработок от производителя по сборке образов Debian на основе дистрибутива Embedded Debian, все пришлось делать с чистого листа. В рамках пилотной версии сервиса, было решено ограничиться поддержкой архитектуры ARM и i386.

В первую очередь, необходимо было подготовить среду для кросс компиляции пакетов дистрибутива Embedded Debian и сборки готовых к использованию образов Debian на встраиваемых и стационарных устройствах, а также спроектировать и согласовать на ранней стадии процедуру интеграции ключевых процессов по сборке образов в разрабатываемый веб-сервис. В итоге был спроектирован набор shell скриптов, которые входят в ядро системы.

Создание зеркала официального дистрибутива — mirror.sh

Скрипт в зависимости от наименования дистрибутива создает зеркало официального дистрибутива Embedded Debian на локальной машине.

Сигнатура:
mirror [distr_name]
где:
  • distr_name – grip или crush

Использование:
mirror crush

Вывод:
crush mirroring process start
Date: 20091201-15:00:00
Process pid: 9850
Process finished

Авто-сборка пакетов дистрибутива — auto_build.sh

Скрипт в зависимости от заданной архитектуры и наименования дистрибутива осуществляет сборку пакетов зеркала дистрибутива Embedded Debian. По завершению процедуры сборки пакетов запускается скрипт создания репозитория на основе успешно собранных пакетов.

Сигнатура:
auto_build [distr_name] [arch_name]
где:
  • distr_name – grip или crush
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)

Использование:
auto_build crush arm

Вывод:
The auto building process of packages started
Architecture: arm
Date: 20091201-15:00:00
Process pid: 9850
Start to create a local repository
The making repository process started
Distr version: crush
Date: 20091201-15:00:00
Process pid: 9850
The process finished
The auto_build process finished

Создание репозитория на основе собранных пакетов — make_repository.sh

Сигнатура:
make_repository [distr_name] [arch_name]
где:
  • distr_name – grip или crush
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)

Использование:
make_repository crush arm

Вывод:
The making repository process started
Distr version: crush
Date: 20091201-15:00:00
Process pid: 9850
The process finished

Список пакетов дистрибутива — get_packages.sh

Скрипт в зависимости от заданной архитектуры, наименования и версии дистрибутива возвращает список доступных пакетов.

Сигнатура:
get_packages [distr_name] [distr_version] [arch_name]
где:
  • distr_name – grip или crush
  • distr_version – stable, testing или unstable
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)

Использование:
get_packages crush stable arm

Вывод:
Package: acl
Version: 2.2.47-2em1
Description: Access control list utilities
This package contains the getfacl and setfacl utilities needed for
manipulating access control lists.
Package: apt
Version: 0.7.20.2em1
Description: Advanced front-end for dpkg
This is Debian's next generation front-end for the dpkg package manager.
It provides the apt-get utility and APT dselect method that provides a
simpler, safer way to install and upgrade packages.


Список зависимостей — get_depends.sh

Скрипт возвращает список зависимостей по заданному списку пакетов, дистрибутиву и архитектуре.

Сигнатура:
get_depends [distr_name] [distr_version] [arch_name]
где
  • distr_name – grip или crush
  • distr_version – stable, testing или unstable
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)

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

Использование:
get_depends crush stable arm

Ввод списка пакетов:
Package: acl
Version: 2.2.47-2em1
Package: apt
Version: 0.7.20.2em1
Вывод:
Package: libacl1
Version: 2.2.47-2em1
Description: Access control list shared library
This package contains the libacl.so dynamic library containing
the POSIX 1003.1e draft standard 17 functions for manipulating
access control lists.
Package: libc6
Version: 2.7-18em1
Description: GNU C Library: Shared libraries
Contains the standard libraries that are used by nearly all programs on
the system. This package includes shared versions of the standard C library
and the standard math library, as well as many others.


Список пакетов и статус их сборки — get_sources.sh

Скрипт в зависимости от заданной архитектуры, наименования и версии дистрибутива возвращает список пакетов и статус их сборки.

Сигнатура:
get_sources [distr_name] [distr_version] [arch_name]
где
  • distr_name – grip или crush
  • distr_version – stable, testing или unstable
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)

Использование:
get_sources crush stable arm

Вывод:
Package: acl
Version: 2.2.47-2em1
Status: success
Package: apt
Version: 0.7.20.2em1
Status: error
Package: libc6
Version: 2.7-18em1
Status: unknown

Создание образа системы — image_create.sh

Скрипт в зависимости от заданного набора пакетов, наименования и версии дистрибутива, архитектуры, создает файл образа Debian готового к использованию на целевой архитектуре. В результате работы скрипта образ Debian доступен во временном каталоге /tmp.

Сигнатура:
image_create [distr_name] [distr_version] [arch_name] [name_of_image]
где:
  • distr_name – grip или crush
  • distr_version – stable, testing или unstable
  • arch_name – i386 или arm (в случае c crush принимается только параметр arm)
  • name_of_image – уникальное имя файла создаваемого образа

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

Использование:
image_create crush stable arm debian_on_arm.iso

Ввод списка пакетов:
Package: acl
Version: 2.2.47-2em1
Package: apt
Version: 0.7.20.2em1

Вывод:
Creating new image: debian_on_arm
Architecture: arm
Date: 20091201-15:00:00
Process pid: 9850
Image type: iso

В процессе подготовки окружения и реализации описанных скриптов ядра, мы сразу столкнулись с проблемой, связанной с недостаточно подробной документацией на официальном сайте дистрибутива, которая также содержит ряд упущений в доступных гайдах, что, в свою очередь, в ряде случаев способствовало затруднению продвижения к конечному результату. Очередная проблема была связана с отсутствием готового для загрузки img образа дистрибутива Emdebian Crush, данный образ пришлось подготовить вручную.

В конечном счете, рабочий образец окружения, позволяющий собрать образ Debian на архитектуры i386 и ARM, был получен. Для создания зеркала (локальной копии) дистрибутива Embedded Debian использована утилита debmirror, входящая в состав Debian Lenny. Для создания временного окружения для кросс-компиляции пакетов на целевые платформы, использовались утилиты debootstrap, pbuilder, chroot. Для создания репозитория собранных пакетов использовалась утилита reprepro.

Кросс-компиляция пакетов локальной копии дистрибутива осуществляется по расписанию в ночное время. По ее результатам генерируется статистика по успешно собранным и не собранным пакетам, результаты которой можно получить по запросу, вызвав скрипт get_sources.sh, а также формируется локальный репозиторий собранных пакетов, использование которого способствует ускорению сборки произвольного образа, так как все необходимые пакеты репозитория уже собраны для всех необходимых архитектур, и процедуру сборки не требуется запускать в рантайме в процессе сборки образов.

Для сборки образов Debian были подготовлены шаблоны img и iso образов Debian для архитектуры ARM и i386 с минимальным количеством предустановленных пакетов. В процессе создания образа Debain по заданным параметрам во временную папку копируется шаблон образа, затем образ монтируется, и с помощью утилит chroot и apt-get в образ включатся собранные пакеты из локального репозитория, после чего полученный образ готов к использованию на целевой архитектуре. Вся процедура по сборке img либо iso образа занимает от нескольких секунд до нескольких минут в зависимости от количества включаемых пакетов.

Разработка веб-сервиса велась параллельно процессу подготовки окружения для сборки образов Debian благодаря заранее продуманной структуре скриптов ядра. В процессе разработки веб-сервиса скрипты для получения списка пакетов, зависимостей, статистики сборки пакетов и сборки образа, были выполнены в виде заглушек, возвращающих фейковые данные согласно спроектированному формату. Как только был получен рабочий образец окружения, позволяющий собрать образ Debian, все вызовы фейковых скриптов были заменены рабочими, в результате процесс интеграции процедуры сборки образов в веб-сервис прошел мгновенно.

Заключение


Разработанный веб-сервис предоставляет интуитивно понятный веб-интерфейс в виде мастера, позволяющий создать произвольный образ Debian всего в четыре шага, не обладая при этом техническими знаниями в данной области.
  1. Выбор дистрибутива Grip или Crush, архитектуры i386 или ARM, версии ядра Linux и указание названия создаваемого образа.
  2. Выбор списка пакетов c использованием скрипта get_packages.sh.
  3. Определение списка зависимостей и включение дополнительных пакетов в создаваемый образ с использованием скрипта get_depends.sh.
  4. Создание и загрузка готового образа Debian с использованием скрипта image_create.sh.

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

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

Кроме типовых img образов Debian также реализована поддержка Live CD образов, благодаря которым можно протестировать определенную сборку Debian на целевом устройстве без необходимости установки ОС во внутреннюю память устройства, загрузившись с флэш-карты.

Отладка и железяки


Заказчик предоставил образцы устройств на базе архитектуры ARM и i386, для тестирования собираемых образов Debian. Собираемые для архитектуры i386 образы тестировались на стационарных машинах разработчиков. В итоге, подготовленные сервисом образы Debian успешно запустились на предоставленном заказчиком оборудовании.