Установка и настройка KVM под управлением CentOS
Мануал, который отточен многоразовым применением, про который с уверенностью могу сказать, что «точно работает!»
Начнем с того, что если Вы читаете это, то у вас уже готова CentOS, причем для установки гостевых ВМ разной разрядности (32 или 64), хост-сервер (физический сервер, на котором и будем устанавливать KVM вместе с ВМ) должен быть именно с 64-битной ОС.
Все действия выполняются из-под пользователя root
.
Подготовка
Проверяем, поддерживает ли CPU аппаратную виртуализацию:
egrep '(vmx|svm)' /proc/cpuinfo |
Если вывод не пустой, значит — процессор поддерживает аппаратную виртуализацию. Кому интересно, все действия выполнялись на конфигурации Intel® Core™ i7-920 Quadcore 2.66 GHz / 48GB / 2 TB SATA 3 Gb/s 7200 rpm
Устанавливаем KVM и библиотеки виртуализации
yum install kvm libvirt
|
Запускаем сервис KVM и добавляем в автозапуск
service libvirtd start chkconfig libvirtd on |
Смотрим, загружен ли модуль KVM:
lsmod | grep kvm |
Приблизительный вывод:
kvm_intel 54285 0 kvm 332980 1 kvm_intel |
В данном случае видим, что загружен модуль kvm_intel
, так как производитель CPU — Intel.
Проверка подключения к KVM:
virsh sysinfo |
Получился вывод:
<sysinfo type='smbios'> <bios> <entry name='vendor'>American Megatrends Inc.</entry> <entry name='version'>V8.14B8</entry> <entry name='date'>11/09/2012</entry> ..... |
Создание хранилища для виртуальных машин (Storage Pool)
Существует множество способов, как настроить хранилище разных видов.
В рассматриваемом же примере описан простой тип хранилища — для каждой ВМ создается свой файл *.img
под виртуальный жесткий диск (или диски — если добавить их несколько), размещены они будут в директории /guest_images
Создаем папку под образы:
mkdir /guest_images |
Назначаем владельца и выдаем привилегии:
chown root:root /guest_images chmod 700 /guest_images |
Проверяем:
# ls -la /guest_images итого 8,0K drwx------ 2 root root 4,0K Апр 3 12:46 . drwxr-xr-x 25 root root 4,0K Апр 3 12:46 .. |
Настраиваем SELinux:
semanage fcontext -a -t virt_image_t '/guest_images(/.*)?' restorecon -R /guest_images |
Инициализируем директорию
Я делаю это с использованием virt-manager
, который установлен на CentOS
В Virt-manager
заходим в свойства сервера:
Переходим на вкладку Storage
Добавляем новый пул:
003png
Указываем его истинный путь:
Проверяем:
Настройка сети на хост-сервере
Перед выполнением этого шага, надо убедиться, что на хост-сервере установлен пакет bridge-utils
rpm -qa | grep bridge-utils |
Иначе при выполнении операций с сетью вы рискуете потерять связь с сервером, особенно обидно если он удаленный, и физического доступа к нему у вас нет.
yum -y install bridge-utils |
Положим, что для выхода «в мир» использовался интерфейс eth0
, и он был соответствующим образом настроен.
На нем настроен IP-адрес 10.110.10.15
из /24
сети, маска — 255.255.255.0
, шлюз 10.110.10.1
.
Продолжаем, создаем сетевой интерфейс типа bridge
на хост-сервере
Содержимое файла /etc/sysconfig/network-scripts/ifcfg-br0
приводим к виду
DEVICE="br0" NM_CONTROLLED="no" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="static" IPADDR="***.***.***.***" GATEWAY="***.***.***.***" DNS1="***.***.***.***" DNS2="***.***.***.***" DNS3="***.***.***.***" NETMASK="***.***.***.***" MTU="1500" DEFROUTE="yes" IPV4_FAILURE_FATAL="yes" SCOPE="peer ***.***.***.***" IPV6INIT=yes IPV6ADDR=***.***.***.*** IPV6_DEFAULTGW=***.***.***.*** IPV6_DEFAULTDEV=eth0 |
Приводим основной сетевой интерфейс /etc/sysconfig/network-scripts/ifcfg-eth0
, который использовался для выхода в «мир», к виду:
DEVICE="eth0" BOOTPROTO="none" HOSTNAME=CentOS-65-64-minimal HWADDR="***.***.***.***" IPV6INIT="no" MTU="1500" NM_CONTROLLED="no" ONBOOT="yes" TYPE="Ethernet" NAME="System eth0" BRIDGE="br0" |
!!! Важно!!!
DEVICE=«eth0»
Имя интерфейса должно остаться таким, как было в системе. Если у вас для выхода в Интернет использовался интерфейс eth1
, тогда редактировать надо его.
HWADDR=«*.*.*.*»
МАС-адрес также должен остаться таким, как был в системе.
Заменяем route-eth0
на route-br0
Когда проверили все, перезагружаем сеть:
service network restart |
Проверяем состояние подключения типа «bridge»:
brctl show |
# brctl show bridge name bridge id STP enabled interfaces br0 8000.406186e9d881 no eth0 virbr0 8000.52540038e10d yes virbr0-nic |
Делаем настройки в iptables , чтобы трафик виртуалок «ходил» через соединение типа bridge
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT service iptables save service iptables restart |
Опционально: можно улучшить быстродействие соединения bridge, поправив настройки в /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 |
После этого:
sysctl -p /etc/sysctl.conf service libvirtd reload |
Установку я произвожу через VirtManager, поэтому создание ВМ через консоль описывать не буду.
P.S. Пример настройки сети сделан для серверов арендованных в Hetzner, поскольку их роутинг не позволяет сделать нормально. Для других вариантов используем:
# vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE="br0" NM_CONTROLLED="no" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="static" IPADDR="10.110.10.15" GATEWAY="10.110.10.1" DNS1="8.8.8.8" DNS2="8.8.4.4" MTU="1500" NETMASK="255.255.255.0" DEFROUTE="yes" IPV4_FAILURE_FATAL="yes" IPV6INIT="no" NAME="System br0" |
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="none" HOSTNAME="localhost.localdomain" HWADDR="00:9C:02:97:86:70" IPV6INIT="no" MTU="1500" NM_CONTROLLED="no" ONBOOT="yes" TYPE="Ethernet" NAME="System eth0" BRIDGE="br0" |
Автоматический запуск виртуальных машин
virsh autostart TestServer |