Решил написать статью по настройке KVM в CentOS 7. Сначала сомневался в выборе дистрибутива, но в итоге решил остановится на CentOS. Немаловажным аргументом в пользу этого дистрибутива можно отнести то, что KVM поддерживается и продвигается компанией Red Hat. В первой части статьи я опишу процесс настройки KVM. Затем мы разберемся, как управлять средой виртуализации KVM. Вналчале я хотел записать ход своих действий, но в итоге вышло целое руководство по установке KVM и управлению контейнерами в пределах одного физического сервера. По мере своих возможностей я постраюсь и дальше добавлять сюда новую информацию.
Виртуализация KVM
Основное преимущество виртуализации — простота администрирования и экономия затрат. Даже при самом простом варианте развертывания, вы экономите аппаратные средства и время на обслуживание. Нескольких физических серверов, выполняющих различные задачи, могут заменить виртуальные машины запущенные на базе одного хоста. Следует признать, что издержки виртуализации порой бывают значительны, но это та цена, которую приходится платить в угоду удобства.
Для минимизации издержек и максимальной производительности виртуальных машин рекомендуется использовать драйвера virtio. Используя механизм паравиртуализации, драйвер virtio обеспечивают более эффективное взаимодействия виртуальных машин и гипервизора. Это позволяет достичь большей производительности и отзывчивости в работе виртуальных окружений. Драйвера virtio реализованы для блочных, сетевых и других устройств.
Большинство дистрибутивов Linux имеют ядро, в котором поддержка драйверов virtio включена по умолчанию. Например, Debian или CentOS после загрузки в гипервизоре KVM автоматически используюет драйвера virtio. В процессе установки дистрибутивов Windows нужна ручная установка драйверов. Для получения подробной информации о установке драйверов virtio в Windows, перейдите по этой ссылке.
Краткий обзор KVM
Перед тем как перейти к процессу установки и настройки KVM в CentOS, напишу пару строк о самой технологии. KVM — модуль ядра Linux, который обеспечивает доступ к функциям аппаратной виртуализации на процессорах Intel и AMD. С помощью модуля ядра KVM, виртуальные машины работают как обычный пользовательский процесс.
Для эмуляции I/O аппаратного обеспечения, гипервизоре KVM используется QEMU — это программа для эмуляции аппаратного обеспечения различных платформ, которая может работать и без KVM, но использование аппаратной виртуализации значительно ускоряет работу гостевых систем, поэтому использовать ее без KVM не имеет смылса.
Для управления контейнерами в гипервизоре KVM используется libvirt API. Библиотека libvirt является интерфейсом для управления виртуальными возможностями Linux. Ее используют для работы такие утилиты как: virsh
, virtinstall
и virt-clone
.
Системные требования
Главное условие для работы гипервизора KVM — это наличие у процессора поддержки аппаратной виртуализации. Все остальные технические характеристики зависят только от ваших потребностей. KVM может выделить гостевым системам больше процессоров и памяти, чем реально доступно на сервере. После запуска KVM контейнер используют необходимые ему ресурсы в пределах установленных ограничений. В это время другие виртульные машины используют свободные ресурсы другого контейнера. Оптимальное количество контейнеров, которые могут одновременно работать на одном физическом сервере подбирает опытным путем.
После установки KVM, виртуальные машины полностью резервируют весь выделенный для них объем ОЗУ. Для рационального использования ресурсов и лучшего уплотнения виртуальных машин, на хосте нужно включить модуль Kernel Same-page Merging. Ядро будет сканировать и автоматически освобождать память от идентичных страниц. Такой метод особенно эффективен для систем, на которых запущено множество однородных виртуальных машин.
Для динамического изменения объема оперативной памяти, выделенной виртуальной машине — использование balloon драйвера. Механизм требует поддержки со стороны ядра операционной системы. Для большинства дистрибутивов Linux поддержка virtio-balloon включена по умолчанию. Для Windows необходима ручная установка драйвера. В последних версиях KVM virtio-balloon включен по умолчанию.
Проверка поддержки VMX/SVM
В качестве платформы для настройки виртуализации KVM мы выбрали CentOS 7. Для полноценной работы KVM нужен процессор с поддержкой аппартаной виртуализации. В зависимости от производителя, CPU должен поддерживать Intel VMX или AMD SVM флаги. Для проверки на процессоре Intel и AMD достаточно выполнить команду:
egrep '(vmx|svm)' /proc/cpuinfo
Результат выполнения команды на процессоре с поддержкой Intel VT-x:
# egrep 'vmx' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse
sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc
pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm tpr_shadow vnmi
flexpriority ept vpid
Результат выполнения команды на процессоре с поддержкой AMD-V:
# egrep 'svm' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht
syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor
cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt
Если вы уверены, что процессор поддерживает аппаратную виртуализацию, а команда выдала отрицательный результат. Убедитесь что в BIOS включена технология VT-x или AMD-V. Перегрузите ваш сервер чтобы войти в BIOS, в разделе «Processors Settings» поищите параметры Intel Virtualization Technology
или SVM Mode
и установите их в положение «Enabled».
Установка KVM в CentOS 7
Для настройки гипервизора KVM в CentOS 7 необходимо установить всего несколько пакетов, которые не входят в базовую установку системы. Используйте команду ниже чтобы выполнить установку недостающих пакетов:
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
Включаем автозапуск службы libvirtd
:
systemctl enable libvirtd && systemctl start libvirtd
Далее необходимо выполнить перезагрузку системы. Теперь проверьте загрузились ли модули ядра kvm
и kvm_intel
(только процессоры Intel). Для этого выполните команду:
# lsmod | grep kvm kvm_intel 162153 0 kvm 525259 1 kvm_intel
В случае успеха, у вас результат выполнения команды должен быть аналогичен моему. Для проверки подключения к KVM выполните команду:
virsh sysinfo
Создание хранилища
На официальном сайте Red Hat есть мануал по настройке различных видов хранилиш. Я расскажу о использовании самого простого вида хранилища, когда под виртуальный жесткий диск создается отдельный файл .img
, который хранится на локальном диске. По умолчанию образы диска хранятся в каталоге /var/lib/libvirt/images
, вы можете выбрать любой другой каталог по своему усмотрению. По каталог хранения образов я выделил отдельный раздел, который смонтирован в системе как /images
.
Для надежного хранения данных рекомендуется использовать хотябы RAID 1 массив. Для удобства управления файловой системой я использовал lvm. Сделайте по моему примеру и выполните разметку диска так, как это сделал я:
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 298.1G 0 disk └─sda1 8:1 0 298.1G 0 part ├─storage-root 253:0 0 28G 0 lvm / ├─storage-swap 253:1 0 3.7G 0 lvm [SWAP] └─storage-images 253:2 0 266.4G 0 lvm /images
Далее я опишу последовательность своих действия для создания хранилища образов гостевых систем на основе каталога.
Выполним команду для создания представления пула хранения данных:
# virsh pool-define-as images dir - - - - "/images"
Pool images defined
Для примера я использовал каталог /images
. Вам нужно указать свой путь к каталогу для хранения файлов образов гостевых систем.
Проверим есть ли в списке добавленный нами пул хранения данных:
# virsh pool-list --all Name State Autostart ------------------------------------------- images inactive no
Используем команду ниже для создания нового хранилища на основе каталога:
# virsh pool-build images Pool images built # ls -la /images total 24 drwx------. 3 root root 4096 Apr 11 09:02 . dr-xr-xr-x. 19 root root 4096 Apr 11 10:43 .. drwx------. 2 root root 16384 Apr 11 09:02 lost+found # virsh pool-list --all Name State Autostart ------------------------------------------- images inactive no
Запускаем хранилище:
# virsh pool-start images
Pool images started
# virsh pool-list --all
Name State Autostart
-------------------------------------------
images active no
Включите автозапуск для нашего хранилища данных:
# virsh pool-autostart images
Pool images marked as autostarted
# virsh pool-list --all
Name State Autostart
-------------------------------------------
images active yes
Убедитесь, что хранилище настроено правильно:
# virsh pool-info images Name: images UUID: 144a8729-032d-45d1-be67-a377df3904fa State: running Persistent: yes Autostart: yes Capacity: 262.11 GiB Allocation: 60.02 MiB Available: 262.05 GiB # ls -la /images total 24 drwx------. 3 root root 4096 Apr 11 09:02 . dr-xr-xr-x. 19 root root 4096 Apr 11 10:43 .. drwx------. 2 root root 16384 Apr 11 09:02 lost+found
Новое хранилище образов гостевых систем KVM создано и готово к использованию.
Сетевые настройки хоста
После установки KVM, виртуальные машины имеют доступ к виртальной сети хоста с диапазоном адресов 192.168.122.0/24, для доступа к внешней сети используется NAT. Чтобы обеспечить полноценный доступ виртуальных машин к внешней сети, на хосте необходимо создать сетевой интерфейс типа bridge. Сначала убедитесь, что на хосте установлен пакет bridge-utils
:
rpm -qa | grep bridge-utils
Если вывод предыдущей команды пустой, выполните команду:
yum -y install bridge-utils
Для просмотра списка сетевых интерфейсов выполните команду:
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 48:5b:39:ae:6d:7d brd ff:ff:ff:ff:ff:ff inet 10.0.1.10/26 brd 10.0.1.63 scope global enp1s0 valid_lft forever preferred_lft forever inet6 fe80::4a5b:39ff:feae:6d7d/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 500 link/ether 52:54:00:40:7c:54 brd ff:ff:ff:ff:ff:ff
После установки KVM в системе появился новый сетевой интерфейс virbr0
. Сетевая карта enp1s0
подключена к моей локальной сети и использует адрес 10.0.1.10. Нужно отметить, что у вашего сетевого интерфейса может быть совсем другое название. Для того чтобы создать сетевой мост, откройте конфигурационный файл внешнего сетевого интерфейса:
nano /etc/sysconfig/network-scripts/ifcfg-enp1s0
Замените его содержимое на следующие параметры:
DEVICE="enp1s0"
ONBOOT=yes
HWADDR="00:00:00:00:00:00"
BRIDGE=br0
Название интерфейса и mac-адрес нужно заменить на свои. Теперь создаем сетевой интерфейс типа «bridge»:
nano /etc/sysconfig/network-scripts/ifcfg-br0
Добавьте в него следующие строки:
DEVICE="br0" TYPE=BRIDGE ONBOOT=yes BOOTPROTO=static IPADDR="10.0.1.10" NETMASK="255.255.255.192" GATEWAY="10.0.1.1" DNS1="8.8.8.8" DNS2="8.8.4.4"
Значения выделенные красным нужно изменить на свои. Применяем настройки:
service network restart
Проверяем состояние подключения типа «bridge»:
# brctl show bridge name bridge id STP enabled interfaces br0 8000.485b39ae6d7d no enp1s0 virbr0 8000.525400b593c3 yes virbr0-nic
Включаем транзит пакетов:
echo "net.ipv4.ip_forward = 1"|tee /etc/sysctl.d/99-ipforward.conf sysctl -p /etc/sysctl.d/99-ipforward.conf
Перезапускаем службу libvirtd
:
service libvirtd reload
На этом процесс настройки KVM в CentOS 7 закончен. В следующей записи я раскажу, как создавать и управлять виртуальными машинами KVM.