Используем 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 . .
Порт 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 адрес:
Редактируем сетевые настройки гипервизора:
sudo virsh net-edit default
Ищем 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
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.
Ссылки
- Подсистема Linux в Windows
- Обзор инструмента Vagrant
Интересные записи:
- Windows 10 Ubuntu: запускаем Django приложение
- Введение в Vagrant
- Обновляем подсистему Linux на Windows 10
- Poetry: новый менеджер зависимостей в Python
- Как настроить свой VPN сервер
Как подключиться к виртуальной машине на KVM через VNC
Проверяю nmap с локальной сети 5900 порт — закрыт. И VNC не может подключиться к виртуалке. Подскажите, что я не так делаю?

manik207 ★
07.01.17 22:46:58 MSK

Ну так все правильно, слушает только локалхост. если очень хочется — как вариант — пробрасывайте порт с сетевого интерфейса на локалхост
Belen ★★
( 07.01.17 23:22:56 MSK )
int13h ★★★★★
( 08.01.17 01:15:41 MSK )

sudo dnf install virt-manager virt-manager -c qemu+ssh://user@host/system
В роли host — сервер виртуализации.
ArcFi ★
( 08.01.17 10:14:41 MSK )
Ответ на: комментарий от Belen 07.01.17 23:22:56 MSK

Спасибо за ответ.
Подключаться хочу по VNC-клиенту в винды, поэтому очень хочется)))
Пробросила порт в файрволе на локалхост
firewall-cmd --add-forward-port=port=5900:proto=tcp:toaddr=127.0.0.1 --permanent
Маскарадинг включила (не очень поняла тему, но может нужно, поправьте, если зря)
firewall-cmd --zone=public --add-masquerade --permanent
Если я правильно поняла, то файрволл пробросил порт 5900 на локалхост
firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eno1 sources: services: ssh ports: 5900/tcp protocols: masquerade: yes forward-ports: port=5900:proto=tcp:toport=:toaddr=127.0.0.1
Подключаюсь vnc-клиентом — Попытка подключения была безуспешной, не получен отклик от другого компа.
В клиенте vnc указываю хост для подключения и порт: 192.168.1.101:5900 (IP-адрес верный, сижу по нему в путти).
manik207 ★
( 08.01.17 12:32:31 MSK ) автор топика
Ответ на: комментарий от ArcFi 08.01.17 10:14:41 MSK

Спасибо за ответ
Сервер KVM стоит на хосте 192.168.1.101, virt-manager поставила из dnf, подключена к хосту по ssh, из него же запустила
virt-manager -c qemu+ssh://root@192.168.1.101/system ** (virt-manager:5717): WARNING **: Could not open X display (virt-manager:5717): Gtk-WARNING **: cannot open display: localhost:10.0
Ругается, что нет дисплея. Но ведь дисплея действительно нет, сентос еще устанавливать надо.
manik207 ★
( 08.01.17 13:03:06 MSK ) автор топика
Ответ на: Спасибо за ответ. от manik207 08.01.17 12:32:31 MSK
а сокет открыт и ждет соединения?
#netstat -tulpan | grep 5900
в конфиге вм нужно указать на каком адресе слушать. По умолчанию это 127.0.0.1 .
ving2 ★
( 08.01.17 13:10:44 MSK )
Ответ на: Спасибо за ответ от manik207 08.01.17 13:03:06 MSK

Подключаться хочу по VNC-клиенту в винды
Ругается, что нет дисплея
ArcFi ★
( 08.01.17 13:13:40 MSK )
Ответ на: комментарий от ving2 08.01.17 13:10:44 MSK
ving2 ★
( 08.01.17 13:17:33 MSK )
Ответ на: Спасибо за ответ. от manik207 08.01.17 12:32:31 MSK

И можно ничего не пробравсывать, а просто отредактировать конфиг виртуалки примерно так:
virsh edit vm1 . .
ArcFi ★
( 08.01.17 13:17:56 MSK )
Ответ на: комментарий от ArcFi 08.01.17 13:13:40 MSK

Спасибо! Получилось подключиться и установить ОС. Сделала фактически, копи-пастом, поняла мало.
Можете на пальцах пояснить?
Я понимаю, что есть хост-машина, которая у меня под IP 192.168.1.101, на ней я установила виртуальную машину, сейчас это ХР, еще будет Centos. На этих машинах открыт порт 5900 и далее +1 к каждой последующей. И запросы по этому порту виртуальная машина принимает только с локального хоста (это по дефолту). Через проброс портов в ssh с помощью VcXsrv и virt-manager, запускаю панель управления виртуальными машинами. При установке машины сразу указываю соединение Мост с действующим сетевым интерфейсом и после установки подключаюсь по RDP. Больше ничего не надо.
И если, создавать виртуалки из окна менеджера и прописывать Мостовое соединение, то конфиги править не нужно. А если создавать виртуалки из командной строки, то можно ли сразу указать порт подключения, и т.д. из параметров установки, дабы не править их потом?
manik207 ★
( 08.01.17 16:18:30 MSK ) автор топика
Ответ на: комментарий от manik207 08.01.17 16:18:30 MSK

Да, примерно так.
QEMU/KVM биндит порт на самом сервере виртуализации, поэтому доступ через SPICE/VNC не зависит от статуса загрузки виртуалки и наличия средств удалённого доступа на ней.
Мостовое сетевое подключение довольно удобно для интеграции виртуалок в существующую инфраструктуру.
Порт, доступ к нему и иные парраметры можно задать сразу при создании виртуалки:
virt-install . --graphics vnc,listen=0.0.0.0,port=5905 man virt-install
Подключение к удаленной виртуальной машине KVM
Здравствуйте. Установил Centos 7. Подключился к ней по ssh. Поставил QEMU-KVM. Создал виртуальную машину, а подключится к ней не могу. Как подключится к виртуальной машине, у которой нет даже IP?
Отслеживать
задан 24 фев 2018 в 7:48
372 1 1 серебряный знак 18 18 бронзовых знаков
24 фев 2018 в 8:06
@defrag, ничего не понятно(
24 фев 2018 в 8:35
Не понятно, что делать, или не понятно, потому что английский?
24 фев 2018 в 9:10
Непонятно что делать на английском)
24 фев 2018 в 11:03
@defrag , не понятно что делать на английском)
24 фев 2018 в 15:19
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Можно подключаться к консоли гостевой машины с помощью VNC. Для Libvirt надо в XML конфигурации машины добавить поддержку VNC:
Для голого QEMU/KVM есть ключ:
-vnc 0.0.0.0:5987
5987 — заведомо свободный порт на данной системе.
Внимание! Данная конфигурация позволит подключаться к консоли с других компьютеров вашей сети. Чтобы подключаться только локально, исправьте 0.0.0.0 на 127.0.0.1
Далее с помощью любого VNC клиента можно будет подключиться к консоли этой машины, используя соответствующий адрес и порт. Рекомендую UltraVNC для Windows и Remmina для Linux.
VNC доступ к виртуальной машине KVM
KVM использует VNC сервер для подключения к консоли виртуальной машины. Каждая машина получает свой порт, начиная с 5900: первая запущенная на сервере будет отвечать на адресе 127.0.0.1:5900, вторая — 127.0.0.1:5901 и так далее.
По-умолчанию VNC принимает подключения только через локальный адрес — 127.0.0.1. Но иногда удобнее сделать так, чтобы к консоли виртуальной машины можно было подключиться с другого компьютера.
Настройка VNC для доступа к виртуальным машинам KVM
Чтобы настроить доступ к виртуальной машине с использованием VNC, отредактируйте конфигурацию виртуалки.
Для этого нужно изменить настройки виртуальной машины.
virsh edit
Вам нужно изменить секцию graphics.
Приведенный пример будет принимать подключения на всех внешних IP адресах KVM сервера, запрашивая в качестве пароля 12345. Если удалить параметр passwd, то VNC не будет запрашивать пароль при подключении к консоли виртуальной машины.
Как определить VNC порт для подключения к виртуальной машине
Чтобы определить, на каком порту работает VNC сервер для конкретной виртуальной машины, если вы не задали этот порт явно в конфигурации, можно сделать следующее.
Выведите список всех выполняемых виртуальных машин:
$ sudo virsh list Id Name State ---------------------------------- 1 srv1 running 45 srv2 running
Теперь выполните команду, которая покажет номер VNC сервера для нужной виртуальной машины:
$ sudo virsh vncdisplay srv2 :0
Вообще эта команда должна выдать IP адрес и порт для подключения по VNC к указанному виртуальному серверу. На деле команда vncdisplay покажет корректное значение только если у вас не указан конкретный порт в настройках виртуальной машины.
К полученному числу вам нужно добавить 5900, чтобы получить локальный порт, на котором VNC сервер принимает подключения.
В приведенном примере нужно подключиться на адрес 127.0.0.1:5900, чтобы получить VNC доступ к srv2
Как подключиться к VNC на локальном адресе
Если вы не указали иное, VNC сервер, через который вы получаете доступ к виртуальным машинам KVM, принимает подключения на адресе 127.0.0.1.
Если гипервизор запущен на удаленном сервере, то как правило вы будете подключаться к нему используя SSH клиент.
Один из вариантов, чтобы при этом подключиться через VNC к запущенной виртуальной машине — переадресация портов SSH клиентом.
Опубликовано 04.03.2013 29.07.2013 Автор Сергей Шармазанов Рубрики Без рубрики
VNC доступ к виртуальной машине KVM: 1 комментарий
cmailserv.net :
Для того, чтобы виртуальные сервера работали в нашей реальной локальной сети на хост-машине создаем сетевой мост.