Crmgo Блог

KVM на CentOS

KVM на CentOS

Устанавливаем KVM Собственно, мы дорвались до установки виртуализации KVM, эмулятора QEMU и сопутствующих инструментов. Устанавливаем необходимые пакеты: # yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install # systemctl enable libvirtd && systemctl start libvirtd Хранить образы виртуальных машин мы будем в…

KVM на CentOS

Устанавливаем KVM

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

Устанавливаем необходимые пакеты:

# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install # systemctl enable libvirtd && systemctl start libvirtd

Хранить образы виртуальных машин мы будем в новой папке /vms

# mkdir /vms

Добавляем соответствующий контекст для нашей папки, чтобы SELinux не возмущалась:

# semanage fcontext --add -t virt_image_t '/vms(/.*)?'

Проверяем:

# semanage fcontext -l | grep virt_image_t
/var/lib/imagefactory/images(/.*)?                 all files          system_u:object_r:virt_image_t:s0
/var/lib/libvirt/images(/.*)?                      all files          system_u:object_r:virt_image_t:s0
/vms(/.*)?                                         all files          system_u:object_r:virt_image_t:s0

Применяем изменения:

# restorecon -R -v /vms

и проверяем, применились ли они:

# ls -aZ /vms drwxr-xr-x. root root unconfined_u:object_r:virt_image_t:s0 . dr-xr-xr-x. root root system_u:object_r:root_t:s0 ..

Ок, скачиваем из сети образ iso для той ОС, которая будет установлена на вирт. машине, например, тот же CentOS 7 minimal для будущего веб-сервера? Или Tails? Кто знает :)

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

После вышеперечисленных действий для виртуальных машин на хосте создан сетевой интерфейс virbr0 с IP 192.168.122.1:

# ip addr

Также создана виртуальная сеть default:

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

Сеть можно редактировать:

# virsh net-edit default

<network>
  <name>default</name>
  <uuid>745f121b-3c89-1281-a19a-aa62808c4241</uuid>
  <forward mode="nat">
  <bridge delay="0" name="virbr0" stp="on">
  <mac address="16:18:00:21:8c:15">
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range end="192.168.122.254" start="192.168.122.2">
    </range></dhcp>
  </ip>
</mac></bridge></forward></network>

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

# virt-install 
--network network=default
--name vm1 
--ram=2048 
--vcpus=1 
--disk path=/vms/vm1.img,size=30,format=qcow2 
--graphics vnc,password=vm1password 
--cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso 
--boot cdrom,hd,menu=on 

Описание опций:

--graphics vnc,password=vm1password
Здесь мы указываем пароль и возможность подключиться к терминалу виртуальной машины с через VNC. Пароль может засветиться в логах, так что не пишите сюда что-то важное.

--network network=default - подключаем нашу виртуальную машину к виртуальной сети с именем default (с ней мы уже знакомы).
М.б. --network bridge:br0, например, если бы мы создали bridge с именем br0 для варианта номер 2.

Указанная выше команда может быть введена сразу, одной строкой, тут уж как удобнее:

virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/vms/vm1.img,size=30,format=qcow2 --graphics vnc,password=vm1password --cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on

После выполнения команды можете увидеть сообщение:

WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package. WARNING No console to launch for the guest, defaulting to --wait -1

Нам и не надо, ведь у нас все равно хост виртуальных машин не имеет оконного менеджера. У меня так, во всяком случае.

Starting install...
Allocating 'vm1.img'
                        |  30 GB  00:00:00
Creating domain...
                        |  0 B  00:00:00
Domain installation still in progress. Waiting for installation to complete.

Мужественно ждем. Процесс займет какое-то время.

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

# virsh list
 Id    Name                           State
----------------------------------------------------
 2     vm1                            running

Вирт. машины можно запускать (virsh start vm1), приостанавливать (virsh suspend vm1), возобновлять (virsh resume vm1), выключать (virsh shutdown vm1) и много чего еще с ними делать. Итак, машина vm1 запущена (проверить можно командой virsh domstate vm1). Как к ней подключиться?

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

На предыдущем этапе вы создали виртуальную машину, указали ей CDROM с операционной системой, а дальше что? Как вы планируете установить и настроить ОС? Да, есть варианты. Можно подготовить инфраструктуру и заливать готовые образы и др. Но мы с вами учимся и у нас нет ничего, кроме недавно скачанного с интернета файла образа диска iso. На самом деле все не сложно. Мы указали на предыдущем шаге параметр "--graphics vnc,password=vm1password". Он означает, что мы можем подключиться к терминалу (читай - экрану) виртуальной машины через VNC, например, программой TightVNC, указав IP хоста виртуальных машин и порт для подключения.

Нашей виртуальной машине был назначен порт VNC, подключившись к которому мы увидим "экран" виртуальной машины. Узнать, какой порт назначен конкретной vm1, можно командой:

# virsh vncdisplay vm1 127.0.0.1:0

Это означает, что порт VNC 5900+0=5900. Если бы результат был "127.0.0.1:1", порт VNC был бы 5901. И т.д.

Подключаться к порту 5900 надо к хосту виртуальных машин. Это на нем открыт этот порт, а не на виртуальной машине vm1.

По умолчанию, хост виртуальных машин (у нас это CentOS 7 minimal) не должен позволять подключение к любому порту кроме ssh (22/tcp). Не советую вам открывать доступ к портам VNC из-вне. Это небезопасно. Для того, чтобы получить доступ к экрану виртуальной машины с рабочей станции Windows, с которой я все настраиваю, я сделал туннелирование порта в Putty: 5900 -> 127.0.0.1:5900.

Проброс портов в Putty для VNC 5900

После успешного логина по ssh, можно запустить TightVNC и указать порт 127.0.0.1::5900 (обратите внимание на двойное двоеточие).

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

# virsh attach-disk vm1 /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso hdb --type cdrom --mode readonly

где hdb - имя блочного устройства CDROM. Это имя можно узнать просмотрев конфиг вирт. машины (virsh edit vm1).

Управлять виртуальными машинами с хоста можно консольным набором virsh. С некоторыми командами вы уже познакомились. Наберите в консоли:

# virsh help

и вы увидите, сколько всего можно сделать.

Включение/выключение виртуальных машин

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

# virsh domstate vm1
running

# virsh shutdown vm1
Domain vm1 is being shutdown

# virsh domstate vm1
running

Здесь дело в поддержке acpi со стороны виртуальной машины. Не во всех случаях вирт. машина обработает сигнал о выключении или перегагрузки (virsh shutdown/restart vm1). В этой ситуации могут быть следующие варианты:

Выдергивание кабеля питания:

# virsh destroy vm1
Domain vm1 destroyed

Вы прекрасно понимаете, к чему это может привести. Хотя на начальном этапе, пока ОС не установлена, появление ошибок

Приостановка работы вирт. машины:

virsh suspend vm1

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

Включение поддержки acpi в виртуальной машине.

Тут могут быть разные рецепты, например так (выполнить в вирт. машине, а не на хосте):

yum install acpid chkconfig acpid on service acpid start

Автостарт виртуальных машин

Для того, чтобы при перезапуске хоста виртуальная машина vm1 запускалась автоматически:

# virsh autostart vm1 Domain vm1 marked as autostarted

Выключить автостарт для vm1:

# virsh autostart vm1 --disable Domain vm1 unmarked as autostarted

Контроль сетевой активности виртуальной машины KVM

Может быть полезным оценивать сетевую активность виртуальной машины - например, сколько трафика она потребила. Также это может помочь при отладке сети или поиске утечек трафика. Например:

# virsh domifstat vm1 vnet0
vnet0 rx_bytes 3063962
vnet0 rx_packets 3412
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 591996
vnet0 tx_packets 1731
vnet0 tx_errs 0
vnet0 tx_drop 0

Тут все понятно, кроме откуда взять название адаптера vnet0. Можно в дампе конфигурации вирт. машины (virsh dumpxml vm1) найти секцию network и в ней параметр dev:

<interface type='network'>
    <mac address='52:54:00:98:6c:e6'/>
    <source network='default' bridge='virbr0'/>
    <target dev='vnet0'/>
    <model type='rtl8139'/>
    <alias name='net0'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

Подключение и отключение привода cdrom

Подключить к vm3 iso-образ в качестве cdrom:

# virsh attach-disk vm3 /data/vms-iso/CentOS-7-x86_64-Minimal-1511.iso hda --type cdrom --mode readonly Disk attached successfully

Здесь надо быть внимательным, т.к. после пути до iso-файла на хосте идет указание имени устройства cdrom у виртуальной машины vm3. Если вы не уверены, какое имя устройства надо указать (hda, hdb или др.), сверьтесь с конфигурацией виртуальной машины:

# virsh edit vm3

Отключить iso-образ (не удалить устройство из гостя, а просто "извлечь cd-диск из привода"):

# virsh attach-disk vm5 "" hda --type cdrom --mode readonly

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.

Рубрики: KVM