MyTetra Share
Делитесь знаниями!
Как создавать виртуальные машины через libvirt
Время создания: 09.08.2011 22:00
Автор: Xintrea
Текстовые метки: виртуальная машина, настройка, linux, qemu, libvirt, virsh, kvm, инсталляция, установка
Раздел: Компьютер - Linux - Виртуализация и эмуляция - QEMU
Запись: xintrea/mytetra_syncro/master/base/146546156351au3a0xvd/text.html на raw.github.com

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


В Debian установка пакетов для работы с qemu и libvirt производится командами:



apt-get install qemu-kvm libvirt-bin



А начиная с 2018 года имена пакетов поменялись, и нужны такие команды:



apt-get install qemu-kvm libvirt-daemon libvirt-daemon-system libvirt-clients



В 2024 году еще понадобится пакет virtinst, так как он не подтянется по зависимостям.


Для работы потребуется две основных программы:



  • virt-install - программа для создания виртуальной машины
  • virsh - консоль для управления виртуальными машинами



Для того, чтобы они нормально выполнялись, необходимо будет включить пользователя, из-под которого они вызываются, в группы kvm и libvirt:



adduser <youruser> kvm

adduser <youruser> libvirt



Начиная с 2018 года, группы libvirt уже не создается, и добавлять в нее пользователя не требуется.


Команды virsh-консоли можно вызывать двумя способами: в интерактивном режиме, находясь в консоли virsh, и в командном режиме, выполняя команду в текущем шелле:



$ virsh команда опции



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



Основные понятия


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


Хост-система и гостевая система


В виртуализации активно используются два понятия:



  • Хост система - это операционная система, внутри которой запускаются виртуальные машины.
  • Гостевая система - это операционка, запущенная в виртуальной машине.



Важно их не путать.



Хранилище (pool)


Хранилище - это, по-сути, отдельный "каталог" (область), в котором складываются образы дисков виртуальных машин. Обычно создают минимум два хранилища - default для хранения образов жестких дисков и boot для хранения обазов загрузочных CD-дисков.


Получить список хранилищ, находясь в консоли virsh, можно так:



virsh # pool-list --all

Name State Autostart

-------------------------------------------

boot active yes

default active yes



Образ диска (vol)


Образ диска - это снимок данных диска виртуальной машины, сохраненный в том или ином формате. libvirt понимает несколько форматов образов. Так же возможна работа с образами CD/DVD дисков. Каждый образ хранится в том или ином хранилище.


Получить список образов, сохраненных в хранилище default, можно командой:



virsh # vol-list default

Name Path

------------------------------------------------------------------------------

diagonal.img /var/lib/libvirt/images/diagonal.img

terminator.img /var/lib/libvirt/images/terminator.img



А список образов, хранимых в хранилище boot, получается подобной командой:



virsh # vol-list boot

Name Path

------------------------------------------------------------------------------

debian-8.4.0-amd64-DVD-1.iso /var/lib/libvirt/boot/debian-8.4.0-amd64-DVD-1.iso

debian-8.5.0-amd64-netinst.iso /var/lib/libvirt/boot/debian-8.5.0-amd64-netinst.iso

SL-6.7-x86_64-DVD.iso /var/lib/libvirt/boot/SL-6.7-x86_64-DVD.iso

SL-7.2-Everything-Dual-Layer-DVD-x86_64-2016-02-02.iso /var/lib/libvirt/boot/SL-7.2-Everything-Dual-Layer-DVD-x86_64-2016-02-02.iso



Если libvirt еще чистый, и в нем не определено ни одного хранилища (pool), то можно создать хранилище с именем default следующими командами:



virsh # pool-define-as default dir --target "/data1/libvirt/images"

virsh # pool-build default

virsh # pool-start default



Где /data1/libvirt/images - это место, где будут лежать файлы образов, принадлежащих пулу default.



Виртуальная машина


Виртуальная машина в libvirt - это некая конфигурация оборудования, которая может быть виртуально запущена. В описании конфигурации прописывается: какой виртуальный микропроцессор используется, какая виртуальная сетевая карта "вставляется", сколько памяти имеет виртуальная машина, какой образ (vol) использовать для основного диска виртуалки, какой образ использовать в качестсве CD-Rom, который вставлен в виртуалку и т. д.


Получить список виртуальных машин и посмотреть их состояния можно командой:



virsh # list --all

Id Name State

----------------------------------------------------

2 firstvirt running



Запустить виртуальную машину можно командой start <имя_машины>. Виртуальная машина, кроме того, создается и автоматически стартует при выполнении процедуры создания виртуалки (см. далее).


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



  • shutdown <имя_машины> - отправить виртуальной системе команду на выключение (похоже, что эмулируется нажатие кнопки POWER, то есть запущенная внутри виртуалки операционка должна среагировать на сигналы ACPI). Если эта команда не привела к штатному выключению виртуалки, используется второй метод;
  • destroy <имя_машины> - это аналог "жесткого" отключения питания.



Виртуальный коммутатор


При настойке сети для виртуальных машин, помимо сетевого интерфейса бриджа (сущестующего в рамках хостовой системы) в среде виртуализации создается виртуальный коммутатор. Вначале средствами Linux настраивается сетевой интерфейс бриджа так, чтобы он смотрел в локальную сеть предприятия. Потом в среде виртуализации создается виртуальный коммутатор, который одним концом "воткнут" в бридж. А потом все создаваемые виртуальные машины втыкаются в этот виртуальный коммутатор.


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


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



Создание виртуальной машины


Создавать виртуальную машину можно с помощью программы virt-install (это не команда внутри virsh). Параметры примерно такие:



virt-install \

-n myvirthost \

-r 1024 \

--vcpus=2 \

--arch=i686 \

--cdrom /var/lib/libvirt/boot/debian-8.5.0-amd64-netinst.iso \

--disk pool=default,size=300,bus=virtio,format=raw,cache=writeback \

--graphics vnc,listen=0.0.0.0



где:



  • -n myvirthost - это имя виртуальной машины;
  • -r 1024 - количество ОЗУ для виртуальной машины в Мб;
  • --vcpus=2 - количество ядер процессора, выделяемого под виртуалку (или количество виртуальных ядер?);
  • --cdrom путь к iso образу установочного диска (ранее эта опция называлась -c);
  • --disk - параметры диска, перечисленные через запятую без пробелов. Параметр size - это размер диска в гигабайтах;
  • --graphics - параметы подключения к экрану виртуальной машины, в данном случае через VNC.



Выполнение этой команды будет бесконечно долго. На экране будет примерно следующее:



Starting install...

Allocating 'myvirthost.img' | 300 GB 00:00:03

Creating domain... | 0 B 00:00:00

Domain installation still in progress. Waiting for installation to complete.



Это либо какой-то глюк, либо из-за того, что виртуальная машина сразу после создания запускается. Чтобы завершить процесс создания виртуальной машины, надо открыть еще один терминал, войти в консоль virsh, и выполнить команду destroy myvirthost:



virsh # list

Id Name State

----------------------------------------------------

2 firstvirt running

9 myvirthost running


virsh # destroy myvirthost

Domain myvirthost destroyed


virsh # list

Id Name State

----------------------------------------------------

2 firstvirt running



В консоли virsh доступны следующие основные команды:



  • list - посмотреть список запущенных виртуальных машин;
  • start имя_машины - запустить виртуальную машину с заданным именем;
  • reset имя_машины - перезагрузка машины, аналог нажатия кнопки Reset;
  • shutdown имя_машины - выключение виртуальной машины (как по краткому нажатию Power);
  • suspend имя_машины - "заморозка" виртуальной машины (как будто перестает работать CPU);
  • resume имя_машины - "разаморозка" виртуальной машины;
  • destroy имя_машины - остановить (т. е. выключить) виртуальную машину с заданным именем, выключение жесткое, как будто нажали и удерживали кнопку Power;
  • undefine имя_машины - удалить виртуальную машину (точнее, конфиг машины). Используется в случае, если машина была создана с неправильными параметрами. Полезна при первых попытках включения. Важно: образ жесткого диска при этой команде не удаляется. И он будет автоматически использоваться при создании новой машины с таким же именем.



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



Подключение к экрану виртуальной машины


Для инсталляции операционки необходимо иметь доступ к экрану виртуальной машины. Подключение к экрану производится по протоколу VNC. В Windows для этих целей можно использовать программу TightVNC.


IP-адрес, к которому надо цепляться VNC-клиентом - это адрес сервера, на котором крутятся виртуальные машины. Порт, к которому надо цепляться - 5900 или любой из последующих номеров. Для каждой новой виртуалки, если не задано конфигурирующих опций, обычно автоматически создается свой порт: 5900, 5901, 5902 и т. д. При дефолтных настройках пароль для подключения не требуется.


Допустим, что нужно подключиться к IP 10.153.0.25 на порт 5901. Тогда в программе TightVNC в строке Connection - Remote host надо указать 10.153.0.25:5901.


Будет открыто примерно такое окно:





Видно, что машина запустилась, но из БИОСа она не вышла. Загрузки с CD-Rom, указанного при создании машины, не произошло. Надо разбираться дальше.


Примечание: по каким признакам в окне загрузки можно определить, что виртуальная машина работает или остановлена? Для биоса и консольных режимов операционок все просто. Если курсор мигает - машина работает. Если курсор не мигает - машина остановлена.


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


Кстати, начиная, как минимум, c libvirt 7.0.0-3, в комплекте идет Virtual Machine Viewer. При создании или запуске виртуальной машины он автоматически запустится и будет показывать окно виртуальной машины. Причем это не просто Viewer, это полнофункциональный виртуальный "экран", в котором работает клавиатура и мышка. То есть, никакого VNC-клиента дополнительно настраивать не нужно.



Получение конфига виртуальной машины


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


Получить конфиг можно командой:



$ virsh dumpxml myvirthost > myvirthost.xml



Конфиг представляет из себя XML-файл, который можно править. После правки, новый конфиг можно применить командой:



$ virsh define myvirthost.xml



Имя машины в вышеприведенной команде указывать ненужно, так как оно прописано внутри xml-файла:



<name>myvirthost</name>



Однако, перед этой командой надо не забыть выключить виртуальную машину (команда destroy) и, если необходимо, удалить ее (команда undefine).



Вставка образа CD-Rom в виртуальную машину


Посмотрев на полученный XML-конфиг виртуальной машины можно увидеть, что устройство CD-Rom есть, но ему не назначено никакого образа. А так же, забегая вперед, надо сказать, что не назначено последовательности загрузки с устройств, и поэтому машина пытается стартовать с жесткого диска, на котором еще нет файловой системы.


Параметры CD-Rom можно найти в XML-элементе domain - devices - disk:



<disk type='block' device='cdrom'>

<driver name='qemu' type='raw'/>

<backingStore/>

<target dev='hda' bus='ide'/>

<readonly/>

<alias name='ide0-0-0'/>

<address type='drive' controller='0' bus='0' target='0' unit='0'/>

</disk>



Сюда можно прописать iso-образ, добавив XML-элемент source:



<disk type='block' device='cdrom'>

<driver name='qemu' type='raw'/>

<backingStore/>

<target dev='hda' bus='ide'/>

<readonly/>

<alias name='ide0-0-0'/>

<address type='drive' controller='0' bus='0' target='0' unit='0'/>

<source file='/var/lib/libvirt/boot/debian-8.5.0-amd64-netinst.iso'/>

</disk>



Последовательнось загрузки можно найти в XML-элементе domain - os:



<os>

<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

<boot dev='hd'/>

</os>



Видно, что здесь указана загрузка с жесткого диска, и никакого CD-Rom нет. Надо его добавить, причем перед жестким диском:



<os>

<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

<boot dev='cdrom'/>

<boot dev='hd'/>

</os>



После таких правок можно остановить виртуалку и применить конфиг:



$ virsh destroy myvirthost

$ virsh define myvirthost.xml



Далее можно запустить виртуальную машину:



$ virsh start myvirthost



И тут как повезет. Народ утверждает, что у него сразу работает загрузка с CD-Rom. Но может произойти и так, что образ не будет подключен. В этом можно убедиться, снова получив конфиг. Настройка последовательности загрузки останется, а пути к образу CD-Rom не будет.


К счастью, есть возможность подключить образ CD-Rom на работающую машину. Когда машина работает, можно выполнить следующую команду:



$ virsh attach-disk myvirthost /var/lib/libvirt/boot/debian-8.5.0-amd64-netinst.iso hda --type cdrom --mode readonly



После чего перезагрузить машину:



$ virsh reset myvirthost



В результате мы увидим:





Следует ли сразу приступать к инсталляции? Нет, потому что у нас еще не настроена сеть.



Настройка сети


Внимание! Как минмум, начиная с libvirt 7.0.0-3, в этой системе виртуализации проделана большая работа, и настройка моста и коммутатора будет сделана по-умолчанию так, что сеть внутри виртуальной машины будет доступна. Все нижеперечисленные действия были необходимы на более ранних версиях libvirt, и теперь, по сути, не требуются.


* * *


Настройка сети производится в три этапа:


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


Настройку моста и коммутатора я, к сожалению ни разу не делал (а делал специально обученный человек), поэтому отсылаю читателя к статье Установка и настройка KVM. Там есть раздел "Шаг 3. Настройка сети на хост-сервере", в нем все подробно расписано. Здесь написано только то, что стало понятно из объяснений.


По-умолчанию в виртуальной среде настроен виртуальный маршрутизатор (в терминах libvirt - сеть) с именем default. Он по-умолчанию настроен в режиме NAT. Увидеть эту сеть можно так:



virsh # net-list

Name State Autostart Persistent

----------------------------------------------------------

default active yes yes



Увидеть (и сохранить) конфиг этой сети можно так:



virsh # net-dumpxml default



Но если нам нужен простой бридж, то чтобы не путаться и не плодить сущности, эту сеть надо удалить:



virsh # net-destroy default - потушить сеть

virsh # net-undefine default - удалить сеть



Создание моста (bridge)


Мне известно только, что в Linux на уровне хост-системы должен быть создан интерфейс бриджа, который будет виден в среде виртуализации. Для разных Linux интерфейс бриджа создается по-разному. Для Cent-OS интерфейс бриджа создается путем создания файла /etc/sysconfig/network-scripts/ifcfg-br0 со следующим содержимым:



DEVICE="br0"

ONBOOT="yes"

TYPE="Bridge"

BOOTPROTO="none"

STP="on"

DELAY="0"

IPADDR="10.153.0.25"

NETMASK="255.255.0.0"

GATEWAY="10.153.0.1"



После чего сеть перезапускается. Для операционок с systemd перезапуск сети производится командой:



systemctl restart network



В результате этих действий должен появиться сетевой интерфейс бриджа (br0):



# ip link list | grep br0

6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT

7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT

8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN mode DEFAULT qlen 500

20: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN mode DEFAULT qlen 500



Если в системе не установлен пакет ip, то похожую информацию можно получить с помощью команды ifconfig.


В среде виртуализации бридж будет виден примерно так:



virsh # iface-list --all

Name State MAC Address

---------------------------------------------------

br0 active 98:57:a5:61:5f:1c

eth0 active 98:57:a5:61:5f:1c

lo active 00:00:00:00:00:00



Посмотреть настройки сетевого интерфейса бриджа в виртуальной среде можно командой:



virsh # iface-dumpxml br0

<interface type='bridge' name='br0'>

<protocol family='ipv4'>

<ip address='10.153.0.25' prefix='16'/>

</protocol>

<protocol family='ipv6'>

<ip address='fe80::9657:a5ff:fe6d:af1a' prefix='64'/>

</protocol>

<bridge>

<interface type='ethernet' name='eth0'>

<link state='up'/>

<mac address='95:57:a5:6d:5f:1c'/>

</interface>

<interface type='ethernet' name='vnet0'>

<link state='unknown'/>

<mac address='fe:54:00:e9:81:96'/>

</interface>

<interface type='ethernet' name='vnet1'>

<link state='unknown'/>

<mac address='fe:54:00:9e:8a:5b'/>

</interface>

</bridge>

</interface>



Здесь в настройках аплинка (up) указан интерфейс eth0. Именно этот реальный интерфейс смотрит на сеть предприятия:



...

<interface type='ethernet' name='eth0'>

<link state='up'/>

<mac address='95:57:a5:6d:5f:1c'/>

</interface>

...



Создание виртуального коммутатора


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



virsh # net-list --all

Name State Autostart Persistent

----------------------------------------------------------

to-br0 active yes yes



Посмотреть, как сконфигурирован виртуальный коммутатор, можно командой:



virsh # net-dumpxml to-br0

<network connections='1'>

<name>to-br0</name>

<uuid>569db4f6-f79d-47f6-99da-4dc4ef2a425e</uuid>

<forward mode='bridge'/>

<bridge name='br0'/>

</network>



Возможно, что создать такой виртуальный коммутатор можно командой:



virsh # net-create network-to-rb0.xml



Где содержимое файла network-to-rb0.xml следующее:



<network>

<name>to-br0</name>

<forward mode='bridge'/>

<bridge name='br0'/>

</network>



Создание виртуальной сетевой карточки для виртуальной машины


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


Первый - это удалить конфиг виртуальной машины, и заново создасть виртуальную машину командой virt-install, (см. раздел "Создание виртуальной машины"), добавив опции:



--network network=to-br0,model=virtio



Второй - это исправить конфиг виртуальной машины вышеописанными командами "virsh dumpxml myvirthost > myvirthost.xml" и "$ virsh define myvirthost.xml". В конфиге надо найти раздел:



<interface type='bridge'>

<mac address='52:54:00:9e:8a:5b'/>

<source bridge='br0'/>

<target dev='vnet1'/>

<model type='virtio'/>

<alias name='net0'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>

</interface>



И заменить строку <source bridge='br0'/> на:



<source network='to-br0' bridge='br0'/>



Естественно, при этом надо не забыть остановить, пересоздать и запустить виртуальную машину.


* * *


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


 
MyTetra Share v.0.65
Яндекс индекс цитирования