Используем KVM для создания виртуальных машин на сервере
Эту заметку я пишу для того, чтобы продемонстрировать пошаговую установку и настройку виртуальной машины в Linux на базе KVM. Ранее я уже писал про виртуализацию, где использовал замечательный инструмент Vagrant.
Сейчас передо мной встал вопрос аренды хорошего сервера с большим объёмом оперативной памяти и объёмным жестким диском. Но запускать проекты прямо на хост-машине не хочется, поэтому буду разграничивать их по отдельным небольшим виртуальным серверам с ОС Linux или docker-контейнерам (о них расскажу в другой статье).
Все современные облачные хостинги работают по такому же принципу, т.е. хостер на хорошем железе поднимает кучу виртуальных серверов, которые мы привыкли называть VPS/VDS, и раздаёт их пользователям, либо автоматизирует этот процесс (привет, DigitalOcean).
KVM (kernel-based virtual machine) это программное обеспечения для Linux, использующее аппаратные средства x86-совместимых процессоров для работы с технологией виртуализации Intel VT/AMD SVM.
Установка KVM
Все махинации по созданию виртуальной машины я буду проводить на ОС Ubuntu 16.04.1 LTS. Чтобы проверить поддерживает ли ваш процессов аппаратную виртуализацию на базе Intel VT/AMD SVM, выполняем:
grep -E '(vmx|svm)' /proc/cpuinfo
Если терминал непустой, то значит всё в порядке и KVM можно устанавливать. Ubuntu официально поддерживает только гипервизор KVM (входит в состав ядра Linux) и советует использовать библиотеку libvirt в качестве инструмента по управлению им, что мы и будем делать дальше.
Проверить поддержку аппаратной виртуализации в Ubuntu также можно через команду:
kvm-ok
В случае успеха, вы увидите что-то вроде этого:
INFO: /dev/kvm exists
KVM acceleration can be used
Устанавливаем пакеты для работы с KVM:
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Если у вас есть доступ к графической оболочке системы, то можно установить GUI менеджер libvirt:
sudo apt-get install virt-manager
Пользоваться virt-manager достаточно просто (не сложнее VirtualBox), поэтому в этой заметке речь пойдёт про консольный вариант установки и настройки виртуального сервера.
Установка и настройка виртуального сервера
В консольном варианте установки, настройки и управлением системой, незаменимым инструментом является утилита virsh (надстройка над библиотекой libvirt). У неё большое количество опций и параметров, подробное описание можно получить так:
man virsh
или вызвать стандартный "help":
virsh help
Я всегда придерживаюсь следующих правил при работе с виртуальными серверами:
- Храню iso образы ОС в каталоге /var/lib/libvirt/boot
- Храню образы виртуальных машин в каталоге /var/lib/libvirt/images
- Явно задаю каждой новой виртуальной машине свой статичный IP адрес через DHCP сервер гипервизора.
Приступим к установке первой виртуалки (64-битной серверной убунте 16.04 LTS):
cd /var/lib/libvirt/boot
sudo wget http://releases.ubuntu.com/16.04/ubuntu-16.04.1-desktop-amd64.iso
Скачав образ запускаем установку:
sudo virt-install \
--virt-type=kvm \
--name ubuntu1604\
--ram 1024 \
--vcpus=1 \
--os-variant=ubuntu16.04 \
--hvm \
--cdrom=/var/lib/libvirt/boot/ubuntu-16.04.1-server-amd64.iso \
--network network=default,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/ubuntu1604.img,size=20,bus=virtio
Переводя все эти параметры на "человеческий язык", то получается, что мы создаём виртуальную машину с ОС Ubuntu 16.04, 1024 МБ ОЗУ, 1 процессором, стандартной сетевой картой (виртуальная машина будет ходить в интернет как-будто из-за NAT), 20 ГБ HDD.
Стоит обратить внимание на параметр --os-variant, он указывает гипервизору под какую именно ОС следует адаптировать настройки.
Список доступных вариантов ОС можно получить, выполнив команду:
osinfo-query os
Если такой утилиты нет в вашей системе, то устанавливаем:
sudo apt-get install libosinfo-bin
После запуска установки, в консоли появится вот такая надпись:
Domain installation still in progress. You can reconnect to the console to complete the installation process.
Это нормальная ситуация, продолжать установку мы будем через VNC.
Смотрим на каком порту он был поднят у нашей виртуалки (в соседнем терминале, например):
virsh dumpxml ubuntu1604
...
<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
</graphics>
...
Порт 5900, на локальном адресе 127.0.0.1. Чтобы подключиться к VNC, необходимо использовать Port Forwarding через ssh. Перед тем как это сделать, убедитесь, что tcp forwarding разрешён у демона ssh. Для этого идём в настройки sshd:
cat /etc/ssh/sshd_config | grep AllowTcpForwarding
Если ничего не нашлось или вы видите:
AllowTcpForwarding no
То правим конфиг на
AllowTcpForwarding yes
и перезагружаем sshd.
Настройка Port forwarding
Выполняем команду на локальной машине:
ssh -fN -l login -L 127.0.0.1:5900:localhost:5900 server_ip
Здесь мы настроили ssh port forwarding с локального порта 5900 на серверный порт 5900. Теперь уже можно подключиться к VNC, используя любой VNC-клиент. Я предпочитаю UltraVNC из-за простоты и удобства.
После успешного подключения, на экране отобразится стандартное окно приветствия начала установки Ubuntu.
После завершения установки и привычной перезагрузки, появится окно входа в систему. Авторизовавшись, определяем IP адрес новоиспечённой виртуалки, чтобы позже сделать его статичным:
ifconfig
Запоминаем и идём на хост машину. Вытаскиваем mac-адрес "сетевой" карты виртуалки:
virsh dumpxml ubuntu1604 | grep 'mac address'
Запоминаем наш mac адрес:
<mac address='52:54:00:84:e0:7b'/>
Редактируем сетевые настройки гипервизора:
sudo virsh net-edit default
Ищем DHCP, и добавляем вот это:
<host mac='52:54:00:84:e0:7b' name='ubuntu1604' ip='192.168.122.131'/>
Должно получиться что-то вроде этого:
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
<host mac='52:54:00:84:e0:7b' name='ubuntu1604' ip='192.168.122.131'/>
</dhcp>
Для того, чтобы настройки вступили в силу, необходимо перезагрузить DHCP сервер гипервизора:
sudo virsh net-destroy default
sudo virsh net-start default
sudo service libvirt-bin restart
После этого перегружаем виртуальную машину, теперь она всегда будет иметь заданный ей IP адрес - 192.168.122.131.
Есть и другие способы задать виртуалке статичный IP, например, напрямую редактируя сетевые настройки внутри гостевой системы, но тут уже как душе вашей будет угодно. Я лишь показал вариант, который сам предпочитаю использовать.
Чтобы подключиться к терминалу виртуальной машины, выполняем:
ssh 192.168.122.131
Машина готова к бою.
Virsh: список команд
Чтобы посмотреть запущенные виртуальные хосты (все доступные можно получить добавив --all):
sudo virsh list
Перезагрузить хост можно:
sudo virsh reboot $VM_NAME
Остановить виртуальную машину:
sudo virsh stop $VM_NAME
Выполнить halt:
sudo virsh destroy $VM_NAME
Запуск:
sudo virsh start $VM_NAME
Отключение:
sudo virsh shutdown $VM_NAME
Добавить в автозапуск:
sudo virsh autostart $VM_NAME
Очень часто требуется склонировать систему, чтобы в будущем использовать её как каркас для других виртуальных ОС, для этого используют утилиту virt-clone.
virt-clone --help
Она клонирует существующую виртуалку и изменяет host-sensitive данные, например, mac address. Пароли, файлы и прочая user-specific информация в клоне остаётся прежней. Если на клонируемой виртуалке IP адрес был прописан вручную, то могут возникнуть проблемы с доступом по SSH на клон из-за конфликта (2 хоста с одинаковым IP).
Помимо установки виртуалки через VNC, также возможен вариант с X11Forwarding через утилиту virt-manager. В Windows, например, для этого можно использовать Xming и PuTTY.