главная - Статьи - Виртуализация
Настройка KVM на CentOS 7
Теги: kvm 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.
После успешного логина по 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
А еще созданные виртуальные машины можно клонировать. Удачи!
Авторизуйтесь для добавления комментариев!