LXF125:Virtualization

Материал из Linuxformat.

Перейти к: навигация, поиск

Содержание

Виртуализация – это просто

О виртуализации написано огромное количество книг. Но все, что вам нужно на самом деле – KVM, Qemu и Крис Браун.

Некоторые из основных элементов виртуализации, и как они (примерно) соотносятся друг с другом, и с libvirt (в центре).

Согласно мудрой Wikipedia, «виртуализация — широкое понятие, обозначающее абстракцию ресурсов компьютера». Под это определение подпадает множество программных продуктов: VirtualBox от Sun, Parallels, Bochs, Xen, KVM, Qemu, разновидности VMware и многие другие. Есть и масса непонятных словечек, призванных сбить с толку неофита — эмуляция, полная виртуализация, паравиртуализация, виртуальное устройство, гипервизор… список можно продолжить. И не все придерживаются единого мнения о том, что эти термины означают.

Мы сознательно уйдем от копания в словах и взглянем с практической точки зрения на технологии виртуализации в Ubuntu, в частности, KVM и Qemu, и связанные с ними пользовательские утилиты для создания и управления виртуальными машинами (ВМ). Хотя мы будем говорить об Ubuntu, те же технологии приенимы ко всем дистрибутивам Linux.

На рисунке слева я попытался показать некоторые из компонентов виртуализации в случае Linux. В нижней части рисунка представлены используемые технологии. Слева – Xen, программный слой, который концептуально лежит ниже ОС. Он называется гипервизором и запускается первым (после загрузчика) во время старта компьютера. Xen создает единственную виртуальную машину (Domain 0 или сокращенно Dom 0), на которой работает Linux. Именно этот домен предоставляет Xen свои виртуальные ресурсы. Дополнительные домены пользователя (Dom U) для дополнительных экземпляров Linux можно создать позже. Хотя мы и не будем больше о нем говорить, Xen – стабильное, мощнейшее решение для виртуализации. Canonical использует его, например, для ВМ Ubuntu, на которых студенты делают лабораторные работы по новому серверному курсу.

KVM (не переключатель клавиатуры)

Компонент в средней части рисунка – KVM (Kernel Virtual Machine). KVM обеспечивает полную (аппаратно-зависимую) виртуализацию и может запускать неизмененные образы Linux или Windows, но для его работы необходимы соответствующие расширения процессора (Intel VT или AMD-V). Она состоит из загружаемого модуля ядра (kvm.ko), предоставляющего инфраструктуру виртуализации ядра и процессорного модуля (kvm-intel.ko или kvm-amd.ko, в зависимости от вашего процессора). Эти компоненты включены в основную версию ядра, начиная с 2.6.20. KVM использует Qemu для эмуляции устройств – таких как сетевая карта, жесткий диск, графический адаптер и т.д. Об этом сочетании мы здесь и поговорим.

В правой части рисунка мы видим Qemu, работающую в пространстве пользователя как чисто программный пакет эмуляции. Его можно применять и без всего (и при этом не нужны ни специальный модуль ядра, ни расширения виртуализации процессора, ни слой гипервизора), и на нем можно запускать неизмененные образы операционной системы. В самостоятельном режиме Qemu – не самый быстрый вариант, однако его можно ускорить при наличии KVM, или с помощью модуля ядра kqemu.

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

Virt-viewer – инструмент для отображения графической консоли ВМ. Доступ к консоли осуществляется через протокол VNC. Virt-manager – настольная утилита (написана на Python) для обслуживания ВМ. Она позволяет управлять жизненным циклом существующих машин (загрузка/выключение, пауза/возобновление, сохранение/восстановление состояния), созданием новых ВМ и виртуальными сетями, обращаться к графической консоли ВМ и просматривать статистику производительности.

Все эти утилиты опираются на libvirt, библиотеку C для взаимодействия с ВМ. Libvirt – настоящий герой нашей истории. Библиотека предоставляет стабильный, цельный API для управления машинами во множестве технологий виртуализации. На данный момент она, среди прочих, поддерживает Xen, Qemu, KVM, User Mode Linux и VirtualBox. Для определения виртуального оборудования libvirt применяет конфигурационные файлы в формате XMLn в каталогах /etc/libvirt и /var/lib/libvirt. Библиотека также используется демоном libvirtd – он является посредником во взаимодействии с системой виртуализации.

Ближе к делу

В главном окне virt-manager можно увидеть список ВМ, остановить или запустить их, открыть VNC-клиент для просмотра их консолей и узнать, как они используют процессор и память.

На нашем уроке мы создадим три ВМ на основе KVM. На первую установим Vista со стандартного носителя. На второй развернем Red Hat Linux с ISO-образа, а на третьей – Ubuntu напрямую из репозиториев.

Но сначала вот что: для работы KVM необходима поддержка виртуализации вашим процессором. Это означает, что требуются расширения процессора Intel-VT или AMD-V. Чтобы убедиться, поддерживает ли процессор одно из них, выполните команду

egrep ‘(vmx|svm)’ /proc/cpuinfo

Если команда ничего не вывела, процессор не поддерживает аппаратную виртуализацию. В противном случае – поддерживает, но нужно еще убедиться, что она активирована в BIOS. Избавившись от этого препятствия, применим virt-manager для создания виртуальной машины KVM/Qemu с Windows Vista. Для начала кликните на строке ‘localhost’ в главном окне virt-manager и выберите пункт меню New [Новый]. Последует серия окошек (некоторые из них показаны далее), где нужно будет ввести разного рода информацию. Результатом этого процесса станут XML-файл, описывающий настройки виртуальной машины (в данном случае /etc/libvirt/qemu/vista.xml), и файл образа диска файловой системы ВМ (/var/lib/libvirt/images/vista). Virt-manager автоматически загрузит вновь созданную ВМ и запустит установку операционной системы с выбранного носителя.

Образы ВМ можно создать и из командной строки, с помощью virt-install. Мы создали вторую ВМ и установили Red Hat из ISO-образа следующей командой:

$ sudo virt-install --connect qemu:///system --name RHEL5
--ram 1000 --disk path=/var/lib/libvirt/images/RHEL5.
img,size=8 --network network:default --accelerate --vnc
--cdrom /iso-images/RHEL5.2-x86_64.iso --os-type=linux

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

Для третьей ВМ и в качестве альтернативы созданию пустой ВМ и установки ОС на нее мы воспользовались VMBuilder, скриптом на языке Python, умеющим создавать образ ВМ с нуля, на лету загрузив все его фрагменты из репозиториев Ubuntu. Это переделанный скрипт ubuntu-vm-builder из Ubuntu 8.04 LTS. Оба скрипта написал Сорен Хансен [Søren Hansen]. Вот пример:

$ sudo vmbuilder kvm ubuntu --suite jaunty --flavour virtual
--arch i386 -o --libvirt qemu:///system

Обязательны только два первых параметра. Здесь kvm задает гипервизор (т.е. технологию виртуализации, с которой работает образ). Поддерживаемые значения таковы: esxi, xen, kvm, vmw6 и vmserver. Второй параметр, ubuntu, определяет дистрибутив, который вы хотите собрать. Сейчас поддерживается только Ubuntu. Время, необходимое для создания ВМ, в этом случае будет зависеть в основном от ширины канала между вами и репозиториями. Если вы планируете установить несколько похожих ВМ, обдумайте создание прокси-сервера репозиториев. Для этого достаточно выбрать один из компьютеров сети и установить пакет apt-proxy:

$ sudo apt-get install apt-proxy

Создастся APT-прокси с кэшированием, который слушает порт 9999. Чтобы направить VMBuilder на прокси, потребуется добавить опцию --mirror в его командную строку таким образом:

--mirror http://server-address:9999/ubuntu

Для первой созданной ВМ вы не заметите никаких изменений в быстродействии, так как прокси должен заполнить свой кэш из серверных репозиториев, но последующие должны работать гораздо быстрее (в простом тесте, время сборки для приведенной выше команды уменьшилось с 4 минут 36 секунд без прокси до 2 минут 26 секунд с прокси).

На вкладке Hardware [Оборудование] virt-manager можно просмотреть и изменить настройки ВМ и добавить новые устройства.

Если вам нужно получить несколько идентичных компьютеров, привлеките virt-clone. Эта утилита скопирует образы диска существующей ВМ и определит новый гостевой компьютер с той же конфигураций виртуальных устройств, за исключением элементов, которые обязаны быть уникальными (например, MAC-адреса) и которые будут изменены во избежание конфликта. Например, мы создали клон виртуальной машины Ubuntu VM за какие-то секунды следующим образом:

$ sudo virt-clone --original ubuntu --name ubuntu3 --file /home/chris/ubuntu-kvm/disk3.qcow2
Cloning from /home/chris/ 100%
|=========================| 364 MB 00:03

Для задания характеристик ВМ и установленного ПО у VMBuilder около пятидесяти параметров, поэтому вы почти наверняка захотите встроить команду в скрипт оболочки и пользоваться ею с удобствами. Некоторые из этих параметров приведены в таблице далее.

По умолчанию VMBuilder создает систему с минимальным содержимым. Дополнительные пакеты можно добавить, несколько раз указав опцию --addpkg. С помощью опции --firstboot задается скрипт, который будет запущен при загрузке образа, например, для установки сервера SSH, чтобы генерируемая им пара ключей была уникальной для каждой системы. Если надо установить пакеты, требующие при развертывании взаимодействия с пользователем (например, MySQL и Postfix), можно написать дополнительные скрипты, которые сделают это и будут запущены в первый раз, когда исходный пользователь (initial user) подключится к системе. На них указывает параметр --firstlogin. Такие возможности полезнее всего при создании образа виртуального устройства для передачи многим пользователям.

Чтобы не запускать VMBuilder с тысячей параметров, можно записать настройки во внешний конфигурационный файл и сослаться на него в командной строке следующим образом:
$ sudo vmbuilder kvm ubuntu -c myconfigfile.cfg

Какой бы вариант создания ВМ вы ни выбрали, в итоге у вас окажется два файла. Первый, в /etc/libvirt/qemu, представляет собой XML-файл, определяющий виртуальные устройства компьютера – его процессор, объем памяти, диски, к какой сети он подключен, его MAC-адрес и пр. Второй файл содержит образ диска компьютера (т.е. его файловую систему). Virt-install и virt-manager создают файлы с расширением .img и помещают их в каталог /var/lib/libvirt/images, VMBuilder создает файлы в формате QCOW2 и помещает их в ваш домашний каталог – в подкаталог, названный по гипервизору и дистрибутиву, для которого они были созданы. В нашем примере это ubuntu-kvm. ‘cow’ в имени файла – сокращение от Copy On Write (копирование при записи). В этом формате основной образ используется в режиме только для чтения, а сохраняются лишь различия. Это сэкономит много места на диске, если вы создаете несколько ВМ, большая часть файловых систем у которых общая.

Параметры VMBuilder

Параметр Назначение
--mem=MEM Выделяет виртуальной машине MEM МБ памяти
--rootsize=SIZE Выделяет SIZE МБ корневому разделу
--swapsize=SIZE Выделяет SIZE МБ разделу подкачки
--ip=ADDRESS Устанавливает IP-адрес
--addpkg=PKG Устанавливает PKG на виртуальную машину
--arch=ARCH Задает архитектуру (AMD64 или i386)
--hostname=NAME Устанавливает имя хоста в NAME
--mirror=URL Загружает пакеты из репозитория по указанному URL
--lang=LANG Устанавливает локаль в LANG
--user=USER Имя пользователя initial user (по умолчанию Ubuntu)
--pass=PASS Пароль initial user (по умолчанию Ubuntu)
--libvirt=URI Регистрирует виртуальную машину в libvirt по заданному URI

Шаг за шагом: создаем виртуальную установку Vista

Шаг 1

  • Выбираем источник
При запуске мастера создания ВМ вас попросят выбрать источник установки. В данном случае это физический компакт-диск Vista.

Шаг 2

  • Создаем виртуальные разделы
Если у вас есть ISO-образ, с которого можно произвести установку, так и скажите. В противном случае воспользуйтесь CD-ROM’ом основного компьютера. Виртуальный диск может быть одним из физических разделов основного компьютера или файлом-образом в его файловой системе.

Шаг 3

  • Выделяем ОЗУ
Укажите начальный и максимальный объем оперативной памяти, выделяемой ВМ, еще раз просмотрите всю информацию и наслаждайтесь результатом – Windows Vista, работающей на виртуальной машин

Запуск виртуальной машины

Запустить виртуальную машину после установки можно разными способами. Низкоуровневый подход – вызвать KVM напрямую, просто передав ему образ файла виртуальной машины в качестве аргумента: Qemu/KVM.

$ sudo kvm /var/lib/libvirt/images/RHEL5.img

Эта простая команда запустит ВМ с настройками KVM по умолчанию; например, у нее будет только 128 МБ ОЗУ (а не 1000 МБ, которые мы запросили при ее создании) и не будет никаких сетевых настроек. Теоретически это можно исправить, передав KVM соответствующие параметры, но проще запустить ВМ с помощью virt-manager или virsh. Они читают XML-описание ВМ и затем вызывают KVM с подходящими настройками.

Запустить ВМ с помощью virt-manager нетрудно. В главном окне кликните правой кнопкой на нужной виртуальной машине и выберите пункт меню Run (Запустить).

Virsh

Потом есть virsh. Удивительно, что без нее мы продвинулись так далеко, потому что virsh – это швейцарский нож в управлении ВМ. По сути, это обертка libvirt и консольный эквивалент virt-manager. При помощи virsh я могу запустить свою ВМ RHEL 5 таким образом:

$ sudo virsh -c qemu:///system start RHEL5
Connecting to uri: qemu:///system
Domain RHEL5 started

(Термин «домен» здесь просто означает «виртуальную машину». Он позаимствован из Xen, для которого libvirt изначально была написана.) Теперь можно просмотреть список запущенных ВМ:

$ sudo virsh -c qemu:///system list
Connecting to uri: qemu:///system
Id Name State
----------------------------------
1 RHEL5 running

При подобном запуске ВМ VNC-клиент автоматически не стартует, и если нужно увидеть ее консоль, запустите вручную утилиту просмотра:

$ sudo virt-viewer RHEL5

С помощью virsh можно просмотреть XML-определение домена (мы убрали часть строк ради экономии места):

$ sudo virsh dumpxml RHEL5
Connecting to uri: qemu:///system
<domain type=’kvm’ id=’1’>
<name>RHEL5</name>
<uuid>2cadb958-6533-f728-e86a-421ec96ecfd3</uuid>
<memory>1024000</memory>
<os>
<type arch=’x86_64’ machine=’pc’>hvm</type>
<boot dev=’hd’/>
</os>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type=’file’ device=’disk’>
<source file=’/var/lib/libvirt/images/RHEL5.img’/>
<target dev=’hda’ bus=’ide’/>
</disk>
<disk type=’file’ device=’cdrom’>
<target dev=’hdc’ bus=’ide’/>
<readonly/>
</disk>
<interface type=’network’>
<mac address=’54:52:00:66:7a:66’/>
<source network=’default’/>
<target dev=’vnet0’/>
</interface>
<input type=’mouse’ bus=’ps2’/>
<graphics type=’vnc’ port=’5900’ autoport=’yes’ keymap=’en-us’/>
</devices>
</domain>

Файл /etc/libvirt/qemu/RHEL5.xml можно просмотреть и вручную. В нем подробно описана ВМ – ее название и UUID, объем выделенной памяти, необходимый для запуска эмулятор, расположение образа файловой системы, сеть, к которой она подключена, и многое другое. С помощью virsh также можно:

  • Запускать, останавливать, приостанавливать и возобновлять ВМ.
  • Переносить ВМ на другой компьютер.
  • Создавать, удалять виртуальные сети, изменять их параметры и выводить их список.
  • Управлять хранилищами образов ВМ.

Virsh принимает в общей сложности около 90 команд. Если вызвать ее без аргументов, Virsh запустится в режиме командного интерпретатора.

Поддержка сети

Виртуальные машины нужно подключать к виртуальным сетям. Libvirt позволяет создавать виртуальные мосты и объединять их в различные топологии. В установке по умолчанию libvirt создаст единственную сеть под названием ‘default’. Ее XML-определение можно просмотреть с помощью virsh:

$ sudo virsh net-dumpxml default
Connecting to uri: qemu:///system
<network>
<name>default</name>
<uuid>a77f2c3f-e951-26c0-4c7d-eb23ace76051</uuid>
<forward mode=’nat’/>
<bridge name=’virbr0’ stp=’on’ forwardDelay=’0’ />
<ip address=’192.168.122.1’ netmask=’255.255.255.0’>
<dhcp>
<range start=’192.168.122.2’ end=’192.168.122.254’ />
</dhcp>
</ip>
</network>

Его можно просмотреть и напрямую: это файл /var/lib/libvirt/network/default.xml. В этом файле определена сеть default, занимающая диапазон IP-адресов 192.168.122.0/24. У хост-компьютера будет виртуальный интерфейс, подключенный к этой сети, с адресом 192.168.122.1. Сервис dnsmasq слушает его и предоставляет DHCP и DNS в этой сети.

Другие утилиты

Другие средства управления виртуальными машинами включают:

  • virt-viewer Графическое приложение, подключаемое к консоли локальной или удаленной ВМ.
  • virt-clone Утилита командной строки для клонирования образов существующих ВМ.
  • virt-image Утилита командной строки для создания ВМ по XML-описанию образа.
  • virt-convert Утилита командной строки для преобразования ВМ из одного формата в другой.
  • virt-top Утилита, отображающая использование ресурсов ВМ в стиле top.

Возможно, вы захотите попробовать JeOS – урезанную версию Ubuntu Server с ядром, оптимизированным для запуска в виртуализированном окружении.

Чтобы узнать больше…

Несколько хороших обзоров технологий виртуализации можно найти на сайтах:

Подробное руководство по VMBuilder можно прочесть на https://help.ubuntu.com/community/JeOSVMBuilder.

Libvirt описан на сайте http://libvirt.org.

Как всегда, прочтите man-страницы для таких команд, как virt-install, virsh, kvmqemu и VMBuilder.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию