Это старая версия документа!


Автор: Graf
Дата написания: март 2016 г.

Сервер виртуализации (Qemu/KVM+libvirt+virtual-manager)


На сервере

Использовалось железо:
CPU - Intel(R) Xeon(R) CPU E5-2603 0 @ 1.80GHz
RAM - 8 Gb
HDD - 500Gb
OS - Slackware Linux 14.1 64-bit
Ядро- 3.10.17-smp
IP - 192.168.10.211
Разбивка диска:

# fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00079cf1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   209717247   104857600   83  Linux
/dev/sda2       964691968   976773167     6040600   82  Linux swap
/dev/sda3       209717248   964691967   377487360    5  Extended
/dev/sda5       209719296   335548415    62914560   83  Linux
/dev/sda6       335550464   461379583    62914560   83  Linux
/dev/sda7       461381632   587210751    62914560   83  Linux
/dev/sda8       587212800   713041919    62914560   83  Linux
/dev/sda9       713043968   838873087    62914560   83  Linux
/dev/sda10      838875136   964691967    62908416   83  Linux


Разделы /dev/sda5-10 созданы специально под образы виртуальных машин и примонтированны в каталог /vm/vm1-6. Так же, после установки системы, я создал каталог /iso_images для хранения iso-образов.
Slackware ставилась полностью вся, с Х-ми, но безо всяких DE и всем, что с ними связанно.

После установки системы устанавливаем sbopkg и обновляем саму систему при помощи slackpkg, предварительно настроив его на какое-либо зеркало.

# slackpkg update
# slackpkg upgrade-all

Далее удаляем пакет nc и ставим нужные пакеты при помощи sbopkg

# removepkg nc
# sbopkg -kBi "celt051 device-tree-compiler spice-protocol pyparsing spice usbredir vala yajl \
qemu gnome-python2-gconf gtk-vnc ipaddr-py libvirt libvirt-glib libvirt-python pygobject3  tunctl \
urlgrabber vte3 gstreamer1 gst1-plugins-base spice-gtk libbsd netcat-openbsd virt-manager"

Обновляем libvirt и virt-manager до последних версий. Я обновил путем редактирования info и SlackBuild в sbopkg. В итоге получил:

libvirt-1.3.2-x86_64-1_SBo
virt-manager-1.3.2-x86_64-1_Sbo

После запуска libvirt в системе появится интерфейс virbr0, мост виртуальной сети которая использует трансляцию сетевых адресов (NAT), благодаря которой гостевые системы (виртуальные машины) получают доступ к сетевым службам сервера.
Для доступа к виртуальным машинам из ЛВС и из виртуальных машин к ресурсам ЛВС (т.е. для создание полного ощущения, что это полноценный компьютер у кого-то на столе :) ) и потому, что NAT является медлительным и рекомендуется только для локальных установок, удалим этот интерфейс и создадим для наших нужд новый мост.

И так, удаляем virbr0:

# /etc/rc.d/rc.libvirt start
# virsh net-destroy default
# virsh net-undefine default
# /etc/rc.d/rc.libvirt restart

У меня на сервера 2 сетевых интерфейса. Один я настрою как основной, для работы с самим сервером, а второй отдам для организации моста для виртуальных машин. Оба порта в сети 192.168.10.0/24. Усечённый вывод /etc/rc.d/rc.inet1.conf

# Config information for eth0: - основной
IPADDR[0]="192.168.10.211"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""

# Config information for eth1: - для ВМ
IPADDR[1]=""
NETMASK[1]=""
USE_DHCP[1]=""
DHCP_HOSTNAME[1]=""

# Default gateway IP address:
GATEWAY="192.168.10.250"

Теперь создадим скрипт /etc/rc.d/add-kvmbr который создаст необходимый нам мост и не забудем сделать его исполняемым. Вот его содержимое:

LOCAL_IF="eth1"
BRIDGE_IF="br0"
BRIDGE_IP="192.168.121.1"
BRIDGE_MASK="255.255.255.0"
BRIDGE_BROADCAST="192.168.121.255"

# Выключаем мост (на всякий случай, если он включен)
ifconfig $BRIDGE_IF down

# Удаляем мост (если скрипт запускается не впервые)
brctl delbr $BRIDGE_IF

# Добавляем новый мост
brctl addbr $BRIDGE_IF

# Включаем в мост интерфейс
brctl addif $BRIDGE_IF $LOCAL_IF

# Убираем адрес с интерфейса, входящего в мост и поднимаем его
ifconfig $LOCAL_IF 0.0.0.0 promisc up

# Назначаем мосту адрес
ifconfig $BRIDGE_IF $BRIDGE_IP netmask $BRIDGE_MASK broadcast $BRIDGE_BROADCAST

# Включаем мост
ifconfig $BRIDGE_IF up

# для поднятия моста нужно время,  ждём
sleep 5

Ну, и дополним /etc/rc.d/rc.local

/etc/rc.d/rc.libvirt start
sleep 5
/usr/sbin/virtlogd -d

# Start bridge for VMs
/etc/rc.d/add-kvmbr

Для чистоты эксперимента reboot сервера, после чего видим, что всё задуманное получилось и пора поднимать виртуальные машины.

# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.121.1  netmask 255.255.255.0  broadcast 192.168.121.255
        inet6 fe80::225:90ff:fed3:6055  prefixlen 64  scopeid 0x20<link>
        ether 00:25:90:d3:60:55  txqueuelen 0  (Ethernet)
        RX packets 239  bytes 22419 (21.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 510 (510.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.211  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::225:90ff:fed3:6054  prefixlen 64  scopeid 0x20<link>
        ether 00:25:90:d3:60:54  txqueuelen 1000  (Ethernet)
        RX packets 264  bytes 23917 (23.3 KiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 34  bytes 5615 (5.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xfb500000-fb520000  

eth1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet6 fe80::225:90ff:fed3:6055  prefixlen 64  scopeid 0x20<link>
        ether 00:25:90:d3:60:55  txqueuelen 1000  (Ethernet)
        RX packets 353  bytes 59220 (57.8 KiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 13  bytes 1048 (1.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  memory 0xfb100000-fb120000  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
# ps aux | grep virt
root       838  0.0  0.1 338164  8584 ?        Sl   15:36   0:00 /usr/sbin/libvirtd -d -l -v -f /etc/libvirt/libvirtd.conf -p /var/run/libvirt/libvirtd.pid
root       911  0.0  0.0  60296  1236 ?        Sl   15:36   0:00 /usr/sbin/virtlogd -d
root       980  0.0  0.0   7116   968 pts/1    S+   15:54   0:00 grep virt

На компютере

Конфигурация компьютера особой роли не играет.
Slackware Linux установлен стандартно с KDE.

OS - Slackware Linux 14.1 32-bit
Ядро- 3.10.17-smp
KDE - 4.10.5
IP - любой из подсети 192.168.10.0/24

После установки системы устанавливаем sbopkg и обновляем саму систему при помощи slackpkg, предварительно настроив его на какое-либо зеркало.

# slackpkg update
# slackpkg upgrade-all

Далее удаляем пакет nc и ставим нужные пакеты при помощи sbopkg

# removepkg nc
# sbopkg -kBi "libbsd netcat-openbsd vala celt051 device-tree-compiler spice-protocol pyparsing \ 
spice usbredir vala gtk-vnc ipaddr-py libosinfo yajl libvirt libvirt-glib libvirt-python \
gnome-python2-gconf tunctl python-urllib3 python-requests gtk-vnc spice-protocol gstreamer1 \
gst1-plugins-base spice-gtk vte3 pygobject3 urlgrabber virt-manager"

Обновляем libvirt и virt-manager до последних версий. Я обновил путем редактирования info и SlackBuild в sbopkg. В итоге получил:

libvirt-1.3.2-i486-1_SBo
virt-manager-1.3.2-i486-1_SBo

Установка виртуальных машин

Управлять виртуальными машинами можно из консоли при помощи утилиты virsh, но мы воспользуемся её графической альтернативой - virt-manager'ом.
Запустить его можно 2 способами:
1. К → Система → Менеджер виртуальных машин
2. из консоли

$ virt-manager
Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:kvm (generated for current page)