Установка и настройка KVM под управлением CentOS 6

Установка и настройка KVM под управлением CentOS 6

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Мануал, который отточен многоразовым применением, про который с уверенностью могу сказать, что «точно работает!»

Начнем с того, что если Вы читаете это, то у вас уже готова CentOS 6, причем для установки гостевых ВМ разной разрядности (32 или 64), хост-сервер (физический сервер, на котором и будем устанавливать KVM вместе с ВМ) должен быть именно с 64-битной ОС.
Все действия выполняются из-под пользователя root.

Подготовка

Проверяем, поддерживает ли CPU аппаратную виртуализацию:

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

Если вывод не пустой, значит — процессор поддерживает аппаратную виртуализацию.
Кому интересно, все действия выполнялись на конфигурации
Intel® Core™ i7-920 Quadcore 2.66 GHz / 48GB / 2 TB SATA 3 Gb/s 7200 rpm

Устанавливаем KVM и библиотеки виртуализации

1
yum install kvm libvirt

Запускаем сервис KVM и добавляем в автозапуск

1
2
service libvirtd start
chkconfig libvirtd on

Смотрим, загружен ли модуль KVM:

1
lsmod | grep kvm

Приблизительный вывод:

1
2
kvm_intel              54285  0 
kvm 332980 1 kvm_intel

В данном случае видим, что загружен модуль kvm_intel, так как производитель CPU — Intel.
Проверка подключения к KVM:

1
virsh sysinfo

Получился вывод:

1
2
3
4
5
6
<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

Создаем папку под образы:

1
mkdir /guest_images

Назначаем владельца и выдаем привилегии:

1
2
chown root:root /guest_images
chmod 700 /guest_images

Проверяем:

1
2
3
4
# 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:

1
2
semanage fcontext -a -t virt_image_t '/guest_images(/.*)?'
restorecon -R /guest_images

Инициализируем директорию

Я делаю это с использованием virt-manager, который установлен на CentOS
В Virt-manager заходим в свойства сервера:

Переходим на вкладку Storage

Добавляем новый пул:

Указываем его истинный путь:

Проверяем:

Настройка сети на хост-сервере

Перед выполнением этого шага, надо убедиться, что на хост-сервере установлен пакет bridge-utils

1
rpm -qa | grep bridge-utils

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

1
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 приводим к виду

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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, который использовался для выхода в «мир», к виду:

1
2
3
4
5
6
7
8
9
10
11
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

Когда проверили все, перезагружаем сеть:
1
service network restart
Проверяем состояние подключения типа «bridge»:
1
brctl show
1
2
3
4
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.406186e9d881 no eth0
virbr0 8000.52540038e10d yes virbr0-nic
Делаем настройки в iptables, чтобы трафик виртуалок «ходил» через соединение типа bridge
1
2
3
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
service iptables save
service iptables restart

Опционально: можно улучшить быстродействие соединения bridge, поправив настройки в /etc/sysctl.conf

1
2
3
net.bridge.bridge-nf-call-ip6tables = 0 
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

После этого:

1
2
sysctl -p /etc/sysctl.conf
service libvirtd reload

Установку я произвожу через VirtManager, поэтому создание ВМ через консоль описывать не буду.

P.S.
Пример настройки сети сделан для серверов арендованных в Hetzner, поскольку их роутинг не позволяет сделать нормально.
Для других вариантов используем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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"
Автоматический запуск виртуальных машин
1
virsh autostart TestServer