Руководство по работе с образами виртуальных машин OpenStack

Содержание

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

Введение

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

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

Использование протокола SSH обеспечивает доступ в виртуальную машину с приватным ключом и учетной записью по умолчанию.

Чтобы образ на базе Linux имел полную функциональность в облаке OpenStack, существует несколько требований:

  • возможность разделения диска и изменения размера корневого раздела при загрузке (cloud-init);
  • MAC-адреса жестко не закреплены;
  • функционирование SSH сервера;
  • отключение брандмауэра;
  • наличие доступа к машине с использованием публичного ключа ssh (cloud-init);
  • обработка пользовательских данных и других метаданных (cloud-init);
  • паравиртуализированная поддержка Xen в ядре Linux.

Примечание

Часть данных требований выполняется с помощью установки утилиты cloud-init.

Форматы дисков и контейнеров для образов

Образы виртуальных машин бывают разных форматов. Формат описывает способ расположения битов, составляющих файл, на носителе данных. Знание формата требуется для того, чтобы потребитель правильно интерпретировал содержимое файла (а не просто рассматривал его как набор битов).

При рассмотрении сохраненного образа виртуальной машины можно использовать два типа формата:

  • Формат контейнера:

    Сохраненный файл может быть контейнером, содержащим виртуальный диск. Например, виртуальный диск может содержаться в tar-файле, который необходимо открыть перед извлечением диска. Однако возможно, что виртуальный диск не содержится в файле, а просто хранится службой образов как есть.

  • Формат диска:

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

Метаданные образа

Метаданные образа предоставляют информацию о виртуальном диске, хранящемся службой образов. Метаданные хранятся как часть записи образа, связанной с данными образа службой Glance. Метаданные образа используются соответствующими компонентами и драйверами OpenStack, которые взаимодействуют со службой образов.

Чтобы потребители образов могли легко идентифицировать контейнер и формат диска образов, служба образов выделила для них определенные ключи метаданных: container_format и disk_format. Допустимые значения для каждого из них указаны в схеме образа службы образов, которую можно получить в любой установке OpenStack, выполнив следующий API запрос:

GET /v2/schemas/image

Поддерживаемые форматы могут различаться в разных облаках OpenStack. Форматы, принимаемые данным конкретным облаком, будут указаны в ответе get-schema этого облака на API образов.

Примечание

В схеме образа перечислены допустимые идентификаторы для форматов контейнеров и дисков. Чтобы понять, к чему относятся эти идентификаторы, обратитесь к разделу «Форматы дисков и контейнеров» Glance User Guide.

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

Примечание

Значение ImagePropertiesFilter указано в значении enabled_filters в разделе [filter_scheduler] конфигурационного файла /etc/nova/nova.conf.

Другие фильтры планировщика вычислительной службы также могут зависеть от метаданных образа. Полный список допустимых ключей и значений свойств в разделе «Полезные свойства образа» Glance Administration Guide.

Добавление метаданных к образу

Вы можете добавлять метаданные в образы службы образов, используя параметр –property key=value с командой создания образа openstack или командой установки образа openstack. Можно указать более одного свойства. Например:

openstack image set --property architecture=arm \
--property hypervisor_type=qemu image_name_or_id

Общие свойства образа также указаны в файле /etc/glance/schema-image.json.

Все связанные свойства образа можно отобразить с помощью команды openstack image show. Например:

openstack image show cirros
+------------------+------------------------------------------------------+
| Field            | Value                                                |
+------------------+------------------------------------------------------+
| checksum         | ee1eca47dc88f4879d8a229cc70a07c6                     |
| container_format | bare                                                 |
| created_at       | 2016-04-15T13:57:38Z                                 |
| disk_format      | qcow2                                                |
| file             | /v2/images/55f0907f-70a5-4376-a346-432e4ec509ed/file |
| id               | 55f0907f-70a5-4376-a346-432e4ec509ed                 |
| min_disk         | 0                                                    |
| min_ram          | 0                                                    |
| name             | cirros                                               |
| owner            | f9574e69042645d6b5539035cb8c00bf                     |
| properties       | architecture='arm', hypervisor_type='qemu'           |
| protected        | False                                                |
| schema           | /v2/schemas/image                                    |
| size             | 13287936                                             |
| status           | active                                               |
| tags             |                                                      |
| updated_at       | 2016-04-15T13:57:57Z                                 |
| virtual_size     | None                                                 |
| visibility       | public                                               |
+------------------+------------------------------------------------------+

Примечание

Свойства диска-из-образа: При создании дисков блочного хранилища из образов также учитывайте настроенные свойства образа. Если вы изменяете основные свойства образа, вам также следует обновить конфигурацию блочного хранилища. Измените look_core_properties в файле /etc/cinder/cinder.conf на всех узлах контроллера, чтобы они соответствовали основным свойствам, которые вы установили в службе образов.

Служба определения метаданных

Образы — не единственный ресурс OpenStack, с которым могут быть связаны метаданные. Многие другие ресурсы (например, диски) поддерживают настройку метаданных для ресурсов. Как и в случае с образами, метаданные могут использоваться пользователями для получения информации о ресурсе, или могут использоваться другими службами OpenStack, чтобы они могли эффективно использовать ресурс (например, планировщик фильтров nova использует свойство архитектуры образа для определения подходящего хоста для запуска машины из этого образа). Таким образом, важно, чтобы люди и службы могли определить, какие свойства и значения метаданных доступны в облаке OpenStack.

Для этого Glance (служба образов OpenStack) содержит службу определения метаданных, также известную как каталог метаданных OpenStack.

С помощью этого сервиса вы можете определить:

  • Пространство имен:

    Содержит определения метаданных.

    Задает средства управления доступом ко всему, что определено в пространстве имен. Эти элементы управления доступом определяют, кто может определять и использовать определения в пространстве имен.

    Связывает определения с различными типами ресурсов.

  • Свойство (Property):

    Одно свойство и его примитивные ограничения. Каждое свойство может быть только примитивного типа. Например, строка, целое число, число, логическое значение или массив.

  • Объект:

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

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

  • Ассоциация типа ресурса:

    Определяет связь между типами ресурсов и применимыми к ним пространствами имен. Эта информация может использоваться для управления представлениями пользовательского интерфейса и интерфейса командной строки. Например, одно и то же пространство имен объектов, свойств и тегов может использоваться для образов, моментальных снимков, томов и разновидностей. Или пространство имен может применяться только к образам.

Служба образов имеет предопределенные пространства имен для каталога определений метаданных. Чтобы загрузить файлы из этого каталога в базу данных:

glance-manage db_load_metadefs

Чтобы выгрузить файлы из базы данных:

glance-manage db_unload_metadefs

Чтобы экспортировать определения в формате JSON:

glance-manage db_export_metadefs

По умолчанию файлы загружаются из каталога службы образов /etc/glance/metadefs и экспортируются в него.

Между службой образов и службой Metadefs нет особой связи. Если вы хотите применить ключи и значения, определенные в службе Metadefs, к образам, вы должны использовать API службы образов или клиентские инструменты точно так же, как и для любой другой службы OpenStack.

Получение образа

Самый простой способ получить образ виртуальной машины, который работает с OpenStack — загрузить тот, который уже создан кем-то другим. Большинство образов содержат пакет cloud-init для поддержки пары ключей SSH и внедрения пользовательских данных. Поскольку многие образы по умолчанию отключают аутентификацию по паролю SSH, загрузите образ с введенной парой ключей. Вы можете подключиться к виртуальной машине по SSH с закрытым ключом и учетной записью для входа по умолчанию.

CentOS

Проект CentOS поддерживает официальные образы для прямой загрузки.

Образы можно скачать по ссылкам:

Примечание

В образе облака CentOS учетная запись для входа — centos.

CirrOS (тест)

CirrOS — это минимальный дистрибутив Linux, предназначенный для использования в качестве тестового образа в таких облаках, как OpenStack Compute. Вы можете загрузить образ CirrOS в различных форматах со страницы загрузки CirrOS.

Если в вашем облаке используется QEMU или KVM, мы рекомендуем использовать образы в формате qcow2. Самый последний 64-битный образ qcow2 на момент написания этой статьи — cirros-0.5.1-x86_64-disk.img.

Примечание

В образе CirrOS учетная запись для входа — cirros. Пароль gocubsgo. Поскольку фиксированный пароль позволяет любому войти в систему, вам не следует запускать этот образ с подключенным общедоступным IP-адресом.

Debian

Debian предоставляет образы для прямой загрузки. Они создаются одновременно с образами CD и DVD Debian. Поэтому образы доступны для каждого выпуска Debian. Также доступны еженедельные образы тестовой раздачи.

Примечание

В образе Debian учетная запись для входа — debian.

Fedora

Проект Fedora поддерживает список официальных облачных образов на странице загрузки Fedora.

Примечание

В облачном образе Fedora учетная запись для входа — fedora.

Microsoft Windows

Cloudbase Solutions предоставляет последнюю доступную пробную версию Windows Server 2012 R2. Этот образ включает в себя cloudbase-init и драйверы VirtIO на KVM. Вы можете создать свой собственный образ на основе Windows Server 2016, 2019, Windows 10 и т. д. с помощью Cloudbase Imaging Tools.

Файлы ISO для Windows 10 доступны на странице загрузки Microsoft Windows 10 и в Центре оценки Microsoft.

Fedora Virtio также предоставляет образы Windows.

Ubuntu

Canonical поддерживает официальный набор образов на основе Ubuntu.

Образы упорядочены по выпуску Ubuntu и по дате выпуска образа, причем текущий является самым последним. Например, страница, содержащая самый последний созданный образ для Ubuntu 18.04 Bionic Beaver, — это Ubuntu 18.04 LTS (Bionic Beaver) Daily Build. Прокрутите страницу вниз, чтобы найти ссылки на образы, которые можно скачать напрямую.

Если в вашем развертывании используется QEMU или KVM, мы рекомендуем использовать образы в формате qcow2 с именами, оканчивающимися на .img. Самая последняя версия 64-битного образа QCOW2 amd64-arch для Ubuntu 18.04 — bionic-server-cloudimg-amd64-disk.img.

Примечание

В облачном образе Ubuntu учетная запись для входа — ubuntu.

openSUSE и SUSE Linux Enterprise Server

Сообщество openSUSE предоставляет образы для openSUSE.

SUSE поддерживает официальные облачные образы SUSE Linux Enterprise Server. Перейдите на страницу загрузки SUSE Linux Enterprise Server, выберите архитектуру AMD64/Intel 64 и выполните поиск OpenStack-Cloud.

Примечание

В облачном образе openSUSE учетная запись для входа — opensuse.

Red Hat Enterprise Linux

Red Hat поддерживает официальные облачные образы Red Hat Enterprise Linux. Для загрузки этих образов требуется действующая подписка Red Hat Enterprise Linux:

В облачном образе RHEL учетная запись для входа — cloud-user.

FreeBSD, OpenBSD и NetBSD

Неофициальные образы для BSD доступны на BSD-Cloud-Image.org.

Примечание

Учетные записи для входа: freebsd для FreeBSD, openbsd для OpenBSD и netbsd для NetBSD.

Arch Linux

Arch Linux предоставляет облачный образ для загрузки. Более подробную информацию можно найти на странице проекта arch-boxes.

Примечание

В образе Arch Linux учетная запись для входа — arch.

Требования к образам

Linux

Чтобы образ на базе Linux обладал полной функциональностью в облаке OpenStack Compute, необходимо выполнить несколько требований. Для некоторых из них вы можете выполнить требования, установив пакет cloud-init. Прочтите этот раздел, прежде чем создавать собственный образ, чтобы убедиться, что образ поддерживает функции OpenStack, которые вы планируете использовать:

  • Разделы диска и изменение размера корневого раздела при загрузке (cloud-init)
  • Нет жестко заданной информации о MAC-адресе
  • SSH-сервер работает
  • Отключить брандмауэр
  • Доступ к виртуальной машине с использованием открытого ключа ssh (cloud-init)
  • Обработка пользовательских данных и других метаданных (cloud-init)
  • Паравиртуализированная поддержка Xen в ядре Linux (гипервизор Xen только с версией ядра Linux < 3.0)

Разделы диска и изменение размера корневого раздела при загрузке (cloud-init)

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

Размер диска в образе виртуальной машины определяется при первоначальном создании образа. Однако OpenStack позволяет запускать виртуальные машины с дисками разного размера, указав разные варианты. Например, если ваш образ был создан с диском объемом 5 ГБ, и вы запускаете машину с разновидностью m1.small. Полученный экземпляр виртуальной машины по умолчанию имеет размер основного диска 20 ГБ. Когда размер диска для машины увеличивается, в конец просто добавляются нули.

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

Xen: один раздел ext3/ext4 (без LVM)

Если вы используете драйвер OpenStack XenAPI, служба вычислений автоматически настраивает раздел и файловую систему для вашей виртуальной машины при загрузке. Автоматическое изменение размера происходит, если выполняются все следующие условия:

auto_disk_config=True задается как свойство образа в реестре образов.

Диск на образе имеет только один раздел.

Файловая система на одном разделе ext3 или ext4.

Поэтому, если вы используете Xen, мы рекомендуем при создании образов создавать один раздел ext3 или ext4 (не управляемый LVM). В противном случае читайте дальше.

Не-Xen с cloud-init/cloud-tools: один раздел ext3/ext4 (без LVM)

Вы должны настроить эти элементы для вашего образа:

  • Таблица разделов для образа описывает исходный размер образа.
  • Файловая система образа заполняет исходный размер образа.

Затем в процессе загрузки необходимо:

  • Измените таблицу разделов, чтобы она знала о дополнительном пространстве:
    • Если вы не используете LVM, вы должны изменить таблицу, чтобы расширить существующий корневой раздел, чтобы охватить это дополнительное пространство.
    • Если вы используете LVM, вы можете добавить новую запись LVM в таблицу разделов, создать новый физический том LVM, добавить его в группу томов и расширить логический раздел корневым томом.
  • Измените размер файловой системы корневого тома.

В зависимости от вашего дистрибутива, самый простой способ поддержать это — установить в образ:

  • пакет облачной инициализации,
  • пакет cloud-utils, который в Ubuntu и Debian также содержит инструмент для расширения разделов,
  • если вы используете Fedora, CentOS 7 или RHEL 7, пакет cloud-utils-growpart, который содержит инструмент для расширения разделов,
  • если вы используете Ubuntu или Debian, пакет cloud-initramfs-growroot, который поддерживает изменение размера корневого раздела при первой загрузке.

После установки этих пакетов образ выполняет изменение размера корневого раздела при загрузке. Например, в файле /etc/rc.local.

Если вы не можете установить cloud-initramfs-tools, у Роберта Плестеньяка есть проект GitHub под названием linux-rootfs-resize, который содержит скрипты, которые обновляют виртуальный диск с помощью GrowPart, чтобы размер образа правильно изменялся при загрузке.

Если вы можете установить пакеты cloud-init и cloud-utils, мы рекомендуем при создании образов создавать один раздел ext3 или ext4 (не управляемый LVM).

Не-Xen без cloud-init/cloud-tools: LVM

Если вы не можете установить cloud-init и cloud-tools внутри своей гостевой системы и хотите поддерживать изменение размера, вы должны написать сценарий, который ваш образ запускает при загрузке, чтобы изменить таблицу разделов. В этом случае мы рекомендуем использовать LVM для управления вашими разделами. Из-за ограничения ядра Linux (на момент написания этой статьи) вы не можете изменить таблицу разделов необработанного диска, на котором в настоящее время смонтированы разделы, но вы можете сделать это для LVM.

Ваш скрипт должен делать что-то вроде следующего:

  1. Определить, есть ли на диске дополнительное место. Например, проанализируйте вывод команды parted /dev/sda –script «print free».
  2. Создайте новый раздел LVM с дополнительным пространством. Например, parted /dev/sda –script «mkpart lvm…».
  3. Создайте новый физический том. Например, pvcreate /dev/sda6.
  4. Расширьте группу томов с помощью этого физического раздела. Например, vgextend vg00 /dev/sda6.
  5. Расширьте логический том, содержащий корневой раздел, на размер пространства. Например, lvextend /dev/mapper/node-root /dev/sda6.
  6. Измените размер корневой файловой системы. Например, resize2fs /dev/mapper/node-root.

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

Нет жестко заданной информации о MAC-адресе

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

  • Замените /etc/udev/rules.d/70-persistent-net.rules пустым файлом (содержит правила сохранения сети, включая MAC-адрес).
  • Замените /lib/udev/rules.d/75-persistent-net-generator.rules пустым файлом (это создаст указанный выше файл).
  • Удалите строку HWADDR из /etc/sysconfig/network-scripts/ifcfg-eth0 в образах на основе Fedora.

Примечание

Если вы удалите файлы постоянных сетевых правил, вы можете получить предупреждение ядра udev во время загрузки, поэтому мы рекомендуем заменить их пустыми файлами.

Убедитесь, что сервер ssh запущен

Вы должны установить сервер ssh в образ и убедиться, что он запускается при загрузке, иначе вы не сможете подключиться к своей виртуальной машине с помощью ssh, когда он загружается внутри OpenStack. Этот пакет обычно называется openssh-server.

Отключить брандмауэр

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

Доступ к виртуальной машине с помощью открытого ключа ssh (cloud-init)

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

Если в образе присутствуют и агент XenAPI, и cloud-init, cloud-init обрабатывает внедрение ssh-ключа. Система предполагает наличие cloud-init, если образ имеет свойство cloud_init_installed.

Используйте cloud-init для получения открытого ключа

Пакет cloud-init автоматически извлекает открытый ключ с сервера метаданных и помещает ключ в учетную запись. Аккаунт зависит от дистрибутива. На виртуальных машинах на основе Ubuntu учетная запись называется ubuntu, на виртуальных машинах на основе Fedora учетная запись называется fedora, а на виртуальных машинах на основе CentOS учетная запись называется centos.

Вы можете изменить имя учетной записи, используемой cloud-init, отредактировав файл /etc/cloud/cloud.cfg и добавив строку с другим пользователем. Например, чтобы настроить cloud-init для размещения ключа в учетной записи с именем admin, используйте следующий синтаксис в файле конфигурации:

users:
  - name: admin
    (...)

Написание собственного скрипт для получения открытого ключа

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

Чтобы получить открытый ключ ssh и добавить его в учетную запись root, отредактируйте файл /etc/rc.local и добавьте следующие строки перед строкой touch /var/lock/subsys/local. Этот фрагмент кода взят из шаблона rackerjoe oz-image-build для CentOS 6:

if [ ! -d /root/.ssh ]; then
  mkdir -p /root/.ssh
  chmod 700 /root/.ssh
fi

# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
  curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/metadata-key 2>/dev/null
  if [ $? -eq 0 ]; then
    cat /tmp/metadata-key >> /root/.ssh/authorized_keys
    chmod 0600 /root/.ssh/authorized_keys
    restorecon /root/.ssh/authorized_keys
    rm -f /tmp/metadata-key
    echo "Successfully retrieved public key from instance metadata"
    echo "*****************"
    echo "AUTHORIZED KEYS"
    echo "*****************"
    cat /root/.ssh/authorized_keys
    echo "*****************"
  else
    FAILED=`expr $FAILED + 1`
    if [ $FAILED -ge $ATTEMPTS ]; then
      echo "Failed to retrieve public key from instance metadata after $FAILED attempts, quitting"
      break
    fi
    echo "Could not retrieve public key from instance metadata (attempt #$FAILED/$ATTEMPTS), retrying in 5 seconds..."
    sleep 5
 fi
 done

Примечание

Некоторые клиенты VNC заменяют : (двоеточие) на ; (точка с запятой) и _ (подчеркивание) с - (дефис). Если вы редактируете файл через сеанс VNC, убедитесь, что это http: не http; и author_keys не авторизованные ключи.

Обработка пользовательских данных и других метаданных (cloud-init)

В дополнение к открытому ключу ssh образу может потребоваться дополнительная информация от OpenStack, например, для предоставления пользовательских данных виртуальным машинам, ​​которые пользователь отправил при запросе образа. Например, вы можете задать имя хоста виртуальной машины при загрузке. Или вы можете настроить свой образ так, чтобы он выполнял содержимое пользовательских данных как скрипт при загрузке.

Вы можете получить доступ к этой информации через службу метаданных или обратившись к метаданным на конфигурационном диске. Поскольку служба метаданных OpenStack совместима с версией 2009-04-04 службы метаданных Amazon EC2, обратитесь к документации Amazon EC2 по использованию метаданных виртуальной машины, чтобы узнать, как получить пользовательские данные.

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

Убедитесь, что образ записывает загрузочный журнал в консоль

Вы должны настроить образ так, чтобы ядро ​​записывало загрузочный журнал на устройство ttyS0. В частности, аргументы console=tty0 console=ttyS0,115200n8 должны передаваться ядру при загрузке.

Если ваш образ использует grub2 в качестве загрузчика, в файле конфигурации grub должна быть строка. Например, /boot/grub/grub.cfg выглядит примерно так:

linux /boot/vmlinuz-3.2.0-49-virtual root=UUID=6d2231e4-0975-4f35-a94f-56738c1a8150 ro console=tty0 console=ttyS0,115200n8

Если console=tty0 console=ttyS0,115200n8 не отображается, вы должны изменить конфигурацию grub. Как правило, вам не следует обновлять файл grub.cfg напрямую, так как он создается автоматически. Вместо этого вам следует отредактировать файл /etc/default/grub и изменить значение переменной GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"

Затем обновите конфигурацию grub. В операционных системах на основе Debian, таких как Ubuntu, выполните следующую команду:

# update-grub

В системах на основе Fedora, таких как RHEL и CentOS, а также в openSUSE выполните следующую команду:

# grub2-mkconfig -o /boot/grub2/grub.cfg

Паравиртуализированная поддержка Xen в ядре (только гипервизор Xen)

До ядра Linux версии 3.0 основная ветвь ядра Linux не поддерживала паравиртуализированные экземпляры виртуальных машин Xen (то, что Xen называет гостями DomU). Если вы используете гипервизор Xen с паравиртуализацией и хотите создать образ для более старого дистрибутива Linux с ядром до версии 3.0, вы должны убедиться, что образ загружает ядро, скомпилированное с поддержкой Xen.

Управление кешем образов

Используйте параметры в файле nova.conf, чтобы указать, будут ли и как долго неиспользуемые базовые образы храниться в /var/lib/nova/instances/_base/. Если вы настроили динамическую миграцию инстансов, все ваши вычислительные узлы используют один общий каталог /var/lib/nova/instances/.

Параметры конфигурации управления кешем образов:

Параметр конфигурации = значение по умолчанию (Тип) Описание
preallocate_images=none

(StrOpt) Режим предварительного выделения образа виртуальной машины:

none Подготовка хранилища не происходит заранее.

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

remove_unused_base_images=True (BoolOpt) Следует ли удалять неиспользуемые базовые образы? Если установлено значение True, интервал, с которым удаляются базовые образы, задается следующими двумя параметрами. Если установлено значение False, базовые образы никогда не удаляются службой Compute.
remove_unused_original_minimum_age_seconds=86400 (IntOpt) Неиспользуемые базовые образы со сроком жизни меньше указанного значения не удаляются. По умолчанию 86400 секунд или 24 часа.
remove_unused_resized_minimum_age_seconds=3600 (IntOpt) Неиспользуемые измененные образы со сроком жизни меньше указанного значения не удаляются. По умолчанию 3600 секунд или один час.

Чтобы увидеть, как настройки влияют на удаление запущенной виртуальной машины, проверьте каталог, в котором хранятся образы:

# ls -lash /var/lib/nova/instances/_base/

В файле /var/log/compute/compute.log найдите идентификатор:

2012-02-18 04:24:17 41389 WARNING nova.virt.libvirt.imagecache [-] Unknown base file: /var/lib/nova/instances/_base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3_20
2012-02-18 04:24:17 41389 INFO nova.virt.libvirt.imagecache [-] Removable base files: /var/lib/nova/instances/_base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3 /var/lib/nova/instances/_base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3_20
2012-02-18 04:24:17 41389 INFO nova.virt.libvirt.imagecache [-] Removing base file: /var/lib/nova/instances/_base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3

Поскольку 86400 секунд (24 часа) — это время по умолчанию для remove_unused_original_minimum_age_seconds, вы можете либо дождаться этого интервала времени, чтобы удалился базовый образ, либо установить более короткий период времени в файле nova.conf. Перезапустите все службы nova после изменения параметра в файле nova.conf.

Изменение образа

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

Примечание

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

guestfish

Программа guestfish — это инструмент из проекта libguestfs, который позволяет изменять файлы внутри образа виртуальной машины.

Примечание

guestfish не монтирует образ напрямую в локальную файловую систему. Вместо этого он предоставляет вам интерфейс оболочки, который позволяет вам просматривать, редактировать и удалять файлы. Многие команды guestfish, такие как touch, chmod и rm, напоминают традиционные команды bash.

Пример сессии guestfish

Иногда необходимо изменить образ виртуальной машины, чтобы удалить все следы MAC-адреса, который был назначен карте виртуального сетевого интерфейса при первом создании образа. Это связано с тем, что MAC-адрес отличается при загрузке образов виртуальных машин. В этом примере показано, как использовать guestfish для удаления ссылок на старый MAC-адрес путем удаления файла /etc/udev/rules.d/70-persistent-net.rules и удаления строки HWADDR из файла /etc/sysconfig/network-scripts/ifcfg-eth0 file.

Предположим, у вас есть образ CentOS qcow2 с именем centos63_desktop.img. Смонтируйте образ в режиме чтения-записи от имени пользователя root следующим образом:

# guestfish --rw -a centos63_desktop.img

Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.

Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell

><fs>

Это запускает сеанс guestfish.

Примечание

Приглашение guestfish выглядит как рыба: ><fs>.

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

><fs> run
  1. Теперь мы можем просмотреть файловые системы в образе с помощью команды list-filesystems:

    ><fs> list-filesystems
    /dev/vda1: ext4
    /dev/vg_centosbase/lv_root: ext4
    /dev/vg_centosbase/lv_swap: swap
    
  2. Нам нужно смонтировать логический том, содержащий корневой раздел:

    ><fs> mount /dev/vg_centosbase/lv_root /
    
  3. Далее мы хотим удалить файл. Мы можем использовать команду rm guestfish, которая работает так же, как и в традиционной оболочке:

    ><fs> rm /etc/udev/rules.d/70-persistent-net.rules
    
  4. Мы хотим отредактировать файл ifcfg-eth0, чтобы удалить строку HWADDR. Команда редактирования скопирует файл на хост, вызовет ваш редактор, а затем скопирует файл обратно:

    ><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
    
  5. Если вы хотите изменить этот образ для загрузки ядра 8021q во время загрузки, вы должны создать исполняемый скрипт в каталоге /etc/sysconfig/modules/. Вы можете использовать команду touch guestfish, чтобы создать пустой файл, команду edit, чтобы отредактировать его, и команду chmod, чтобы сделать его исполняемым:

    ><fs> touch /etc/sysconfig/modules/8021q.modules
    ><fs> edit /etc/sysconfig/modules/8021q.modules
    
  6. Добавляем в файл следующую строку и сохраняем:

    modprobe 8021q
    
  7. Затем мы устанавливаем исполняемый файл:

    ><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
    
  8. Мы закончили, поэтому мы можем выйти с помощью команды exit:

    ><fs> exit
    

Дальнейшая работа с guestfish

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

guestmount

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

  1. Например, чтобы смонтировать корневой раздел нашего образа centos63_desktop.qcow2 в /mnt, мы можем сделать:

    # guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt
    
  2. Если бы мы не знали заранее, какая точка монтирования находится в гостевой системе, мы могли бы использовать флаг -i (inspect), чтобы указать guestmount автоматически определять, какую точку монтирования использовать:

    # guestmount -a centos63_desktop.qcow2 -i --rw /mnt
    
  3. После монтирования мы можем делать такие вещи, как список установленных пакетов, используя rpm:

    # rpm -qa --dbpath /mnt/var/lib/rpm
    
  4. После этого размонтируем:

    # umount /mnt
    

virt-* tools

В проекте libguestfs есть ряд других полезных инструментов, в том числе:

  • virt-edit для редактирования файла внутри образа.
  • virt-df для отображения свободного места внутри образа.
  • virt-resize для изменения размера образа.
  • virt-sysprep для подготовки образа к распространению (например, для удаления ключей хоста SSH, удаления информации о MAC-адресе или удаления учетных записей пользователей).
  • virt-sparsify для создания разреженного образа.
  • virt-p2v для преобразования физической машины в образ, работающий на KVM.
  • virt-v2v для преобразования образов Xen и VMware в образы KVM.

Изменение одного файла внутри образа

В этом примере показано, как использовать virt-edit для изменения файла. Команда может принимать либо имя файла в качестве аргумента с флагом -a, либо доменное имя в качестве аргумента с флагом -d. В следующих примерах показано, как использовать это для изменения файла /etc/shadow в запущенной виртуальной машнеи с доменным именем libvirt instance-000000e1:

# virsh shutdown instance-000000e1
# virt-edit -d instance-000000e1 /etc/shadow
# virsh start instance-000000e1

Изменение размера образа

Вот пример того, как использовать virt-resize для изменения размера образа. Предположим, у нас есть образ Windows размером 16 ГБ в формате qcow2, размер которого мы хотим изменить до 50 ГБ.

Во-первых, мы используем virt-filesystems для идентификации разделов:

# virt-filesystems --long --parts --blkdevs -h -a /data/images/win2012.qcow2
Name       Type       MBR  Size  Parent
/dev/sda1  partition  07   350M  /dev/sda
/dev/sda2  partition  07   16G   /dev/sda
/dev/sda   device     -    16G   -

В данном случае мы хотим изменить размер раздела /dev/sda2. Мы создаем новый образ qcow2 и используем команду virt-resize для записи измененной копии оригинала в новый образ:

# qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G
# virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 \
  /data/images/win2012-50gb.qcow2
Examining /data/images/win2012.qcow2 ...
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 15.7G to 49.7G.  The
    filesystem ntfs on /dev/sda2 will be expanded using the
    'ntfsresize' method.

**********
Setting up initial partition table on /data/images/win2012-50gb.qcow2 ...
Copying /dev/sda1 ...
 100% [                                                                 ] 00:00
Copying /dev/sda2 ...
 100% [                                                                 ] 00:00
Expanding /dev/sda2 using the 'ntfsresize' method ...

Resize operation completed with no errors. Before deleting the old
disk, carefully check that the resized disk boots and works correctly.

Loop-устройства, kpartx, сетевые блочные устройства

Если у вас нет доступа к libguestfs, вы можете монтировать файловые системы образов непосредственно на хосте, используя loop-устройства, kpartx и сетевые блочные устройства.

Предупреждение

Монтирование ненадежных гостевых образов с помощью инструментов, описанных в этом разделе, представляет собой угрозу безопасности, всегда используйте инструменты libguestfs, такие как guestfish и guestmount, если у вас есть к ним доступ. Более подробно о том, почему вы никогда не должны монтировать образы гостевых дисков в хост-ОС можно прочитать в соответствующей статье.

Монтирование необработанного образа (без LVM)

Если у вас есть необработанный образ виртуальной машины, который не использует LVM для управления своими разделами, используйте команду lossup, чтобы найти неиспользуемое петлевое устройство:

# losetup -f
/dev/loop0

В этом примере /dev/loop0 свободен. Свяжите loop-устройство с необработанным образом:

# losetup /dev/loop0 fedora17.img

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

# mount /dev/loop0 /mnt

Если образ имеет несколько разделов, используйте kpartx, чтобы представить разделы как отдельные устройства (например, /dev/mapper/loop0p1), а затем смонтируйте раздел, соответствующий корневой файловой системе:

# kpartx -av /dev/loop0

Если в образе есть, скажем, три раздела (/boot, /, swap), для каждого раздела должно быть создано одно новое устройство:

$ ls -l /dev/mapper/loop0p*
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/mapper/loop0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/mapper/loop0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/mapper/loop0p3

Чтобы смонтировать второй раздел как root выполните:

# mkdir /mnt/image
# mount /dev/mapper/loop0p2 /mnt/image

По окончании выполните очистку:

# umount /mnt/image
# rmdir /mnt/image
# kpartx -d /dev/loop0
# losetup -d /dev/loop0

Монтирование необработанного образа (с помощью LVM)

Если ваши разделы управляются с помощью LVM, используйте команды lossup и kpartx, как в предыдущем примере, чтобы открыть разделы хосту:

# losetup -f
/dev/loop0
# losetup /dev/loop0 rhel62.img
# kpartx -av /dev/loop0

Затем вам нужно использовать команду vgscan, чтобы идентифицировать группы томов LVM, а затем команду vgchange, чтобы представить тома как устройства:

# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt

Очистите, когда закончите:

# umount /mnt
# vgchange -an vg_rhel62x8664
# kpartx -d /dev/loop0
# losetup -d /dev/loop0

Монтирование образа qcow2 (без LVM)

Вам нужен модуль ядра nbd (сетевое блочное устройство), загруженный для монтирования образов qcow2. Это загрузит его с поддержкой 16 блочных устройств, что подходит для наших целей. Выполните от root:

# modprobe nbd max_part=16

Предполагая, что первое блочное устройство (/dev/nbd0) в настоящее время не используется, мы можем открыть разделы диска с помощью команд qemu-nbd и partprobe, от root:

# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0

Если образ имеет, скажем, три раздела (/boot, /, swap), для каждого раздела должно быть создано одно новое устройство:

$ ls -l /dev/nbd0*
brw-rw---- 1 root disk 43, 48 2012-03-05 15:32 /dev/nbd0
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/nbd0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/nbd0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/nbd0p3

Примечание

Если выбранное вами сетевое блочное устройство уже использовалось, первоначальная команда qemu-nbd завершится автоматически, и файлы устройства /dev/nbd0p{1,2,3} не будут созданы.

Если разделы образа не управляются с помощью LVM, их можно смонтировать напрямую:

# mkdir /mnt/image
# mount /dev/nbd0p2 /mnt/image

Очистите, когда закончите:

# umount /mnt/image
# rmdir /mnt/image
# qemu-nbd -d /dev/nbd0

Монтирование образа qcow2 (с LVM)

Если разделы образа управляются с помощью LVM, после использования qemu-nbd и partprobe необходимо использовать vgscan и vgchange -ay, чтобы представить разделы LVM как устройства, которые можно монтировать:

# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt

Очистите, когда закончите:

# umount /mnt
# vgchange -an vg_rhel62x8664
# qemu-nbd -d /dev/nbd0

Создание образов вручную

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

Чтобы создать новый образ, вам понадобится установочный CD или DVD ISO-файл для гостевой операционной системы. Вам также потребуется доступ к инструменту виртуализации. Для этого можно использовать KVM. Или, если у вас есть инструмент виртуализации рабочего стола с графическим интерфейсом (например, VMware Fusion или VirtualBox), вы можете использовать его вместо этого. Преобразуйте файл в необработанный, как только вы закончите.

Когда вы создаете новый образ виртуальной машины, вам нужно будет подключиться к графической консоли гипервизора, которая действует как дисплей виртуальной машины и позволяет вам взаимодействовать с установщиком гостевой операционной системы с помощью клавиатуры и мыши. KVM может отображать графическую консоль, используя протокол VNC (Virtual Network Computing) или более новый протокол SPICE. Здесь мы будем использовать протокол VNC, так как вы, скорее всего, найдете клиент VNC, который работает на вашем локальном рабочем столе.

  1. Убедитесь, что сеть libvirt по умолчанию работает.

    Перед запуском виртуальной машины с libvirt убедитесь, что сеть libvirt по умолчанию запущена. Эта сеть должна быть активной, чтобы ваша виртуальная машина могла подключаться к сети. Запуск этой сети создаст мост Linux (обычно называемый virbr0), правила iptables и процесс dnsmasq, который будет служить DHCP-сервером.

    Чтобы убедиться, что сеть по умолчанию libvirt включена, используйте команду virsh net-list и убедитесь, что сеть по умолчанию активна:

    # virsh net-list
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    

    Если сеть не активна, запустите ее, выполнив:

    # virsh net-start default
    
  2. Используйте графический интерфейс virt-manager X11.

    Если вы планируете создать образ виртуальной машины на машине, которая может запускать приложения X11, самый простой способ сделать это — использовать графический интерфейс virt-manager, который можно установить как пакет virt-manager как в Fedora, так и в Debian. основанные системы. Этот графический интерфейс имеет встроенный клиент VNC, который позволит вам просматривать и взаимодействовать с графической консолью гостя.

    Если вы создаете образ на headless сервере и у вас есть X-сервер на локальной машине, вы можете запустить virt-manager, используя переадресацию ssh X11 для доступа к графическому интерфейсу. Поскольку virt-manager напрямую взаимодействует с libvirt, для доступа к нему обычно требуются права root. Если вы можете использовать ssh напрямую как root (или с пользователем, у которого есть права на взаимодействие с libvirt), выполните:

    $ ssh -X root@server virt-manager
    

    Если учетная запись, которую вы используете для подключения по ssh к вашему серверу, не имеет разрешений на запуск libvirt, но имеет привилегии sudo, выполните:

    $ ssh -X user@server
    $ sudo virt-manager
    

    Примечание

    Флаг -X, переданный в ssh, активирует пересылку X11 через ssh. Если это не сработает, попробуйте заменить его флагом -Y.

    Нажмите кнопку «Создать новую виртуальную машину» в левом верхнем углу или перейдите в «Файл» - «Новая виртуальная машина». Затем следуйте инструкциям:

    ../../_images/virt-manager.png

    Создание машины

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

    Примечание

    При использовании образов в формате qcow2 перед установкой следует отметить параметр «Настроить конфигурацию», перейти к свойствам диска и явно выбрать формат qcow2. Это гарантирует, что размер диска виртуальной машины будет правильным.

  3. Используйте virt-install и подключитесь с помощью локального клиента VNC.

    Если вы не хотите использовать virt-manager (например, вы не хотите устанавливать зависимости на свой сервер, у вас нет локально работающего X-сервера, не работает переадресация X11 по SSH), вы можете использовать инструмент virt-install для загрузки виртуальной машины через libvirt и подключения к графической консоли с VNC-клиента, установленного на вашем локальном компьютере.

    Поскольку VNC является стандартным протоколом, доступно несколько клиентов, реализующих спецификацию VNC, включая TigerVNC (несколько платформ), TightVNC (несколько платформ), RealVNC (несколько платформ), Chicken (Mac OS X), Krde (KDE), Vinagre (ГНОМ).

    В следующем примере показано, как использовать команду qemu-img для создания пустого файла образа и команду virt-install для запуска виртуальной машины с использованием этого файла образа. От пользователя root:

    # qemu-img create -f qcow2 /tmp/centos.qcow2 10G
    # virt-install --virt-type kvm --name centos --ram 1024 \
      --disk /tmp/centos.qcow2,format=qcow2 \
      --network network=default \
      --graphics vnc,listen=0.0.0.0 --noautoconsole \
      --os-type=linux --os-variant=centos7.0 \
      --location=/data/isos/CentOS-7-x86_64-NetInstall-1611.iso
    
    Starting install...
    Creating domain...                     |    0 B     00:00
    Domain installation still in progress. You can reconnect to
    the console to complete the installation process.
    

    Гипервизор KVM запускает виртуальную машину с именем libvirt, centos, с 1024 МБ ОЗУ. Виртуальная машина также имеет виртуальный привод CD-ROM, связанный с файлом /data/isos/CentOS-7-x86_64-NetInstall-1611.iso, и локальный жесткий диск емкостью 10 ГБ в формате qcow2, который хранится на хосте в /tmp. /centos.qcow2. Он настраивает сеть для использования сети libvirt по умолчанию. Существует сервер VNC, который прослушивает все интерфейсы, и libvirt не будет пытаться запустить клиент VNC автоматически или пытаться отобразить текстовую консоль (–no-autoconsole). Наконец, libvirt попытается оптимизировать конфигурацию для гостевой ОС Linux с дистрибутивом CentOS 7.

    Примечание

    При использовании сети libvirt по умолчанию libvirt подключает интерфейс виртуальной машины к мосту с именем virbr0. Существует процесс dnsmasq, управляемый libvirt, который выдает IP-адрес в подсети 192.168.122.0/24, а у libvirt есть правила iptables для выполнения NAT для IP-адресов в этой подсети.

    Запустите команду osinfo-query os, чтобы увидеть диапазон разрешенных опций –os-variant.

    Используйте команду virsh vncdisplay vm-name, чтобы получить номер порта VNC:

    # virsh vncdisplay centos
    :1
    

    В приведенном выше примере гостевой Centos использует отображение VNC: 1, что соответствует TCP-порту 5901. Вы должны иметь возможность подключить клиент VNC, работающий на вашем локальном компьютере, для отображения: 1 на удаленном компьютере и шаг за шагом через процесс установки.

Образ CentOS

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

Загрузка установочного ISO-образа CentOS:

  1. Перейдите на страницу зеркал CentOS.
  2. Щелкните одну из ссылок HTTP в правом столбце рядом с одним из зеркал.
  3. Щелкните ссылку на папку версии CentOS, которую вы хотите использовать. Например, 7/.
  4. Щелкните ссылку папки isos/.
  5. Щелкните ссылку папки x86_64/ для 64-разрядных образов.
  6. Щелкните ISO-образ netinstall, который вы хотите загрузить. Например, CentOS-7-x86_64-NetInstall-1611.iso — хороший выбор, поскольку это образ меньшего размера, который загружает недостающие пакеты из Интернета во время установки.

Примечание

Описываемые ниже команды предполагают использование АРМ, фукнкционирующего под управлением ОС Linux.

Запуск процесса установки

Запустите процесс установки с помощью virt-manager или команды virt-install, как описано выше. Если вы используете команду virt-install, не забудьте подключить ваш VNC-клиент к виртуальной машине.

Предположить, что:

Образ вашей виртуальной машины называется centos; вам нужно это имя, когда вы используете команды virsh для управления состоянием образа.

Вы сохранили ISO-образ netinstall в каталоге /data/isos.

Если вы используете команду virt-install, команды должны выглядеть примерно так:

# qemu-img create -f qcow2 /tmp/centos.qcow2 10G
# virt-install --virt-type kvm --name centos --ram 1024 \
  --disk /tmp/centos.qcow2,format=qcow2 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --os-type=linux --os-variant=centos7.0 \
  --location=/data/isos/CentOS-7-x86_64-NetInstall-1611.iso

В приведенном выше примере:

  • имя виртуальной машины – centos;
  • файл ISO-образа сохранен в каталоге ./data/isos.

Важно

При использовании команды virt-install необходимо подключить клиент VNC к виртуальной машине (опция --graphics vnc, listen=0.0.0.0).

Пошаговая установка

В начальном меню загрузки установщика выберите параметр «Установить CentOS 7». После запуска программы установки выберите предпочитаемый язык и нажмите «Продолжить», чтобы перейти к сводке установки. Примите значения по умолчанию.

../../_images/centos-install.png

Установка CentOS 7

Изменить статус Ethernet:

Настройка Ethernet по умолчанию выключена. Измените настройку Ethernet с OFF на ON. В частности, убедитесь, что для параметра «Метод настроек IPv4» установлено значение «Автоматический (DHCP)», которое используется по умолчанию.

../../_images/centos-tcpip.png

Изменение статуса Ethernet

Имя хоста:

Программа установки позволяет вам выбрать имя хоста (по умолчанию localhost.localdomain). Вы устанавливаете пакет cloud-init позже, который устанавливает имя хоста при загрузке, когда новая виртуальная машина инициализируется с использованием этого образа.

Укажите установщику веб-сервер CentOS:

В зависимости от версии CentOS сетевой установщик требует, чтобы пользователь указал либо URL-адрес, либо веб-сайт и каталог CentOS, соответствующий одному из зеркал CentOS. Если программа установки запрашивает один URL-адрес, допустимым URL-адресом может быть http://mirror.umd.edu/centos/7/os/x86_64.

Примечание

Рассмотрите возможность использования других зеркал в качестве альтернативы mirror.umd.edu.

../../_images/centos-url-setup.png

Ввод веб-сервера CentOS

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

  • Имя веб-сайта: mirror.umd.edu
  • Каталог CentOS: centos/7/os/x86_64

Для получения дополнительной информацией ознакомьтесь со страницей зеркала CentOS, чтобы получить полный список зеркал, щелкните ссылку HTTP зеркала, чтобы получить имя веб-сайта зеркала.

Устройства хранения данных:

При появлении запроса о том, какой тип устройств использует ваша установка, выберите Virtio Block Device.

Разметить диски:

Существуют различные варианты разметки дисков. Установка по умолчанию использует разделы LVM и создает три раздела (/boot, /, swap), что работает нормально. В качестве альтернативы вы можете создать один раздел ext4, смонтированный в /, который также отлично работает.

Если вы не уверены, используйте схему разделов по умолчанию для установщика. Хотя ни одна схема по своей сути не лучше другой, наличие раздела, который вы хотите динамически увеличивать, в конце списка позволит ему расти, не пересекая границу другого раздела.

Выберите вариант установки:

Пройдите установку, используя параметры по умолчанию. Самое простое, что нужно сделать, это выбрать установку Minimal Install, которая устанавливает SSH-сервер.

Установите пароль root:

Во время установки не забудьте установить пароль root при появлении запроса.

Отсоединение CD-ROM и перезагрузка компьютера

Дождитесь завершения установки:

../../_images/centos-complete.png

Завершение установки

Чтобы извлечь диск с помощью команды virsh, libvirt требует, чтобы вы подключили пустой диск к той же цели, к которой ранее был подключен CD-ROM, что может быть hda. Вы можете подтвердить соответствующую цель с помощью команды virsh dumpxml vm-image:

# virsh dumpxml centos
<domain type='kvm' id='19'>
  <name>centos</name>
...
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
...
</domain>

Выполните следующие команды с хоста, чтобы извлечь диск и перезагрузиться с помощью virsh от имени пользователя root. Если вы используете virt-manager, приведенные ниже команды будут работать, но вы также можете использовать графический интерфейс, чтобы отключить и перезагрузить его, вручную остановив и запустив:

# virsh attach-disk --type cdrom --mode readonly centos "" hda
# virsh reboot centos

Установка службы ACPI

Чтобы позволить гипервизору перезагрузить или завершить работу виртуальной машины, вы должны установить и запустить службу acpid в гостевой системе.

Войдите в систему с правами root в гостевой системе CentOS и выполните следующие команды, чтобы установить службу ACPI и настроить ее запуск при загрузке системы:

# yum install acpid # systemctl enable acpid

Настройка получения метаданных

Виртуальная машина должна взаимодействовать со службой метаданных для выполнения нескольких задач при запуске. Например, виртуальная машина должна получить открытый ключ ssh и запустить сценарий пользовательских данных. Чтобы убедиться, что машина выполняет эти задачи, используйте один из следующих методов:

Установите RPM cloud-init, который является портом пакета cloud-init Ubuntu. Это рекомендуемый подход.

Измените файл /etc/rc.local, чтобы получить нужную информацию из службы метаданных, как описано в следующем разделе.

Использование cloud-init для получения открытого ключа

Пакет cloud-init автоматически извлекает открытый ключ с сервера метаданных и помещает ключ в учетную запись. Установите cloud-init внутри гостевой системы CentOS, выполнив:

# yum install cloud-init

Аккаунт зависит от дистрибутива. На виртуальных машинах на базе CentOS учетная запись называется centos.

Вы можете изменить имя учетной записи, используемой cloud-init, отредактировав файл /etc/cloud/cloud.cfg и добавив строку с другим пользователем. Например, чтобы настроить cloud-init для размещения ключа в учетной записи с именем admin, используйте следующий синтаксис в файле конфигурации:

users:
  - name: admin
    (...)

Установка cloud-utils-growpart, чтобы разрешить изменение размера разделов

Чтобы правильно изменить размер корневого раздела, установите пакет cloud-utils-growpart, который содержит необходимые инструменты, позволяющие изменять размер диска с помощью cloud-init:

# yum install cloud-utils-growpart

Написание скрипта для получения открытого ключа (если нет cloud-init)

Если вы не можете установить пакет cloud-init в свой образ, чтобы получить открытый ключ ssh и добавить его в учетную запись root, отредактируйте файл /etc/rc.d/rc.local и добавьте следующие строки перед коснитесь строки /var/lock/subsys/local:

if [ ! -d /root/.ssh ]; then
  mkdir -p /root/.ssh
  chmod 700 /root/.ssh
fi

# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
  curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key \
    > /tmp/metadata-key 2>/dev/null
  if [ \$? -eq 0 ]; then
    cat /tmp/metadata-key >> /root/.ssh/authorized_keys
    chmod 0600 /root/.ssh/authorized_keys
    restorecon /root/.ssh/authorized_keys
    rm -f /tmp/metadata-key
    echo "Successfully retrieved public key from instance metadata"
    echo "*****************"
    echo "AUTHORIZED KEYS"
    echo "*****************"
    cat /root/.ssh/authorized_keys
    echo "*****************"
  fi
done

Примечание

Некоторые клиенты VNC заменяют двоеточие (:) точкой с запятой (;), а знак подчеркивания (_) — дефисом (-). Обязательно укажите http:, а не http;. Обязательно укажите авторизованные_ключи и неавторизованные ключи.

Примечание

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

Поскольку служба метаданных OpenStack совместима с версией 2009-04-04 службы метаданных Amazon EC2, обратитесь к документации Amazon EC2 по использованию метаданных машины, чтобы узнать, как получить пользовательские данные.

Отключение протокола zeroconf

Чтобы виртуальная машина могла получить доступ к службе метаданных, вы должны отключить маршрут zeroconf по умолчанию:

# echo "NOZEROCONF=yes" >> /etc/sysconfig/network

Настройка консоли

Чтобы команда nova console-log правильно работала в CentOS 7, вам может потребоваться выполнить следующие шаги:

  1. Отредактируйте файл /etc/default/grub и настройте параметр GRUB_CMDLINE_LINUX. Удалите rhgb quiet и добавьте к опции console=tty0 console=ttyS0,115200n8. Например:

    ...
     GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap console=tty0 console=ttyS0,115200n8"
    
  2. Выполните следующую команду, чтобы сохранить изменения:

    # grub2-mkconfig -o /boot/grub2/grub.cfg
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3.10.0-229.14.1.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.14.1.el7.x86_64.img
    Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img
    Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-605f01abef434fb98dd1309e774b72ba
    Found initrd image: /boot/initramfs-0-rescue-605f01abef434fb98dd1309e774b72ba.img
    done
    

Завершение работы виртуальной машины

Изнутри виртуальной машины запустите от имени root:

# poweroff

Очистка (удаление сведений о MAC-адресе)

Операционная система записывает MAC-адрес виртуальной карты Ethernet в таких местах, как /etc/sysconfig/network-scripts/ifcfg-eth0, во время процесса виртуальной машины. Однако каждый раз при загрузке образа виртуальная карта Ethernet будет иметь другой MAC-адрес, поэтому эту информацию необходимо удалить из файла конфигурации.

Примечание

При новой загрузке очередной гостевой ОС из образа виртуальная карта Ethernet, используемая виртуальной машиной, будет иметь другой MAC-адрес. Устаревшая информация должна быть удалена из конфигурационного файла!

Существует утилита под названием virt-sysprep, которая выполняет различные задачи очистки, такие как удаление ссылок на MAC-адреса. Он очистит образ виртуальной машины на месте:

# virt-sysprep -d centos

Очистка истории командной строки:

history -c

Очистка кэша yum:

yum clean all

Отмена определения домена libvirt

Теперь, когда вы можете загрузить образ в службу образов, вам больше не нужно, чтобы этот образ виртуальной машины управлялся libvirt. Используйте команду virsh undefine vm-image, чтобы сообщить libvirt:

# virsh undefine centos

Образ готов

Базовый файл образа, созданный с помощью команды qemu-img create, готов к загрузке. Например, вы можете загрузить образ /tmp/centos.qcow2 в службу образов с помощью команды создания образа openstack. Дополнительные сведения смотрите в списке команд python-openstackclient.

Образ Ubuntu

Этот пример устанавливает образ Ubuntu 18.04 (Bionic Beaver). Чтобы создать образ для другой версии Ubuntu, следуйте этим шагам с различиями.

Примечание

Описываемые ниже команды предполагают использование АРМ, фукнкционирующего под управлением ОС Linux.

Важно

При использовании virt-install необходимо подключить клиент VNC к виртуальной машине (опция --graphics vnc, listen=0.0.0.0).

Загрузка установочного ISO-образа Ubuntu

Поскольку цель состоит в том, чтобы сделать базовый образ минимально возможного размера, в этом примере используется ISO-образ сетевой установки. ISO-образ сетевой установки Ubuntu 64-bit 18.04 находится на странице загрузки Ubuntu.

Запуск процесса установки

Запустите процесс установки с помощью virt-manager или virt-install, как описано в предыдущем разделе. Если вы используете virt-install, не забудьте подключить ваш VNC-клиент к виртуальной машине.

Предположим, что имя образа вашей виртуальной машины — ubuntu-18.04, которое вам нужно знать, когда вы используете команды virsh для управления состоянием образа.

Если вы используете virt-manager, команды должны выглядеть примерно так:

# wget -O /var/lib/libvirt/boot/bionic-mini.iso \
  http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/mini.iso
# chown libvirt-qemu:kvm /var/lib/libvirt/boot/bionic-mini.iso
# qemu-img create -f qcow2 /var/lib/libvirt/images/bionic.qcow2 10G
# chown libvirt-qemu:kvm /var/lib/libvirt/images/bionic.qcow2
# virt-install --virt-type kvm --name bionic --ram 1024 \
  --cdrom=/var/lib/libvirt/boot/bionic-mini.iso \
  --disk /var/lib/libvirt/images/bionic.qcow2,bus=virtio,size=10,format=qcow2 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --os-type=linux --os-variant=ubuntu18.04

Пошаговая установка

В начальном меню загрузки установщика выберите опцию «Установить». Пройдитесь по подсказкам установщика, значения по умолчанию должны подойти:

../../_images/ubuntu-install.png

Окно установщика

Hostname

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

Выбор зеркала

Зеркало по умолчанию, предложенное установщиком, должно подойти.

Пошаговая установка

Пройдите установку, используя параметры по умолчанию. При запросе имени пользователя по умолчанию - ubuntu.

Разделение дисков

Существуют различные варианты разделения дисков. Установка по умолчанию будет использовать раздел LVM и создаст три раздела (/boot, /, swap), и это будет корректно. В качестве альтернативы вы можете создать один раздел ext4, смонтированный в «/», это также должно работать корректно.

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

Автоматические обновления

Установщик Ubuntu спросит, как вы хотите управлять обновлениями в вашей системе. Этот параметр зависит от вашего конкретного варианта использования. Если ваши виртуальные машины будут подключены к Интернету, мы рекомендуем «Автоматически устанавливать обновления безопасности».

Выбор ПО: сервер OpenSSH

Выберите сервер OpenSSH, чтобы вы могли подключаться к виртуальной машине по протоколу SSH, когда она запускается в облаке OpenStack:

../../_images/ubuntu-software-selection.png

Выбор сервера

Установка загрузчика GRUB

Выберите «Да», когда вас спросят об установке загрузчика GRUB в основную загрузочную запись.

../../_images/ubuntu-grub.png

Установка загрузчика GRUB

С дополнительными сведениями о настройке Grub можно ознакомиться в разделе «Убедитесь, что образ записывает загрузочный журнал в консоль».

Вход в только что созданный образ

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

Установка cloud-init

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

Установите пакет cloud-init:

# apt install cloud-init

При создании образов Ubuntu cloud-init должен быть явно настроен для используемого источника метаданных. Сервер метаданных OpenStack эмулирует службу метаданных EC2, используемую образами в Amazon EC2.

Чтобы настроить источник метаданных, который будет использоваться образом, запустите команду dpkg-reconfigure для пакета cloud-init. При появлении запроса выберите источник данных EC2:

# dpkg-reconfigure cloud-init

Аккаунт зависит от дистрибутива. На виртуальных машинах на базе Ubuntu учетная запись называется ubuntu. На виртуальных машинах на базе Fedora учетная запись называется ec2-user.

Вы можете изменить имя учетной записи, используемой cloud-init, отредактировав файл /etc/cloud/cloud.cfg и добавив строку с другим пользователем. Например, чтобы настроить cloud-init для размещения ключа в учетной записи с именем admin, используйте следующий синтаксис в файле конфигурации:

users:
  • name: admin (…)

Завершение работы виртуальной машины

Изнутри виртуальной машины от root:

# /sbin/shutdown -h now

Очистка (удаление сведений о MAC-адресе)

В процессе установки операционная система записывает MAC-адрес виртуальной карты Ethernet в таких местах, как /etc/udev/rules.d/70-persistent-net.rules. Однако каждый раз при загрузке образа виртуальная карта Ethernet будет иметь другой MAC-адрес, поэтому эту информацию необходимо удалить из файла конфигурации.

Существует утилита под названием virt-sysprep, которая выполняет различные задачи очистки, такие как удаление ссылок на MAC-адреса. Он очистит образ виртуальной машины на месте:

# virt-sysprep -d bionic

Отмена определения домена libvirt

Теперь, когда образ готов к загрузке в службу образов, вам больше не нужно, чтобы этот образ виртуальной машины управлялся libvirt. Используйте команду virsh undefine vm-image, чтобы сообщить libvirt:

# virsh undefine bionic

Образ готов

Базовый файл образа, созданный с помощью команды qemu-img create, например /var/lib/libvirt/images/bionic.qcow2, теперь готов для загрузки в службу образов с помощью команды создания образа openstack. Дополнительные сведения в руководстве пользователя Glance.

Образ Fedora

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

Загрузка установочного ISO-образа Fedora

  1. Посетите сайт загрузки Fedora.
  2. Перейдите на страницу загрузки сервера Fedora для ISO-образа сервера Fedora.
  3. Выберите образ ISO, который вы хотите загрузить.
  4. Например, Netinstall Image — хороший выбор, так как это образ меньшего размера, который загружает отсутствующие пакеты из Интернета во время установки.

Запуск процесса установки

Запустите процесс установки с помощью virt-manager или команды virt-install, как описано выше. Если вы используете команду virt-install, не забудьте подключить ваш VNC-клиент к виртуальной машине.

Предположим, что:

  • Образ вашей виртуальной машины называется fedora; вам нужно это имя, когда вы используете команды virsh для управления состоянием образа.
  • Вы сохранили ISO-образ netinstall в каталоге /tmp.

Если вы используете команду virt-install, команды должны выглядеть примерно так:

# qemu-img create -f qcow2 /tmp/fedora.qcow2 10G
# virt-install --virt-type kvm --name fedora --ram 1024 \
  --disk /tmp/fedora.qcow2,format=qcow2 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --os-type=linux --os-variant=fedora23 \
  --location=/tmp/Fedora-Server-netinst-x86_64-25-1.3.iso

Пошаговая установка

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

Просмотр статуса Ethernet

Убедитесь, что настройка Ethernet включена. Кроме того, убедитесь, что для параметра «Метод настроек IPv4» установлено значение «Автоматически (DHCP)», которое используется по умолчанию.

Hostname

Программа установки позволяет вам выбрать имя хоста. По умолчанию (localhost.localdomain) все в порядке. Вы устанавливаете пакет cloud-init позже, который устанавливает имя хоста при загрузке, когда новая виртуальная машина инициализируется с использованием этого образа.

Разделение дисков

Существуют различные варианты разметки дисков. Установка по умолчанию использует разделы LVM и создает три раздела (/boot, /, swap), что работает нормально. В качестве альтернативы вы можете создать один раздел ext4, смонтированный в /, который также отлично работает.

Если вы не уверены, используйте схему разделов по умолчанию для установщика. Хотя ни одна схема по своей сути не лучше другой, наличие раздела, который вы хотите динамически увеличивать, в конце списка позволит ему расти, не пересекая границу другого раздела.

Выбор программного обеспечения для установки

Пройдите установку, используя параметры по умолчанию. Самое простое, что нужно сделать, это выбрать установку Minimal Install, которая устанавливает SSH-сервер.

Установка пароля root

Во время установки не забудьте установить пароль root при появлении запроса.

Отсоединение CD-ROM и перезагрузка компьютера

Дождитесь завершения установки.

Чтобы извлечь диск с помощью команды virsh, libvirt требует, чтобы вы подключили пустой диск к той же цели, к которой ранее был подключен CD-ROM, что может быть hda. Вы можете подтвердить соответствующую цель с помощью команды virsh dumpxml vm-image:

# virsh dumpxml fedora
<domain type='kvm' id='30'>
  <name>fedora</name>
...
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/tmp/Fedora-Server-netinst-x86_64-25-1.3.iso'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
...
</domain>

Выполните следующие команды на хосте, чтобы извлечь диск и перезагрузиться с помощью virsh от имени пользователя root. Если вы используете virt-manager, приведенные ниже команды будут работать, но вы также можете использовать графический интерфейс, чтобы отключить и перезагрузить его, вручную остановив и запустив:

# virsh attach-disk --type cdrom --mode readonly fedora "" hda
# virsh reboot fedora

Установка службы ACPI

Чтобы позволить гипервизору перезагрузить или завершить работу виртуальной машины, вы должны установить и запустить службу acpid в гостевой системе.

Войдите в гостевую систему Fedora как root и выполните следующие команды, чтобы установить службу ACPI и настроить ее для запуска при загрузке системы:

# dnf install acpid
# systemctl enable acpid

Настройка cloud-init для получения метаданных

Виртуальная машина должна взаимодействовать со службой метаданных для выполнения нескольких задач при запуске. Например, машина должна получить открытый ключ ssh и запустить сценарий пользовательских данных. Чтобы убедиться, что машина выполняет эти задачи, используйте пакет cloud-init.

Пакет cloud-init автоматически извлекает открытый ключ с сервера метаданных и помещает ключ в учетную запись. Установите cloud-init внутри гостевой системы Fedora, выполнив:

# yum install cloud-init

Аккаунт зависит от дистрибутива. На виртуальных машинах на базе Fedora учетная запись называется fedora.

Вы можете изменить имя учетной записи, используемой cloud-init, отредактировав файл /etc/cloud/cloud.cfg и добавив строку с другим пользователем. Например, чтобы настроить cloud-init для размещения ключа в учетной записи с именем admin, используйте следующий синтаксис в файле конфигурации:

users:
  - name: admin
    (...)

Установка cloud-utils-growpart, чтобы разрешить изменение размера разделов

Чтобы правильно изменить размер корневого раздела, установите пакет cloud-utils-growpart, который содержит необходимые инструменты, позволяющие изменять размер диска с помощью cloud-init:

# dnf install cloud-utils-growpart

Отключение маршрута zeroconf

Чтобы виртуальная машина могла получить доступ к службе метаданных, вы должны отключить маршрут zeroconf по умолчанию:

# echo "NOZEROCONF=yes" >> /etc/sysconfig/network

Настройка консоля

Чтобы команда nova console-log правильно работала в Fedora, вам может потребоваться выполнить следующие шаги:

  1. Отредактируйте файл /etc/default/grub и настройте параметр GRUB_CMDLINE_LINUX. Удалите rhgb quiet и добавьте к опции console=tty0 console=ttyS0,115200n8. Например:

    … GRUB_CMDLINE_LINUX=»rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap console=tty0 console=ttyS0,115200n8»

  2. Выполните следующую команду, чтобы сохранить изменения:

    # grub2-mkconfig -o /boot/grub2/grub.cfg
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-4.10.10-200.fc25.x86_64
    Found initrd image: /boot/initramfs-4.10.10-200.fc25.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-c613978614c7426ea3e550527f63710c
    Found initrd image: /boot/initramfs-0-rescue-c613978614c7426ea3e550527f63710c.img
    done
    

Завершение работы виртуальной машины

Изнутри виртуальной машины запустите от имени root:

# poweroff

Очистка (удаление сведений о MAC-адресе)

Операционная система записывает MAC-адрес виртуальной карты Ethernet в таких местах, как /etc/sysconfig/network-scripts/ifcfg-eth0. Однако каждый раз при загрузке образа виртуальная карта Ethernet будет иметь другой MAC-адрес, поэтому эту информацию необходимо удалить из файла конфигурации.

Существует утилита под названием virt-sysprep, которая выполняет различные задачи очистки, такие как удаление ссылок на MAC-адреса. Он очистит образ виртуальной машины на месте:

# virt-sysprep -d fedora

Отмена определения домена libvirt

Теперь, когда вы можете загрузить образ в службу образов, вам больше не нужно, чтобы этот образ виртуальной машины управлялся libvirt. Используйте команду virsh undefine vm-image, чтобы сообщить libvirt:

# virsh undefine fedora

Образ готов

Базовый файл образа, созданный с помощью команды qemu-img create, готов к загрузке. Например, вы можете загрузить образ /tmp/fedora.qcow2 в службу образов с помощью команды создания образа openstack. Дополнительные сведения в списке команд python-openstackclient.

Ниже представлен способ выгрузки образа из консоли.

При помощи инструмента сетевого (безопасного) копирования потребуется выгрузить (оптимизированный) образ диска в формате qcow2 на управляющий узел. Выполните команду:

scp <ИМЯ_ОБРАЗА>.qcow2 root@tester:/

где

ИМЯ_ОБРАЗА – centos, bionic, fedora (в зависимости от установленной гостевой ОС).

Затем необходимо выполнить команду импорта (образа) в среду Openstack:

openstack image create \
--disk-format qcow2 \
--container-format bare \
--public --file <название_образа>.qcow2 <ИМЯ_ОБРАЗА> \
--property hw_vif_multiqueue_enabled=true \
--property hw_scsi_model=virtio-scsi \
--property hw_disk_bus=scsi \
--property hw_qemu_guest_agent=yes \
--property hw_video_model=qxl \
--property os_require_quiesce=yes \
--property os_distro=windows \
--property os_type=windows

Образ Microsoft Windows

В этом примере создается образ Windows Server 2012 qcow2 с помощью команды virt-install и гипервизора KVM.

  1. Выполните следующие действия, чтобы подготовить установку:

    Загрузите установочный ISO-образ Windows Server 2012, доступны на веб-сайте Microsoft (требуется регистрация).

    Загрузите подписанный ISO-образ драйверов VirtIO с веб-сайта Fedora.

    Создайте образ qcow2 размером 15 ГБ:

    $ qemu-img create -f qcow2 ws2012.qcow2 15G
    
  2. Запустите установку Windows Server 2012 с помощью команды virt-install:

    # virt-install --connect qemu:///system \
      --name ws2012 --ram 2048 --vcpus 2 \
      --network network=default,model=virtio \
      --disk path=ws2012.qcow2,format=qcow2,device=disk,bus=virtio \
      --cdrom /path/to/en_windows_server_2012_x64_dvd.iso \
      --disk path=/path/to/virtio-win-0.1-XX.iso,device=cdrom \
      --vnc --os-type windows --os-variant win2k12 \
      --os-distro windows --os-version 2012
    

    Используйте virt-manager или virt-viewer для подключения к виртуальной машине и запуска установки Windows.

  3. Включите драйверы VirtIO. По умолчанию установщик Windows не обнаруживает диск.

  4. Загрузите драйверы VirtIO SCSI и сетевые драйверы, выбрав цель установки при появлении запроса. Щелкните Загрузить драйвер и просмотрите файловую систему.

  5. Выберите папку E:\virtio-win-0.1XX\viostor\2k12\amd64. Установщик Windows отображает список драйверов для установки.

  6. Выберите драйверы VirtIO SCSI.

  7. Щелкните «Загрузить драйвер», просмотрите файловую систему и выберите папку E:\NETKVM\2k12\amd64.

  8. Выберите сетевые драйверы и продолжите установку. После завершения установки виртуальная машина перезапускается.

  9. При появлении запроса укажите пароль для администратора.

  10. Войдите в систему как администратор и запустите командное окно.

  11. Завершите установку драйверов VirtIO, выполнив следующую команду:

    C:\pnputil -i -a E:\virtio-win-0.1XX\viostor\2k12\amd64\*.INF
    
  12. Чтобы позволить Cloudbase-Init запускать скрипты во время загрузки виртуальной машины, установите политику выполнения PowerShell без ограничений:

    C:\powershell
    C:\Set-ExecutionPolicy Unrestricted
    
  13. Загрузите и установите Cloudbase-Init:

    C:\Invoke-WebRequest -UseBasicParsing https://cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi -OutFile cloudbaseinit.msi
    C:\.\cloudbaseinit.msi
    

    В окне параметров конфигурации измените следующие параметры:

    • Имя пользователя: Administrator
    • Сетевой адаптер для настройки: Ethernet-адаптер Red Hat VirtIO
    • Последовательный порт для ведения журнала: COM1

    После завершения установки в окне Complete the Cloudbase-Init Setup Wizard установите флажки Run Sysprep и Shutdown и нажмите Finish.

    Дождитесь выключения машины.

Ваш образ готов к загрузке в службу образов:

$ openstack image create --disk-format qcow2 --file ws2012.qcow2 WS2012

Образ FreeBSD

В этом примере создается минимальный образ FreeBSD, совместимый с OpenStack и bsd-cloudinit. Программа bsd-cloudinit поддерживается независимо и находится в активной разработке. Лучший источник информации о текущем состоянии проекта — bsd-cloudinit.

KVM с драйверами virtio используется в качестве платформы виртуализации, поскольку она наиболее широко используется операторами OpenStack. Если вы используете другую платформу для облачной виртуализации, используйте ту же платформу на этапе создания образа.

В этом примере показано, как создать образ FreeBSD 10. Чтобы создать образ FreeBSD 9.2, в выполняемых действиях должны быть соответствующие отличия.

Чтобы создать образ FreeBSD:

  1. Создаем виртуальный диск:

    $ qemu-img create -f qcow2 freebsd.qcow2 1G
    

    Минимальный поддерживаемый размер диска для FreeBSD составляет 1 ГБ. Поскольку цель состоит в том, чтобы сделать минимально возможный базовый образ, в примере используется этот минимальный размер. Этого размера достаточно, чтобы включить дополнительные документы, игры и коллекции lib32. Чтобы включить коллекцию портов, добавьте еще 1 ГБ. Чтобы включить src, добавьте 512 МБ.

  2. Получаем установщик ISO:

    $ curl ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-bootonly.iso \
      > FreeBSD-10.1-RELEASE-amd64-bootonly.iso
    
  3. Запускаем виртуальную машину на локальной рабочей станции. Используем тот же гипервизор, виртуальный диск и драйверы виртуальной сети, что и в производственной среде.

    Следующая команда использует минимальный объем оперативной памяти, равный 256 МБ:

    $ kvm -smp 1 -m 256 -cdrom FreeBSD-10.1-RELEASE-amd64-bootonly.iso \
     -drive if=virtio,file=freebsd.qcow2 \
     -net nic,model=virtio -net user
    

    Вы можете указать до 1 ГБ дополнительной оперативной памяти, чтобы ускорить процесс установки.

    Эта виртуальная машина также должна иметь доступ в Интернет для загрузки пакетов.

    Примечание

    Используя один и тот же гипервизор, вы можете быть уверены, что эмулируете те же устройства, которые существуют в производственной среде. Однако, если вы используете полную аппаратную виртуализацию вместо паравиртуализации, вам не нужно использовать один и тот же гипервизор; вы должны использовать тот же тип виртуализированного оборудования, потому что имена устройств FreeBSD связаны с их драйверами. Если имя вашего корневого блочного устройства или основного сетевого интерфейса в рабочей среде отличается от имен, использованных при создании образа, могут возникнуть ошибки.

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

  4. Чтобы установить операционную систему, выполните следующие действия внутри виртуальной машины:

    • При появлении запроса выберите запуск ISO в режиме установки.

    • Примите раскладку клавиатуры по умолчанию или выберите подходящую Вам раскладку.

    • Укажите имя хоста для вашего образа. Если вы используете bsd-cloudinit, оно переопределяет это значение именем, предоставленным OpenStack, когда машина загружается из этого образа.

    • При появлении запроса о дополнительных документах, играх, lib32, портах и системных компонентах src выберите только те, которые вам нужны. Можно иметь полнофункциональную установку без выбора дополнительных компонентов. Как отмечалось ранее, минимальная система с виртуальным диском объемом 1 ГБ поддерживает документы, игры и lib32 включительно. Для коллекции портов требуется как минимум 1 ГБ дополнительного пространства и, возможно, больше, если вы планируете установить много портов. Для коллекции src требуется дополнительно 512 МБ.

    • Настройте основной сетевой интерфейс для использования DHCP. В этом примере, в котором используется сетевое устройство virtio, этот интерфейс называется vtnet0.

    • Примите сетевое зеркало по умолчанию.

    • Настройте разбиение диска.

      Разбиение диска на разделы является критическим элементом процесса создания образа, и в настоящее время автоматически созданная схема разбиения по умолчанию не работает с bsd-cloudinit.

      Поскольку значение по умолчанию не работает, необходимо выбрать ручное разбиение. Редактор разделов должен отображать только одно блочное устройство. Если вы используете virtio для драйвера дискового устройства, он называется vtbd0. Выберите это устройство и выполните команду создания три раза:

      – Выберите «Создать», чтобы создать таблицу разделов. Это действие используется по умолчанию, когда не существует таблицы разделов. Затем выберите из списка таблицу разделов GPT GUID. Этот выбор является значением по умолчанию.

      – Создайте два раздела: раздел freebsd-boot размером 64 КБ без точки монтирования и раздел freebsd-ufs с точкой монтирования / со всем оставшимся свободным пространством.

      На следующем рисунке показана заполненная таблица разделов с виртуальным диском объемом 1 ГБ:

      ../../_images/virt-manager.png

      Таблица разделов

      Выберите «Готово», а затем «Подтвердить», чтобы зафиксировать изменения.

      Примечание

      Если вы измените этот пример, корневой раздел, смонтированный на /, должен быть последним разделом на диске, чтобы он мог расширяться во время выполнения до размера диска, предоставляемого вашим типом экземпляра. Также обратите внимание, что в настоящее время в bsd-cloudinit жестко закодировано предположение, что это второй раздел.

  5. Выберите корневой пароль.

  6. Выберите часовой пояс CMOS.

  7. Виртуализированная CMOS почти всегда хранит свое время в формате UTC, поэтому, если вы не знаете иного, выберите UTC.

  8. Выберите часовой пояс, соответствующий вашей среде.

  9. Из списка служб для запуска при загрузке необходимо выбрать ssh. При желании выберите другие услуги.

  10. При желании добавьте пользователей.

  11. В настоящее время вам не обязательно добавлять пользователей. Программа bsd-cloudinit добавляет учетную запись пользователя freebsd, если она не существует. Ключи ssh для этого пользователя связаны с OpenStack. Чтобы настроить эту учетную запись пользователя, вы можете создать ее сейчас. Например, вы можете настроить оболочку для пользователя.

  12. Окончательная конфигурация

  13. Это меню позволяет обновить предыдущие настройки. Проверьте правильность настроек и нажмите «Выход».

  14. После выхода вы можете открыть оболочку для выполнения шагов ручной настройки. Выберите «Да», чтобы внести несколько изменений, характерных для OpenStack:

    • Настройте консоль:

      # echo 'console="comconsole,vidconsole"' >> /boot/loader.conf
      

      Эта команда настраивает вывод консоли на последовательную консоль, отображаемую nova consolelog, и на видеоконсоль для сайтов с настроенным VNC или Spice.

  15. Минимизируйте задержку загрузки:

    # echo 'autoboot_delay="1"' >> /boot/loader.conf
    
  16. Загрузите последнюю версию bsd-cloudinit-installer. Команды загрузки различаются между FreeBSD 10.1 и 9.2 из-за различий в том, как команда fetch обрабатывает URL-адреса HTTPS.

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

    # pkg install ca_root_nss
    # fetch --ca-cert=/usr/local/share/certs/ca-root-nss.crt \
      https://raw.github.com/pellaeon/bsd-cloudinit-installer/master/installer.sh
    

    Выборка FreeBSD 9.2 не поддерживает одноранговую проверку для https. Для FreeBSD 9.2 выполните следующую команду:

    # fetch https://raw.github.com/pellaeon/bsd-cloudinit-installer/master/installer.sh
    
  17. Запустите установщик:

    # sh ./installer.sh
    

    Введите эту команду, чтобы загрузить и установить последний пакет bsd-cloudinit, а также установить необходимые компоненты.

  18. Установите sudo и настройте пользователя freebsd на доступ без пароля:

    # pkg install sudo
    # echo 'freebsd ALL=(ALL) NOPASSWD: ALL' > /usr/local/etc/sudoers.d/10-cloudinit
    
  19. Выключите систему:

    # shutdown -h now
    

Поддержка инструментов для создания образов

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

Конструктор образов дисков

Diskimage-builder — это инструмент для автоматического создания образов дисков, который поддерживает множество дистрибутивов и архитектур. Diskimage builder (DIB) может создавать образы для Fedora, Red Hat Enterprise Linux, Ubuntu, Debian, CentOS и openSUSE. DIB организован в виде ряда элементов, которые строятся друг над другом для создания определенных образов.

Чтобы создать образ, вызовите следующий скрипт:

# disk-image-create ubuntu vm

В этом примере создается общий загрузочный образ Ubuntu последней версии.

Дальнейшую настройку можно выполнить, установив переменные среды или добавив элементы в командную строку:

# disk-image-create -a armhf ubuntu vm

В этом примере создается образ, как и раньше, но для архитектуры руки. Другие элементы доступны в исходном каталоге git и задокументированы в документации по элементам diskimage-builder.

Oz

Oz — это инструмент командной строки, который автоматизирует процесс создания файла образа виртуальной машины. Oz — это приложение Python, которое взаимодействует с KVM, чтобы выполнить процесс установки виртуальной машины.

Он использует предопределенный набор файлов кикстарта (системы на основе Red Hat) и предварительных файлов (системы на основе Debian) для поддерживаемых операционных систем, а также может использоваться для создания образов Microsoft Windows.

Полное описание Oz выходит за рамки этого документа, но мы приведем пример. Вы можете найти дополнительные примеры файлов шаблонов Oz на GitHub по адресу rcbops/oz-image-build/tree/master/templates. Вот как вы могли бы создать образ CentOS 6.4 с Oz.

Создайте файл шаблона с именем centos64.tdl со следующим содержимым. Единственная запись, которую вам нужно будет изменить, — это содержимое <rootpw>:

<template>
  <name>centos64</name>
  <os>
    <name>CentOS-6</name>
    <version>4</version>
    <arch>x86_64</arch>
    <install type='iso'>
      <iso>http://mirror.rackspace.com/CentOS/6/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso</iso>
    </install>
    <rootpw>CHANGE THIS TO YOUR ROOT PASSWORD</rootpw>
  </os>
  <description>CentOS 6.4 x86_64</description>
  <repositories>
    <repository name='epel-6'>
      <url>http://download.fedoraproject.org/pub/epel/6/$basearch</url>
      <signed>no</signed>
    </repository>
  </repositories>
  <packages>
    <package name='epel-release'/>
    <package name='cloud-utils'/>
    <package name='cloud-init'/>
  </packages>
  <commands>
    <command name='update'>
yum -y update
yum clean all
sed -i '/^HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0
echo -n > /etc/udev/rules.d/70-persistent-net.rules
echo -n > /lib/udev/rules.d/75-persistent-net-generator.rules
    </command>
  </commands>
</template>

Этот шаблон Oz указывает, где скачать установочный ISO-образ Centos 6.4. Oz будет использовать информацию о версии, чтобы определить, какой файл кикстарта использовать. В данном случае это будет RHEL6.auto. Он добавляет EPEL в качестве репозитория и устанавливает пакеты epel-release, cloud-utils и cloud-init, как указано в разделе пакетов файла.

После того, как Oz завершит первоначальную установку ОС с помощью файла кикстарта, он настраивает образ с помощью обновления. Он также удаляет любые ссылки на устройство eth0, которое создает libvirt, пока Oz выполняет настройку, как указано в разделе команд XML-файла.

Чтобы запустить это:

# oz-install -d3 -u centos64.tdl -x centos64-libvirt.xml
  • Флаг -d3 указывает Oz отображать информацию о состоянии во время работы.
  • -u говорит Oz выполнить настройку (установить дополнительные пакеты, запустить команды) после первоначальной установки.
  • Флаг -x сообщает Oz, какое имя файла использовать для записи XML-файла libvirt (в противном случае по умолчанию будет что-то вроде centos64Apr_03_2013-12:39:42).

Если вы не используете флаг -u или хотите отредактировать файл, чтобы выполнить дополнительные настройки, вы можете использовать команду oz-customize, используя XML-файл libvirt, который создает oz-install. Например:

# oz-customize -d3 centos64.tdl centos64-libvirt.xml

Oz вызовет libvirt для загрузки образа внутри KVM, затем Oz подключится к виртуальной машине по ssh и выполнит настройку.

VeeWee

VeeWee часто используется для создания блоков Vagrant, но его также можно использовать для создания образов KVM.

Packer

Packer — это инструмент для создания образов машин для нескольких платформ из единой исходной конфигурации.

image-bootstrap

image-bootstrap — это инструмент командной строки, который создает загрузочные образы виртуальных машин с поддержкой Arch, Debian, Gentoo, Ubuntu и подготовлен для использования с OpenStack.

imagefactory

imagefactory — это новый инструмент, предназначенный для автоматизации создания, преобразования и загрузки образов в различные облачные провайдеры. Он использует Oz в качестве серверной части и включает поддержку облаков на основе OpenStack.

KIWI

Конструктор образов ОС KIWI предоставляет сборщик образов операционной системы для различных поддерживаемых Linux аппаратных платформ, а также для виртуализации и облачных систем. Это позволяет создавать образы на основе openSUSE, SUSE Linux Enterprise и Red Hat Enterprise Linux. Документация openSUSE объясняет, как использовать KIWI.

virt-builder

Virt-Builder — это инструмент для быстрого создания новых виртуальных машин. Вы можете создавать различные виртуальные машины для локального или облачного использования, обычно в течение нескольких минут или меньше. Virt-builder также имеет множество способов настройки этих виртуальных машин. Все запускается из командной строки и ничто не требует привилегий root, поэтому автоматизация и создание сценариев просты.

Чтобы создать образ, вызовите следующий скрипт:

# virt-builder fedora-23 -o image.qcow2 --format qcow2 \
  --update --selinux-relabel --size 20G

Чтобы получить список операционных систем, доступных для установки:

$ virt-builder --list

Чтобы импортировать его в libvirt с помощью virsh:

# virt-install --name fedora --ram 2048 \
  --disk path=image.qcow2,format=qcow2 --import

openstack-debian-images

openstack-debian-images — это инструмент, который Debian использует для создания своего официального образа OpenStack. Он состоит из одного очень простого сценария оболочки, который легко понять и модифицировать. Он поддерживает Grub и Syslinux, BIOS или EFI, архитектуру amd64 и arm64.

openstack-debian-images также можно использовать для создания загрузочного образа непосредственно на жестком диске вместо использования установщика Debian.

Чтобы создать образ, введите следующее:

# build-openstack-debian-image --release stretch

Для дальнейшей настройки образа можно добавить дополнительные параметры:

# build-openstack-debian-image --release stretch \
  --hook-script /root/my-hook-script.sh \
  --debootstrap-url http://ftp.fr.debian.org/debian \
  --sources.list-mirror http://ftp.fr.debian.org/debian \
  --login myusername \
  --extra-packages vim,emacs

Файл /root/my-hook-script.sh получит 2 переменные среды: путь BODI_CHROOT_PATH, по которому смонтирован образ, и BODI_RELEASE — имя запускаемой версии Debian. Вот пример настройки motd:

# #!/bin/sh
  set -e
  echo "My message" >${BODI_CHROOT_PATH}/etc/motd

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

windows-openstack-imaging-tools

windows-openstack-imaging-tools — это модуль PowerShell, который автоматизирует создание образа Windows для OpenStack и поддерживает создание образов типов VHDX, QCOW2, RAW и VMDK.

Для упрощения установки инструмент опубликован в виде модуля PowerShellGallery WindowsImageBuilder.

Пример сборки образа Windows:

# Install and import WindowsImageBuilder module from PowerShellGallery
Install-Module WindowsImageBuilder -Force
Import-Module WindowsImageBuilder

New-WindowsImageConfig -ConfigFilePath ".\windows-image-config.ini"
# Update the configuration file to fit your specific use case
# Extensive information for all the configuration can be found here:
# https://github.com/cloudbase/windows-openstack-imaging-tools/blob/master/Config.psm1#L21

# Generate the Windows image
New-WindowsOnlineImage -ConfigFilePath ".\windows-image-config.ini"

Требования:

  • Хост Windows с включенной виртуализацией Hyper-V, поддержкой PowerShell >=v4 и комплектом для оценки и развертывания Windows (ADK).
  • Установочный ISO-образ или DVD-диск Windows.
  • Драйверы, совместимые с Windows, если этого требует целевая среда. Например, драйверы VirtIO, сетевой карты или адаптера хранилища.
  • Git-окружение.

Конвертация между форматами образов

Конвертация образов из одного формата в другой, как правило, не вызывает затруднений.

Конвертация qemu-img: raw, qcow2, qed, vdi, vmdk, vhd

Команда qemu-img convert может выполнять преобразование между несколькими форматами, включая qcow2, qed, raw, vdi, vhd и vmdk:

Формат образа Аргумент для qemu-img
QCOW2 (KVM, Xen) qcow2
QED (KVM) qed
raw raw
VDI (VirtualBox) vdi
VHD (Hyper-V) vpc
VMDK (VMware) vmdk

В этом примере файл необработанного образа с именем image.img будет преобразован в файл образа qcow2:

$ qemu-img convert -f raw -O qcow2 image.img image.qcow2

Выполните следующую команду, чтобы преобразовать файл образа vmdk в необработанный файл образа:

$ qemu-img convert -f vmdk -O raw image.vmdk image.img

Выполните следующую команду, чтобы преобразовать файл образа vmdk в файл образа qcow2:

$ qemu-img convert -f vmdk -O qcow2 image.vmdk image.qcow2

Примечание

Флаг формата -f является необязательным. Если опущено, qemu-img попытается определить формат образа.

При преобразовании файла образа в Windows убедитесь, что установлен драйвер virtio. В противном случае вы получите синий экран при запуске образа из-за отсутствия драйвера virtio. Другой вариант — установить свойства образа, как показано ниже, при обновлении образа в службе образов, чтобы избежать этой проблемы, но это значительно снизит производительность виртуальной машины:

$ openstack image set --property hw_disk_bus='ide' image_name_or_id

VBoxManage: VDI (VirtualBox) в raw

Если вы создали образ VDI с помощью VirtualBox, вы можете преобразовать его в необработанный формат с помощью инструмента командной строки VBoxManage, который поставляется с VirtualBox. В Mac OS X и Linux VirtualBox по умолчанию хранит образы в каталоге ~/VirtualBox VMs/. В следующем примере создается необработанный образ в текущем каталоге из образа VirtualBox VDI:

$ VBoxManage clonehd ~/VirtualBox\ VMs/image.vdi image.img --format raw

Обмен образами

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

Примечание

В OpenStack Image API статус участника образа служит трем целям:

Статус члена определяет, появляется ли образ в списке образов потребителя. Если статус члена образа принят, образ появляется в списке образов потребителя. В противном случае образ не появится в списке. Образ может использоваться до тех пор, пока потребитель знает идентификатор образа.

Статус участника можно использовать для фильтрации списка образов потребителя.

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

Производители и потребители образов имеют разные возможности и обязанности в отношении обмена образами, которые показаны в следующем списке:

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

Совместное использование образа

Следующая процедура представляет собой рабочий процесс для обмена образами после создания образа.

Связь между производителем образа и потребителем, как описано в этом примере, должна быть организована независимо от OpenStack Image API. Потребитель и производитель могут отправлять уведомления по электронной почте, телефону, Twitter или другим каналам:

  1. Производитель публикует информацию о доступности определенных образов для просмотра потребителями.
  2. Потенциальный потребитель предоставляет производителю идентификатор проекта потребителя. При желании производитель может запросить адрес электронной почты потребителя для целей уведомления, но это выходит за рамки API.
  3. Производитель предоставляет общий доступ к образу потребителю с помощью операции API-интерфейса Create image member.
  4. При желании производитель уведомляет потребителя о том, что образ был опубликован, и предоставляет идентификатор образа (UUID).
  5. Если потребитель хочет, чтобы образ отображался в списке образов, потребитель использует OpenStack Image API, чтобы изменить статус члена образа на принятый с помощью операции API обновления члена образа.
  6. Если впоследствии потребитель захочет скрыть образ, он использует OpenStack Image API, чтобы изменить статус члена образа на отклоненный. Если потребитель хочет скрыть образ, но готов к тому, что производитель напомнит ему о том, что образ доступен, потребитель использует OpenStack Image API, чтобы снова изменить статус члена образа на ожидающий, используя элемент «Обновить образ». Работа с API.

Создание скрипта для получения публичного ключа

Если в системе недоступна утилита cloud-init, то следует открыть для редактирования конфигурационный файл /etc/cloud/cloud.cfg.

Перед строкой cloud-init /etc/rc.d/rc.localtouch /var/lock/subsys/local необходимо добавить следующий код:

if [ ! -d /root/.ssh ]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key \
> /tmp/metadata-key 2>/dev/null
if [ \$? -eq 0 ]; then
cat /tmp/metadata-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
restorecon /root/.ssh/authorized_keys
rm -f /tmp/metadata-key
echo "Successfully retrieved public key from instance metadata"
echo "*****************"
echo "AUTHORIZED KEYS"
echo "*****************"
cat /root/.ssh/authorized_keys
echo "*****************"
fi
done

Примечание

Убедитесь, что использован символ «:», а не «;» и аналогично «_» (нижнее подчеркивание), а не дефис «-».

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

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

Пример настройки конфигурации cloud-init

Файл cloud-config – это специальный скрипт, предназначенный для запуска процесса cloud-init. Обычно он используются для начальной настройки при первой загрузке (сервера).

Ниже приведен пример базовой настройки cloud-config [3]. В обычных скриптовых файлах в первой строке указывается интерпретатор, который должен использоваться для выполнения файла. Соответственно, файл скрипта cloud-config должен начинаться со строки #cloud-config. Это сообщает cloud-init, что файл интерпретируется как файл cloud-config.

Чтобы определить нового пользователя в системе, используйте директиву users, которая приведена ниже (в примере):

#cloud-config
# Добавление групп в систему
# Ниже показан пример добавления членов группы ubuntu -- 'root' and 'sys'
# и пустой группы cloud-users.
groups:
  - ubuntu: [root,sys]
  - cloud-users

# Добавление пользователей в систему (после того как добавлены группы).
# Примечание:
#       Большинство конфигурационных опций не будут учитываться,
#       если пользователь уже существует.
#       Следующие опции являются исключениями и применимы только
#       к уже существующим пользователям:
#       - 'plain_text_passwd', 'hashed_passwd', 'lock_passwd', 'sudo',
#         'ssh_authorized_keys', 'ssh_redirect_user'.
users:
  - default
  - name: foobar
    gecos: Foo B. Bar
    primary_group: foobar
    groups: users
    selinux_user: staff_u
    expiredate: '2032-09-01'
    ssh_import_id: foobar
    lock_passwd: false
    passwd: <зашифрованная_последовательность>
  - name: barfoo
    gecos: Bar B. Foo
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    ssh_import_id: None
    lock_passwd: true
    ssh_authorized_keys:
      - <ssh pub key 1>
      - <ssh pub key 2>
  - name: cloudy
    gecos: Magic Cloud App Daemon User
    inactive: '5'
    system: true
  - name: fizzbuzz
    sudo: False
    ssh_authorized_keys:
      - <ssh pub key 1>
      - <ssh pub key 2>
  - snapuser: joe@joeuser.io
  - name: nosshlogins
    ssh_redirect_user: true

# Valid Values:
#   name: The user's login name
#   expiredate: Date on which the user's account will be disabled.
#   gecos: The user name's real name, i.e. "Bob B. Smith"
#   homedir: Optional. Set to the local path you want to use. Defaults to
#           /home/<username>
#   primary_group: define the primary group. Defaults to a new group created
#           named after the user.
#   groups:  Optional. Additional groups to add the user to. Defaults to none
#   selinux_user:  Optional. The SELinux user for the user's login, such as
#           "staff_u". When this is omitted the system will select the default
#           SELinux user.
#   lock_passwd: Defaults to true. Lock the password to disable password login
#   inactive: Number of days after password expires until account is disabled
#   passwd: The hash -- not the password itself -- of the password you want
#           to use for this user. You can generate a safe hash via:
#               mkpasswd --method=SHA-512 --rounds=4096
#           (the above command would create from stdin an SHA-512 password hash
#           with 4096 salt rounds)
#
#           Please note: while the use of a hashed password is better than
#               plain text, the use of this feature is not ideal. Also,
#               using a high number of salting rounds will help, but it should
#               not be relied upon.
#
#               To highlight this risk, running John the Ripper against the
#               example hash above, with a readily available wordlist, revealed
#               the true password in 12 seconds on a i7-2620QM.
#
#               In other words, this feature is a potential security risk and is
#               provided for your convenience only. If you do not fully trust the
#               medium over which your cloud-config will be transmitted, then you
#               should use SSH authentication only.
#
#               You have thus been warned.
#   no_create_home: When set to true, do not create home directory.
#   no_user_group: When set to true, do not create a group named after the user.
#   no_log_init: When set to true, do not initialize lastlog and faillog database.
#   ssh_import_id: Optional. Import SSH ids
#   ssh_authorized_keys: Optional. [list] Add keys to user's authorized keys file
#   ssh_redirect_user: Optional. [bool] Set true to block ssh logins for cloud
#       ssh public keys and emit a message redirecting logins to
#       use <default_username> instead. This option only disables cloud
#       provided public-keys. An error will be raised if ssh_authorized_keys
#       or ssh_import_id is provided for the same user.
#
#       ssh_authorized_keys.
#   sudo: Defaults to none. Accepts a sudo rule string, a list of sudo rule
#         strings or False to explicitly deny sudo usage. Examples:
#
#         Allow a user unrestricted sudo access.
#             sudo:  ALL=(ALL) NOPASSWD:ALL
#
#         Adding multiple sudo rule strings.
#             sudo:
#               - ALL=(ALL) NOPASSWD:/bin/mysql
#               - ALL=(ALL) ALL
#
#         Prevent sudo access for a user.
#             sudo: False
#
#         Note: Please double check your syntax and make sure it is valid.
#               cloud-init does not parse/check the syntax of the sudo
#               directive.
#   system: Create the user as a system user. This means no home directory.
#   snapuser: Create a Snappy (Ubuntu-Core) user via the snap create-user
#             command available on Ubuntu systems.  If the user has an account
#             on the Ubuntu SSO, specifying the email will allow snap to
#             request a username and any public ssh keys and will import
#             these into the system with username specifed by SSO account.
#             If 'username' is not set in SSO, then username will be the
#             shortname before the email domain.
#

# Default user creation:
#
# Unless you define users, you will get a 'ubuntu' user on ubuntu systems with the
# legacy permission (no password sudo, locked user, etc). If however, you want
# to have the 'ubuntu' user in addition to other users, you need to instruct
# cloud-init that you also want the default user. To do this use the following
# syntax:
#   users:
#     - default
#     - bob
#     - ....
#  foobar: ...
#
# users[0] (the first user in users) overrides the user directive.
#
# The 'default' user above references the distro's config:
# system_info:
#   default_user:
#     name: Ubuntu
#     plain_text_passwd: 'ubuntu'
#     home: /home/ubuntu
#     shell: /bin/bash
#     lock_passwd: True
#     gecos: Ubuntu
#     groups: [adm, audio, cdrom, dialout, floppy, video, plugdev, dip, netdev]