Руководство по работе с образами виртуальных машин OpenStack¶
Содержание
- Введение
- Получение образа
- Требования к образам
- Linux
- Разделы диска и изменение размера корневого раздела при загрузке (cloud-init)
- Xen: один раздел ext3/ext4 (без LVM)
- Не-Xen с cloud-init/cloud-tools: один раздел ext3/ext4 (без LVM)
- Не-Xen без cloud-init/cloud-tools: LVM
- Нет жестко заданной информации о MAC-адресе
- Убедитесь, что сервер ssh запущен
- Отключить брандмауэр
- Доступ к виртуальной машине с помощью открытого ключа ssh (cloud-init)
- Используйте cloud-init для получения открытого ключа
- Написание собственного скрипт для получения открытого ключа
- Обработка пользовательских данных и других метаданных (cloud-init)
- Убедитесь, что образ записывает загрузочный журнал в консоль
- Паравиртуализированная поддержка Xen в ядре (только гипервизор Xen)
- Управление кешем образов
- Linux
- Изменение образа
- Создание образов вручную
- Образ CentOS
- Загрузка установочного ISO-образа CentOS:
- Запуск процесса установки
- Пошаговая установка
- Отсоединение CD-ROM и перезагрузка компьютера
- Установка службы ACPI
- Настройка получения метаданных
- Использование cloud-init для получения открытого ключа
- Установка cloud-utils-growpart, чтобы разрешить изменение размера разделов
- Написание скрипта для получения открытого ключа (если нет cloud-init)
- Отключение протокола zeroconf
- Настройка консоли
- Завершение работы виртуальной машины
- Очистка (удаление сведений о MAC-адресе)
- Отмена определения домена libvirt
- Образ готов
- Образ Ubuntu
- Загрузка установочного ISO-образа Ubuntu
- Запуск процесса установки
- Пошаговая установка
- Hostname
- Выбор зеркала
- Пошаговая установка
- Разделение дисков
- Автоматические обновления
- Выбор ПО: сервер OpenSSH
- Установка загрузчика GRUB
- Вход в только что созданный образ
- Установка cloud-init
- Завершение работы виртуальной машины
- Очистка (удаление сведений о MAC-адресе)
- Отмена определения домена libvirt
- Образ готов
- Образ Fedora
- Загрузка установочного ISO-образа Fedora
- Запуск процесса установки
- Пошаговая установка
- Просмотр статуса Ethernet
- Hostname
- Разделение дисков
- Выбор программного обеспечения для установки
- Установка пароля root
- Отсоединение CD-ROM и перезагрузка компьютера
- Установка службы ACPI
- Настройка cloud-init для получения метаданных
- Установка cloud-utils-growpart, чтобы разрешить изменение размера разделов
- Отключение маршрута zeroconf
- Настройка консоля
- Завершение работы виртуальной машины
- Очистка (удаление сведений о MAC-адресе)
- Отмена определения домена libvirt
- Образ готов
- Образ Microsoft Windows
- Образ FreeBSD
- Образ CentOS
- Поддержка инструментов для создания образов
- Конвертация между форматами образов
В этом руководстве описывается, как получать, создавать и изменять образы виртуальных машин, совместимые с 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:
- Red Hat Enterprise Linux 8 KVM Guest Image
- Red Hat Enterprise Linux 7 KVM Guest Image
- Red Hat Enterprise Linux 6 KVM Guest Image
В облачном образе 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.
Ваш скрипт должен делать что-то вроде следующего:
- Определить, есть ли на диске дополнительное место. Например, проанализируйте вывод команды parted /dev/sda –script «print free».
- Создайте новый раздел LVM с дополнительным пространством. Например, parted /dev/sda –script «mkpart lvm…».
- Создайте новый физический том. Например, pvcreate /dev/sda6.
- Расширьте группу томов с помощью этого физического раздела. Например, vgextend vg00 /dev/sda6.
- Расширьте логический том, содержащий корневой раздел, на размер пространства. Например, lvextend /dev/mapper/node-root /dev/sda6.
- Измените размер корневой файловой системы. Например, 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
Хранилище полностью выделяется при запуске виртуальной машины. Образы |
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
Теперь мы можем просмотреть файловые системы в образе с помощью команды list-filesystems:
><fs> list-filesystems /dev/vda1: ext4 /dev/vg_centosbase/lv_root: ext4 /dev/vg_centosbase/lv_swap: swap
Нам нужно смонтировать логический том, содержащий корневой раздел:
><fs> mount /dev/vg_centosbase/lv_root /
Далее мы хотим удалить файл. Мы можем использовать команду rm guestfish, которая работает так же, как и в традиционной оболочке:
><fs> rm /etc/udev/rules.d/70-persistent-net.rules
Мы хотим отредактировать файл ifcfg-eth0, чтобы удалить строку HWADDR. Команда редактирования скопирует файл на хост, вызовет ваш редактор, а затем скопирует файл обратно:
><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
Если вы хотите изменить этот образ для загрузки ядра 8021q во время загрузки, вы должны создать исполняемый скрипт в каталоге
/etc/sysconfig/modules/
. Вы можете использовать команду touch guestfish, чтобы создать пустой файл, команду edit, чтобы отредактировать его, и команду chmod, чтобы сделать его исполняемым:><fs> touch /etc/sysconfig/modules/8021q.modules ><fs> edit /etc/sysconfig/modules/8021q.modules
Добавляем в файл следующую строку и сохраняем:
modprobe 8021q
Затем мы устанавливаем исполняемый файл:
><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
Мы закончили, поэтому мы можем выйти с помощью команды exit:
><fs> exit
Дальнейшая работа с guestfish¶
В guestfish есть огромное количество функциональных возможностей, и их полное рассмотрение выходит за рамки этого документа. Вместо этого мы рекомендуем вам прочитать страницу документации guestfs-recipes, чтобы понять, что возможно с помощью этих инструментов.
guestmount¶
Для некоторых типов изменений вам может быть проще смонтировать файловую систему образа непосредственно в гостевой системе. Программа guestmount, также из проекта libguestfs, позволяет это сделать.
Например, чтобы смонтировать корневой раздел нашего образа
centos63_desktop.qcow2
в/mnt
, мы можем сделать:# guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt
Если бы мы не знали заранее, какая точка монтирования находится в гостевой системе, мы могли бы использовать флаг -i (inspect), чтобы указать guestmount автоматически определять, какую точку монтирования использовать:
# guestmount -a centos63_desktop.qcow2 -i --rw /mnt
После монтирования мы можем делать такие вещи, как список установленных пакетов, используя rpm:
# rpm -qa --dbpath /mnt/var/lib/rpm
После этого размонтируем:
# 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, который работает на вашем локальном рабочем столе.
Убедитесь, что сеть 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
Используйте графический интерфейс 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.
Нажмите кнопку «Создать новую виртуальную машину» в левом верхнем углу или перейдите в «Файл» - «Новая виртуальная машина». Затем следуйте инструкциям:
Вам будет показан ряд диалоговых окон, которые позволят вам указать информацию о виртуальной машине.
Примечание
При использовании образов в формате qcow2 перед установкой следует отметить параметр «Настроить конфигурацию», перейти к свойствам диска и явно выбрать формат qcow2. Это гарантирует, что размер диска виртуальной машины будет правильным.
Используйте 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:¶
- Перейдите на страницу зеркал CentOS.
- Щелкните одну из ссылок HTTP в правом столбце рядом с одним из зеркал.
- Щелкните ссылку на папку версии CentOS, которую вы хотите использовать. Например,
7/
. - Щелкните ссылку папки isos/.
- Щелкните ссылку папки x86_64/ для 64-разрядных образов.
- Щелкните 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». После запуска программы установки выберите предпочитаемый язык и нажмите «Продолжить», чтобы перейти к сводке установки. Примите значения по умолчанию.
Изменить статус Ethernet:
Настройка Ethernet по умолчанию выключена. Измените настройку Ethernet с OFF на ON. В частности, убедитесь, что для параметра «Метод настроек IPv4» установлено значение «Автоматический (DHCP)», которое используется по умолчанию.
Имя хоста:
Программа установки позволяет вам выбрать имя хоста (по умолчанию localhost.localdomain). Вы устанавливаете пакет cloud-init позже, который устанавливает имя хоста при загрузке, когда новая виртуальная машина инициализируется с использованием этого образа.
Укажите установщику веб-сервер CentOS:
В зависимости от версии CentOS сетевой установщик требует, чтобы пользователь указал либо URL-адрес, либо веб-сайт и каталог CentOS, соответствующий одному из зеркал CentOS. Если программа установки запрашивает один URL-адрес, допустимым URL-адресом может быть http://mirror.umd.edu/centos/7/os/x86_64.
Примечание
Рассмотрите возможность использования других зеркал в качестве альтернативы mirror.umd.edu.
Если установщик отдельно запрашивает имя веб-сайта и каталог 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 и перезагрузка компьютера¶
Дождитесь завершения установки:
Чтобы извлечь диск с помощью команды 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, вам может потребоваться выполнить следующие шаги:
Отредактируйте файл /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"
Выполните следующую команду, чтобы сохранить изменения:
# 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
Пошаговая установка¶
В начальном меню загрузки установщика выберите опцию «Установить». Пройдитесь по подсказкам установщика, значения по умолчанию должны подойти:
Hostname¶
Программа установки может попросить вас выбрать имя хоста. По умолчанию - ubuntu. Позже мы установим пакет cloud-init, который установит имя хоста при загрузке, когда новый экземпляр будет подготовлен с использованием этого образа.
Выбор зеркала¶
Зеркало по умолчанию, предложенное установщиком, должно подойти.
Пошаговая установка¶
Пройдите установку, используя параметры по умолчанию. При запросе имени пользователя по умолчанию - ubuntu.
Разделение дисков¶
Существуют различные варианты разделения дисков. Установка по умолчанию будет использовать раздел LVM и создаст три раздела (/boot, /, swap), и это будет корректно. В качестве альтернативы вы можете создать один раздел ext4, смонтированный в «/», это также должно работать корректно.
Если вы не уверены, мы рекомендуем вам использовать схему разделов установщика по умолчанию, поскольку нет явного преимущества той или иной схемы.
Автоматические обновления¶
Установщик Ubuntu спросит, как вы хотите управлять обновлениями в вашей системе. Этот параметр зависит от вашего конкретного варианта использования. Если ваши виртуальные машины будут подключены к Интернету, мы рекомендуем «Автоматически устанавливать обновления безопасности».
Выбор ПО: сервер OpenSSH¶
Выберите сервер OpenSSH, чтобы вы могли подключаться к виртуальной машине по протоколу SSH, когда она запускается в облаке OpenStack:
Установка загрузчика GRUB¶
Выберите «Да», когда вас спросят об установке загрузчика 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 (…)
Очистка (удаление сведений о 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¶
- Посетите сайт загрузки Fedora.
- Перейдите на страницу загрузки сервера Fedora для ISO-образа сервера Fedora.
- Выберите образ ISO, который вы хотите загрузить.
- Например,
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, вам может потребоваться выполнить следующие шаги:
Отредактируйте файл /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»
Выполните следующую команду, чтобы сохранить изменения:
# 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.
Выполните следующие действия, чтобы подготовить установку:
Загрузите установочный ISO-образ Windows Server 2012, доступны на веб-сайте Microsoft (требуется регистрация).
Загрузите подписанный ISO-образ драйверов VirtIO с веб-сайта Fedora.
Создайте образ qcow2 размером 15 ГБ:
$ qemu-img create -f qcow2 ws2012.qcow2 15G
Запустите установку 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.
Включите драйверы VirtIO. По умолчанию установщик Windows не обнаруживает диск.
Загрузите драйверы VirtIO SCSI и сетевые драйверы, выбрав цель установки при появлении запроса. Щелкните Загрузить драйвер и просмотрите файловую систему.
Выберите папку
E:\virtio-win-0.1XX\viostor\2k12\amd64
. Установщик Windows отображает список драйверов для установки.Выберите драйверы VirtIO SCSI.
Щелкните «Загрузить драйвер», просмотрите файловую систему и выберите папку
E:\NETKVM\2k12\amd64
.Выберите сетевые драйверы и продолжите установку. После завершения установки виртуальная машина перезапускается.
При появлении запроса укажите пароль для администратора.
Войдите в систему как администратор и запустите командное окно.
Завершите установку драйверов VirtIO, выполнив следующую команду:
C:\pnputil -i -a E:\virtio-win-0.1XX\viostor\2k12\amd64\*.INF
Чтобы позволить Cloudbase-Init запускать скрипты во время загрузки виртуальной машины, установите политику выполнения PowerShell без ограничений:
C:\powershell C:\Set-ExecutionPolicy Unrestricted
Загрузите и установите 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:
Создаем виртуальный диск:
$ qemu-img create -f qcow2 freebsd.qcow2 1G
Минимальный поддерживаемый размер диска для FreeBSD составляет 1 ГБ. Поскольку цель состоит в том, чтобы сделать минимально возможный базовый образ, в примере используется этот минимальный размер. Этого размера достаточно, чтобы включить дополнительные документы, игры и коллекции lib32. Чтобы включить коллекцию портов, добавьте еще 1 ГБ. Чтобы включить src, добавьте 512 МБ.
Получаем установщик 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
Запускаем виртуальную машину на локальной рабочей станции. Используем тот же гипервизор, виртуальный диск и драйверы виртуальной сети, что и в производственной среде.
Следующая команда использует минимальный объем оперативной памяти, равный 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-образа и подключена к пустому виртуальному диску, который вы создали ранее.
Чтобы установить операционную систему, выполните следующие действия внутри виртуальной машины:
При появлении запроса выберите запуск 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 ГБ:
Выберите «Готово», а затем «Подтвердить», чтобы зафиксировать изменения.
Примечание
Если вы измените этот пример, корневой раздел, смонтированный на /, должен быть последним разделом на диске, чтобы он мог расширяться во время выполнения до размера диска, предоставляемого вашим типом экземпляра. Также обратите внимание, что в настоящее время в bsd-cloudinit жестко закодировано предположение, что это второй раздел.
Выберите корневой пароль.
Выберите часовой пояс CMOS.
Виртуализированная CMOS почти всегда хранит свое время в формате UTC, поэтому, если вы не знаете иного, выберите UTC.
Выберите часовой пояс, соответствующий вашей среде.
Из списка служб для запуска при загрузке необходимо выбрать ssh. При желании выберите другие услуги.
При желании добавьте пользователей.
В настоящее время вам не обязательно добавлять пользователей. Программа bsd-cloudinit добавляет учетную запись пользователя freebsd, если она не существует. Ключи ssh для этого пользователя связаны с OpenStack. Чтобы настроить эту учетную запись пользователя, вы можете создать ее сейчас. Например, вы можете настроить оболочку для пользователя.
Окончательная конфигурация
Это меню позволяет обновить предыдущие настройки. Проверьте правильность настроек и нажмите «Выход».
После выхода вы можете открыть оболочку для выполнения шагов ручной настройки. Выберите «Да», чтобы внести несколько изменений, характерных для OpenStack:
Настройте консоль:
# echo 'console="comconsole,vidconsole"' >> /boot/loader.conf
Эта команда настраивает вывод консоли на последовательную консоль, отображаемую nova consolelog, и на видеоконсоль для сайтов с настроенным VNC или Spice.
Минимизируйте задержку загрузки:
# echo 'autoboot_delay="1"' >> /boot/loader.conf
Загрузите последнюю версию
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
Запустите установщик:
# sh ./installer.sh
Введите эту команду, чтобы загрузить и установить последний пакет bsd-cloudinit, а также установить необходимые компоненты.
Установите sudo и настройте пользователя freebsd на доступ без пароля:
# pkg install sudo # echo 'freebsd ALL=(ALL) NOPASSWD: ALL' > /usr/local/etc/sudoers.d/10-cloudinit
Выключите систему:
# 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 или другим каналам:
- Производитель публикует информацию о доступности определенных образов для просмотра потребителями.
- Потенциальный потребитель предоставляет производителю идентификатор проекта потребителя. При желании производитель может запросить адрес электронной почты потребителя для целей уведомления, но это выходит за рамки API.
- Производитель предоставляет общий доступ к образу потребителю с помощью операции API-интерфейса Create image member.
- При желании производитель уведомляет потребителя о том, что образ был опубликован, и предоставляет идентификатор образа (UUID).
- Если потребитель хочет, чтобы образ отображался в списке образов, потребитель использует OpenStack Image API, чтобы изменить статус члена образа на принятый с помощью операции API обновления члена образа.
- Если впоследствии потребитель захочет скрыть образ, он использует 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]