====== Установка и настройка 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 | Получился вывод: | American Megatrends Inc. V8.14B8 11/09/2012 ..... | ==== Создание хранилища для виртуальных машин (Storage Pool) ==== Существует [[https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/chap-Virtualization_Administration_Guide-Storage_Pools-Storage_Pools.html#sect-Virtualization-Storage_Pools-Creating-Local_Directories|множество способов]], как настроить хранилище разных видов. В рассматриваемом же примере описан простой тип хранилища — для каждой ВМ создается свой файл ''*.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'' заходим в свойства сервера: {{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/kvm/001.png?nolink&}} == Переходим на вкладку Storage == {{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/kvm/002.png?nolink&}} == Добавляем новый пул: == {{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/kvm/003png?nolink&}} == Указываем его истинный путь: == {{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/kvm/004.png?nolink&}} == Проверяем: == {{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/kvm/005.png?nolink&}} === Настройка сети на хост-сервере === Перед выполнением этого шага, надо убедиться, что на хост-сервере установлен пакет ''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 |