Содержание
Автор: 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, тот, что мы ввели ранее в соседнем окне настроек.
После ввода пароля мы видим процесс установки ОС на виртуальную машину.
После того, как завершится весь процесс установки, настраиваем сеть в гостевой системе на нашу ЛВС. И она становится её частью! :)