Содержание

Автор: 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

После создания виртуальных машин, при необходимости запуска их во время загрузки, есть смысл прописать следующие команды в некий файл, который запускать в /etc/rc.d/rc.local:

/usr/sbin/virsh start slackware64-14.2-fileserver
/usr/sbin/virsh start slackware64-14.2-1c
/usr/sbin/virsh start slackware64-14.2-AD
/usr/sbin/virsh start windows-7

в этом примере идёт запуск виртуальных машин по их названию образа.

Аналогично и их отключение.

/usr/sbin/virsh shutdown slackware64-14.2-fileserver
/usr/sbin/virsh shutdown slackware64-14.2-1c
/usr/sbin/virsh shutdown slackware64-14.2-AD
/usr/sbin/virsh shutdown windows-7

На компьютере

Конфигурация компьютера особой роли не играет.
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


Так как соединение буде через ssh, то лучше сначала соединиться в консоли, что бы получить ключ и добавить его в known_hosts. А иначе просто придётся отвечать на лишние вопросы :). Пользователь может быть любой, входящий в группу «users» на сервере. Указать другую группу можно в /etc/libvirt/libvirtd.conf. Я соединюсь под root'ом.
Добавим соединение с нашим сервером. Файл → Добавить соединение. Ставим галку «Удалённое подключение», выбираем тип соединения SSH, вводим имя пользователя и IP-адрес узла, нажимаем на «Подключиться».

Вводим пароль пользователя.

Видим, что подключились.

Добавим виртуальную машину. Файл → Новая виртуальная машина или просто кнопка «Новая». Выбираем метод установки «Локальный ISO или CDROM» и нажимаем «Вперед».

Выбираем тип и версию операционной системы, а так же образ ISO нажав на кнопку «Обзор».

Предложенные по умолчанию тома хранилищ, я удалил т.к. установочные ISO-образы у меня хранятся в отдельном каталоге, а образы виртуальных машин будут на отдельных разделах. Поэтому создадим новые тома с моими путями нажав на «+» (Добавить пул).

Дадим название пулу, выберем тип - «каталог в файловой системе» и нажмем кнопку «Вперед».

Укажем каталог с ISO-образами. Почему-то кнопка «Обзор» не активна, поэтому просто вводим путь вручную и нажимаем кнопку «Готово».

В появившемся списке выбираем нужный ISO-образ и нажимаем на кнопку «Выбор тома»

Прописался путь до ISO-образа, жмём «Вперед».

Выделяем виртуальной машине ОЗУ, количество процессоров и жмём «Вперед».

Как видим, перевод на русский язык выполнен не до конца. Ничего страшного, в этом окне «работаем по-английски» :).
Так как я выделил для образов виртуальных машин отдельные разделы, примонтированные в отдельные каталоги, то их нам и надо указать как стороннее хранилище. Поэтому выбираем «Select or create custom storage» и жмём на кнопку «Manage».

Теперь необходимо указать каталог, где будет располагаться образ виртуальной машины. Создадим новый том нажав на «+» (Добавить пул). Дадим название пулу, выберем тип - «каталог в файловой системе» и нажмем кнопку «Вперед».

Укажем каталог. Кнопка «Обзор» опять не активна, поэтому просто вводим путь вручную и нажимаем кнопку «Готово».

Создаем образ виртуальной машины в выбранном пуле нажав на «+» (Создать том).

Даём название образу и, так как используем QEMU, выбираем формат qcow2. Под размер тома отдаём практически всё пространство и нажимаем кнопку «Готово».

Выбираем появившийся образ виртуальной машины и жмём «Выбор тома».

Путь до образа виртуальной машины прописался, жмём «Вперед».

Проверяем всё ли верно прописано, ставим галку «Дополнить конфигурацию перед установкой», в «Выбор сети» выбираем созданный ранее на сервере br0 и жмём на кнопку «Готово». Если где-то ошиблись, то возвращаемся назад и исправляем.

В открывшимся окне в левом списке выбирем «Дисплей Spice» и поменяем:
Тип на VNC-сервер, Адрес - Все интерфейсы, Порт - уберем галку с «Авто» и пропишем вручную «5901» (мы же сами хотим всё контролировать? :) ), введём пароль и выбирем раскладку. Нажимаем кнопку «Применить» и «Начать установку».

Вводим пароль для подключения к серверу VNC, тот, что мы ввели ранее в соседнем окне настроек.

После ввода пароля мы видим процесс установки ОС на виртуальную машину.

После того, как завершится весь процесс установки, настраиваем сеть в гостевой системе на нашу ЛВС. И она становится её частью! :)

Ссылался на...


http://docs.slackware.com/howtos:general_admin:kvm_libvirt

Обсуждаем на форуме