Сервер в кармане, или просто о сложном!

главная - Статьи - Виртуализация

Настройка KVM на CentOS 7

Теги: Linux Виртуальные машины

Настройку KVM будем проводить на CentOS 7, minimal, x64. Выбор KVM при использовании CentOS был для меня достаточно очевиден - он поддерживается и продвигается Red Hat.

Итак, в локальной сети 192.168.88.0/24 есть хост (CentOS 7, имя SERVER.LOCAL и IP 192.168.88.2, сетевой адаптер enp1s0). На этом хосте мы хотим запустить несколько виртуальных машин, доступных из локальной сети. Технология виртуализации: KVM.

Подготовительные работы

Для начала вообще проверим, наш хост поддерживает виртуализацию или нет:

# egrep '(vmx|svm)' /proc/cpuinfo

Если ок (еще бы нет!!!), готовим сеть для роутинга трафика между виртуальными машинами и внешней сетью:

# echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/99-ipforward.conf
net.ipv4.ip_forward = 1

# sysctl -p /etc/sysctl.d/99-ipforward.conf

Ок. Дальше выберем тип виртуальной сети.

Bridge или nat?

Есть два варианта работы виртуальных машин в сети:

1) Виртуальные машины будут за nat, недоступные из внешней сети.
Создаваемые виртуальные машины по-умолчанию будут принадлежать внутренней виртуальной сети хоста (по-умолчанию 192.168.122.0/24) и будут иметь доступ во внешнюю сеть хоста (т.е. в сеть 192.168.88.0/24), а если маршрутизация на хосте настроена, то и в интернет тоже. Из локальной сети виртуальные машины будут недоступны до тех пор, пока вы не настроите проброс портов (forwarding) на хосте из сети хоста в виртуальную сеть.
+ Этот способ проще, т.к. не потребует создания дополнительного сетевого интерфейса - bridge.
+ Если внешний IP один, то может быть невозможным иной сценарий, как только пробрасывать порты.
+ Возможно, вам вообще необходимо создать закрытую сеть для виртуальных машин и вам уж точно не нужно публиковать их в сети хоста. Кто знает? Хозяин - барин!

2) Bridge - виртуальные машины будут видны в сети так же, как и обычные компьютеры, без всяких там nat и forwarding.
В этом случае виртуальные машины будут получать IP по DHCP от вашего обычного сервера, будут видны в сетевом окружении другими компьютерами и прочее.
+ Клиенты в сети не увидят разницу между виртуальным сервером и реальным.
- В случае с внешним IP для каждой виртуальной машины нужен будет свой IP, а это не всегда возможно.
- Надо немного потрудиться и подготовить сеть хоста для создания бриджа (bridge), на котором и будет висеть сеть виртуальных машин.

После установки kvm у вас уже будет готовая внутренняя сеть (вариант 1), вполне себе работоспособная, позволяющая гостевым виртуалкам выходить в интернет. Для простоты предлагаю использовать эту сеть, почувствовать, что к чему и потом, при желании, создать bridge для реализации второго варианта.

Устанавливаем 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

А еще созданные виртуальные машины можно клонировать. Удачи!

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?