В качестве примера будет использован образ Ubuntu 16.04: подготовка рабочего окружения, настройка необходимых параметров, сборка и загрузка образа в облачный сервис.
Также будут рассмотрены необходимые шаги для подготовки образа с полной совместимостью со всеми дополнительными возможностями сервиса «Виртуальное приватное облако».
В качестве инструмента для сборки образа мы будем использовать diskimage-builder. Это набор компонентов для подготовки образов операционных систем, файловых систем, RAM-дисков с открытым исходным кодом, поддерживаемый сообществом OpenStack.
Инструмент поддерживает создание образов большинства распространенных дистрибутивов GNU/Linux:
- Centos
- Debian
- Fedora
- RHEL
- Ubuntu
- Gentoo
- OpenSUSE
По умолчанию diskimage-builder подготавливает образ cloud-версии операционной системы, поэтому в образе будут присутствовать пакеты cloud-init и cloud-utils, необходимые для автоматической настройки системы в облаке.
Создание образа Ubuntu 16.04
Мы будем готовить образ на машине с ОС Ubuntu 14.04.
Для начала установим необходимые зависимости:
|
|
Затем установим diskimage-builder:
|
|
Создадим базовые директории для работы:
|
|
Для настройки diskimage-builder нам необходимо указать несколько дополнительных параметров, значение которых хранится непосредственно в переменных окружения командной оболочки (таким образом, вы можете указывать их в командной строке):
- ARCH=“amd64” — архитектура образа.
- BASE_ELEMENTS=“ubuntu bootloader cloud-init-datasources” — здесь мы укажем используемые элементы diskimage-builder. Элементы представляют собой набор bash-скриптов, которые выполняют все рутинные действия по подготовке и изменению образа. Наиболее важным для нас является элемент ubuntu, который скачает и распакует стандартный официальный образ дистрибутива, проведет установку требуемых пакетов и обновления системы до актуального состояния внутри образа при помощи утилиты chroot, и соберет все обратно в образ, готовый к использованию. Элемент bootloader устанавливает загрузчик (в нашем случае GRUB2) в подготавливаемый образ системы, а cloud-init-datasources передаёт список источников данных для утилиты cloud-init, которая необходима для первоначальной настройки операционной системы при запуске.
- DIB_CLOUD_INIT_DATASOURCES=“ConfigDrive, Ec2” — источники данных для элемента cloud-init-datasources.
- DIB_RELEASE=“xenial” — версия операционной системы, на базе которой мы будем создавать образ.
- IMAGE_PATH="~/diskimage-builder/images/ubuntu-16.04" — имя и путь для образа.
Сборка образа осуществляется с помощью команды:
|
|
После ключа -t указываем нужный формат образа. Поддерживаются образы: qcow2, tar, vhd, docker, raw.
Перед непосредственной сборкой образа вам скорее всего понадобится внести дополнительные настройки в систему, например:
- установить дополнительные пакеты в систему;
- отключить механизм predictable_interface_naming, который переименовывает привычные имена интерфейсов eth0, eth1,… в имена вида enp0s3, ens3 и т.д;
- отключить создание пользователя «ubuntu» и разрешить доступ пользователю «root» по протоколу SSH;
- регенирировать SSH-ключи для каждой созданной из данного образа виртуальной машины;
- изменить предустановленную временную зону.
Для этого нам потребуется создать дополнительный элемент в директории ~/diskimage-builder/elements.
Создадим директории:
|
|
Внутри директории ~/diskimage-builder/elements/ubuntu-16-custom создадим файл README.rst с описанием нового элемента:
|
|
В директории ~/diskimage-builder/elements/ubuntu-16-custom/install.d создадим скрипт 50-install-additional-packages:
|
|
Скрипты в директории install.d выполняются при сборке образа во время установки основных пакетов. Созданный нами скрипт 50-install-additional-packages установит в систему python версии 2.7, который все еще необходим для работы многих приложений. По умолчанию в образе Ubuntu 16.04 присутствует только python версии 3.5.
Вы также можете дополнить этот список необходимыми вам пакетами, которые потребуется установить в образ.
Далее в директории ~/diskimage-builder/elements/ubuntu-16-custom/post-install.d необходимо создать скрипт 50-configure-system для изменения конфигурации системы:
|
|
Скрипты в директории post-install.d выполняются сразу после скриптов в директории install.d.
Также нам потребуется изменить настройки GRUB для добавления параметра запуска «net.ifnames=0», который сохранит имена интерфейсов в привычном формате ethN.
Добавим скрипт 50-configure-grub в директории ~/diskimage-builder/elements/ubuntu-16-custom/finalise.d:
|
|
Скрипты в директории finalise.d выполняются после всех основных этапов подготовки образа.
После создания описанных скриптов нам необходимо изменить их атрибуты, для этого выполним команду chmod:
|
|
Теперь перед созданием образа нам необходимо указать путь для нашего нового элемента. Это можно сделать при помощи параметра ELEMENTS_PATH.
Чтобы не указывать параметры каждый раз напрямую в командной строке, в директории ~/diskimage-builder/ создадим скрипт build-ubuntu-16.04, который задаст параметры diskimage-builder и выполнит сборку образа:
|
|
Изменим атрибуты этого файла:
|
|
После этого должна получится вот такая иерархия файлов:
|
|
Запустим скрипт build-ubuntu-16.04:
|
|
Утилита sudo при вызове нужна для того, чтобы предложение ввести пароль не появилось посередине процесса подготовки образа. Данное поведение объясняется тем, что некоторые предустановленные элементы diskimage-builder содержат вызов sudo.
По окончании работы нашего скрипта новый образ будет находиться в директории ~/diskimage-builder/images/ubuntu-16.04.raw.
Вы можете использовать созданный образ в сервисе Selectel «Виртуальное приватное облако», загрузив его через веб-интерфейс панели VPC, либо через glance API.
Обратите внимание, что пароль для root был удален на этапе сборки образа, поэтому доступ к виртуальной машине по SSH изначально будет возможен только по ключу. Вы можете добавить ключ SSH при создании машины в панели VPC. Доступ к серверу возможен и через виртуальную консоль no-VNC в панели управления, в этом случае вам не потребуется вводить пароль root, если он не был установлен.
Пароль root устанавливается стандартным способом с помощью утилиты passwd.
Если вы попытаетесь использовать образ, созданный при помощи описанных выше процедур, в нашем сервисе «Виртуальное приватное облако» (VPC), то столкнётесь с рядом ограничений. Для вас не будут доступны следующие возможности VPC:
- установка исходного пароля, сгенерированного сервисом VPC;
- смена пароля root из веб-панели VPC;
- смена пароля root с помощью nova API;
- смена интерфейса для маршрута по умолчанию из веб-панели VPC;
- автоматическое изменение настроек сетевых интерфейсов внутри системы, в том случае, если они были изменены в панели управления сервером;
В следующем разделе мы покажем, как сделать полностью совместимый с VPC образ.
Создание образа для сервиса «Виртуальное приватное облако»
Чтобы создаваемый образ был полностью совместим с сервисом VPC, на этапе сборки потребуется добавить дополнительные свойства свойств для образа и установить в систему дополнительные пакеты.
Добавим еще один элемент ubuntu-16-selectel, для этого создадим директорию:
|
|
Внутри данной директории добавим описание элемента в файле README.rst:
|
|
Создадим требуемые директории для нового элемента:
|
|
Изменим список репозиториев скриптом ~/diskimage-builder/elements/ubuntu-16-selectel/pre-install.d/50-add-mirrors:
|
|
Добавим дополнительные пакеты скриптом ~/diskimage-builder/elements/ubuntu-16-selectel/install.d/50-add-selectel-packages:
|
|
Будут установлены следующие утилиты
- crontab-randomizer — простой скрипт, который рандомизирует временные интервалы в /etc/crontab, далее мы добавим вызов данного скрипта при первом запуске системы;
- fstrim-blocks — обертка для предустановленной утилиты fstrim, позволяет проводить TRIM файловой системы на быстрых дисках поблочно через небольшие интервалы, при установке добавит вызов в cron.weekly;
- qemu-guest-agent — утилита, которая позволит передавать команды QMP для управления системой в виртуальную машину, в нашем случае данная утилита нужна для смены пароля виртуальной машины через панель VPC и nova API;
- set-root-pw — скрипт для изначальной установки в виртуальной машине пароля, полученного из метаданных OpenStack, далее мы также добавим вызов этого скрипта при первом запуске системы;
Также во время сборки образа пакет cloud-init будет автоматически обновлен на версию, которая находится в зеркале Selectel OpenStack. Эта версия содержит патчи, которые обеспечивают консистентность настроек сети между виртуальной машиной и сервисом VPC.
Автоматическое обновление пакетов при сборке образа происходит при помощи предустановленного скрипта 00-up-to-date, во время стадии install.d.
Далее нам понадобится добавить дополнительные конфигурационные файлы для cloud-init, создадим в директории ~/diskimage-builder/elements/ubuntu-16-selectel/post-install.d скрипт 50-configure-cloud-init:
|
|
Также рекомендуется удалить предустановленный скрипт /etc/cron.weekly/fstrim в случае использования fstrim-blocks, так как предустановленный вариант не содержит параметров поблочного запуска, что повлечет дополнительную нагрузку на систему при запуске fstrim .
Удалим данный файл простым скриптом ~/diskimage-builder/elements/ubuntu-16-selectel/post-install.d/51-remove-fstrim-weekly:
|
|
Изменим атрибуты новых скриптов:
|
|
Добавим новый элемент ubuntu-16-selectel в скрипт ~/diskimage-builder/build-ubuntu-16.04:
|
|
Иерархия файлов должна иметь такой вид:
|
|
Запустим сборку образа:
|
|
Для загрузки образа со всеми необходимыми свойствами вам потребуется утилита glance и RC-файл доступа к проекту (его можно скачать в нашей панели управления; все необходимые инструкции опубликованы там же) https://support.selectel.ru/vpc/access/.
Команда для загрузки будет выглядеть так:
|
|
При загрузке будут добавлены свойства:
- hw_qemu_guest_agent=yes — необходимо для поддержки механизма смены пароля сервера через панель VPC или через nova API; данное свойство будет работать только в том случае, если в образе присутствует утилита qemu-guest-agent не ниже версии 2.3 (в Ubuntu 16.04 используется версия 2.5);
- x_sel_image_owner=Selectel — необходимо для поддержки отображения пароля в панели VPC;
- hw_disk_bus=scsi, hw_scsi_model=virtio-scsi — данные свойства разрешат использование более современной и производительной шины virtio-scsi, одно из преимуществ которой это возможность использования TRIM.
После загрузки образ будет отображаться на вкладке «Образы» в вашем проекте VPC с именем Ubuntu-16.04-VPC.
При первом запуске сервера пароль для пользователя root будет сгенерирован и установлен автоматически. Он будет отображаться на вкладке «Консоль», там же при необходимости можно сгененировать новый пароль.
Помимо этого вам не придется производить настройки сетевых интерфейсов на сервере вручную, если вы изменили их в панели управления на вкладке «Порты». Чтобы cloud-init перенастроил сетевые интерфейсы, потребуется произвести перезагрузку сервера по питанию. После этого будут сгенерированы новые метаданные OpenStack c новыми настройками сети.
Вы можете запретить утилите cloud-init изменять настройки сети при каждой перезагрузке сервера. Для этого в установленной системе добавьте файл /etc/cloud/cloud.cfg.d/99_disable_network_config.cfg:
|
|
В ближайшем будущем мы добавим возможность запрета автоматической перенастройки сети через веб-интерфейс панели VPC без необходимости редактирования конфигурации системы.
Заключение
В этой статье мы рассмотрели базовые возможности diskimage-builder, изучили способы добавления своих скриптов для изменения конфигурации образа, основные этапы сборки и пример загрузки готового образа в облачное окружение.
Если у вас остались вопросы по основным способам использования данного инструмента или же для вас непонятны какие-либо моменты в управлении образами и виртуальными машинами в сервисе VPC, пожалуйста, укажите об этом в комментариях.
Будем также рады, если вы поделитесь собственными способами использования diskimage-builder.
Источник: habr.com