Подключение к удаленной виртуальной машине 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.
Как подключиться к виртуальной машине на 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
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 :
Для того, чтобы виртуальные сервера работали в нашей реальной локальной сети на хост-машине создаем сетевой мост.
Настройка сети в KVM
Настройка сети для виртуальных машин в kvm очень похожа на настройку в qemu, поэтому любая документация к qemu подходит и для kvm. В этой статье описывается как настроить наиболее часто используемые типы подключения виртуальной машины к сети. Эта статья основана на Networking — KVM.
Пользовательская сеть
Варианты использования:
- Вам нужен простой способ дать виртуальной машине доступ в Интернет и в вашу локальную сеть;
- Вам не нужен доступ к виртуальной машине из сети или из других виртуальных машины;
- Вы готовы пожертвовать производительностью;
- Внимание: пользовательская сеть не поддерживает некоторые возможности сетей, например ICMP, поэтому некоторые приложения (такие как ping) могут работать неправильно.
- Настроенная и запущенная виртуальная машина;
- Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
- Если виртуальной машине нужен доступ в Интернет или в локальную сеть, то у хост-системы должен быть доступ в эти сети.
- Просто запустите виртуальную машину с параметрами «-net nic -net user», например:
qemu-system-x86_64 -hda /path/to/hda.img -net nic -net user
- IP-адрес может быть назначен автоматически DHCP-сервером, встроенным в QEMU;
- Если вы хотите запустить несколько виртуальных машин, то вам не понадобится назначать для них различные MAC-адреса;
- Используя опцию «hostfwd» вы можете получить доступ к одном порту на виртуальной машине. Например, если вы хотите передать файл из хост-системы на виртуальную машину, то запустите машину с параметрами «-net nic -net user,hostfwd=tcp::5555-:22». В данном случае вы перенаправить порт 5555 из хост-системы на порт 22 виртуальной машины. Команда «scp -P 5555 file.txt root@localhost:/tmp», выполненная на хост-системе, скопирует файл в виртуальную машину. Также вы можете использовать другой адрес хост-системы для подключения.
Внутренний виртуальный мост
Варианты использования:
- Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам, ни из реальной сети.
- Организация сети между виртуальными машинами и хост-системой. От первого варианта отличается только добавлением адреса на мостовой интерфейс хоста. Если возникнет потребность, можно добавить реальный интерфейс в мост, тогда виртуальные машины будут подключены к реальной LAN.
- Настроенная и запущенная виртуальная машина;
- Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
- Вам понадобятся следующие программы:
Если вы не хотите запускать их из под root-a, то вам понадобится настроить sudo для их запуска.
Решение:
Подготовка
В Седьмой платформе
- Во-первых, можно стартовать виртуальные машины с помощью libvirtd и управлять ими посредством virsh, при этом всё будет сделано автоматически. Нужно только правильно указать интерфейс (опция --network bridge).
- Во-вторых, можно использовать мостовой интерфейс virbr0, который появляется в системе после установки пакета kvm. Интерфейсу уже назначен IP 192.168.122.1/24 (см. конфигурация ю файле /etc/libvirt/qemu/networks/default.xml).
Перед запуском виртуальной машины создайте tap-интерфейс, добавьте его мост и потом используйте его при запуске kvm:
sudo tunctl -u $USERNAME -t tap11 sudo brctl addif virbr0 tap11 sudo ip link set tap11 up kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:82,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no
Создать tap-интерфейсы и добавить их в мост можно и с помощью скриптов /etc/net (см. man etcnet).
- В-третьих, можно использовать системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить «службу» bridge:
ip link | grep -q tap100: || tunctl -u $USERNAME -t tap100 INTERFACES="tap100" BRIDGE_INTERFACE="br0"
Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo:
sudo service bridge start
В дальнейшем виртуальные машины нужно запускать с использованием этих готовых интерфейсов, например:
kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap100,script=no
В старых дистрибутивах
- Нужно создать и сконфигурировать мост, например:
sudo brctl addbr br1 sudo ip link set br1 up
- Для связи по сети между виртуальной машиной и хост-системой нужно задать адрес IP мосту, например:
sudo ip addr add 192.168.100.1/24 dev br1
или, чтобы не задавать адрес вручную, создайте файл /etc/net/ifaces/br1/ipv4address, содержащий единственную строку «192.168.100.1/2» (Это не обязательно, если доступ по сети в/из виртуальную машину не нужен.)
Также можно сконфигурировать сервер DHCP, чтобы он выдавал адреса в подсети интерфейса br1 (см. man dhcpd).
Включение виртуальной машины в мост
- Необходимо (стандартный вариант)
— наличие двух сетевых карт на хосте eth0 и eth1 подключенных к локальной сети, — интерфейс eth0 настроен и работает в сети, eth1 включен настройки не обязательны
- Создать мост br0 (некоторые разработчики считают, что команды tunctl и brctl устарели)
- создаем мост br0 штатными средствами ip link add br0 type bridge - добавляем физический итерфейс eth1 в мост ip link set eth1 master br0 - поднимаем мостовой интерфейс br0 ip link set up dev br0
-- вышеприведенных трех команд достаточно, чтобы при использовании virt-manager, поднять машину работающую в локальной сети -- указать в virt-manager (создать сеть на базе 'Общее устройство' и указать имя моста 'br0')
- Создать скрипт qemu-ifup следующего содержания без sudo и «устаревших» утилит:
- скрипт необходим для запуска qemu-system-x86_64 c параметрами в консоли - мост должен быть создан ip link add br0 type bridge; ip link set eth1 master br0; ip link set up dev br0 - вносим и сохраняем в файл mcedit /etc/qemu-ifup и делаем его исполняемым chmod +x /etc/qemu-ifup следующий код: #!/bin/sh set -x switch=br0 if [ -n "$1" ];then ip tuntap add $1 mode tap user `whoami` ip link set $1 up sleep 0.5s ip link set $1 master $switch exit 0 else echo "Error: no interface specified" exit 1 fi - команда настройки сети для qemu-system-x86_64 -device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup
- Общая команда запуска виртуальной машины может выглядеть так
qemu-system-x86_64 -enable-kvm -accel accel=kvm,thread=multi \ -vga qxl \ -cpu core2duo \ -m 2048 \ -drive format=qcow2,file=/var/lib/libvirt/images/korpus_bs1.qcow2 \ -device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup
- Создать скрипт qemu-ifup следующего содержания (c использованием sudo, возможно необходимы предварительные настройки):
#!/bin/sh set -x switch=br0 if [ -n "$1" ];then /usr/bin/sudo /sbin/tunctl -u `whoami` -t $1 /usr/bin/sudo /sbin/ip link set $1 up sleep 0.5s /usr/bin/sudo /sbin/brctl addif $switch $1 exit 0 else echo "Error: no interface specified" exit 1 fi
- Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
#!/bin/bash # generate a random mac address for the qemu nic printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))
- Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap
- Внутри каждой виртуальной машины нужно сконфигурировать уникальный адрес IP из одной и той же подсети.
Работа с предварительно созданными иинтерфейсами
Можно заранее (в стартовом скрипте) настроить все интерфейсы и затем использовать их в виртуальных машинах. При этом обязательно нужно указывать опцию script=no:
kvm . -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no
- Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
- Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
- Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
- Для включения в мост необходимо использовать интерфейсы tap, но не tun. Дело в том, что у интерфейсов tun нет заголовков ethernet, которые требуются для работы моста.
Публичный мост
Предупреждение: Данный метод может не работать с большинством беспроводных устройств.
Варианты использования:
- Вы хотите назначать IP-адреса виртуальным машинам и сделать их доступными из локальной сети;
- Вы хотите большой производительности от виртуальной машины.
- Настроенная и запущенная виртуальная машина;
- Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
- Вам понадобятся следующие программы. Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска:
/sbin/ip /usr/sbin/brctl /usr/sbin/tunctl
- Хост-система должна иметь доступ в интернет и в локальную сеть.
Вариант №1: Использование средств дистрибутива
- Создать файл /etc/net/ifaces/breth0/options следующего содержания:
TYPE=bri BOOTPROTO=dhcp HOST=eth0 DISABLED=no NM_CONTROLLED=no
- Применить новые настройки сети командой:
/etc/init.d/network restart
- Интерфейс моста breth0 должен получить IP-адрес, а интерфейс eth0 должен быть без адреса.
Особенности VLANов
Если вы используете VLANы но до виртуальной машины трафик не доходит, выполните команды:
# cd /proc/sys/net/bridge # ls bridge-nf-call-arptables bridge-nf-call-iptables bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged # for f in bridge-nf-*; do echo 0 > $f; done
Варинат №2: «Ручной»
- Создать мост командой:
sudo /usr/sbin/brctl addbr br0
- Добавить физический интерфейс в этот мост, например eth0:
sudo /usr/sbin/brctl addif br0 eth0
- Создать скрипт qemu-ifup следующего содержания:
#!/bin/sh set -x switch=br0 if [ -n "$1" ];then /usr/bin/sudo /usr/sbin/tunctl -u `whoami` -t $1 /usr/bin/sudo /sbin/ip link set $1 up sleep 0.5s /usr/bin/sudo /usr/sbin/brctl addif $switch $1 exit 0 else echo "Error: no interface specified" exit 1 fi
- Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
#!/bin/bash # generate a random mac address for the qemu nic printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))
- Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap
- Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
- Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
- Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
Маршрутизация/iptables
Также вы можете объединить виртуальные машины tap-интерфесом в хост-системе и настроить правила iptables в хост-система, чтобы она была маршутизатором и сетевым экраном для виртуальных машин.
Настройки маршрутизации сводятся к созданию маршрута по умолчанию в виртуальной машине, указывающего на хост-систему, разрешение пересылки пакетов (IP forwarding) и настройки маршрута на tap-интерфейс виртуальной машины в хост-системе.
Заблаговременно проверьте настройки:
- Хост-система: Разрешить пересылку пакетов и добавить маршрут до виртуальной машины (должно быть помещено в скрипт — маршрут необходимо добавить после запуска виртуальной машины):
sysctl -w net.ipv4.ip_forward=1 # разрешить пересылку пакетов IPv4 route add -host dev # добавить маршрут до виртуальной машины
- Виртуальная машина: маршрут по умолчанию указывает на хост-систему ( должен быть в одной сети с ):
route add default gw
- Виртуальная машина v2: если IP-адрес хост-системы не в одной сети с , тогда надо вручную добавить маршрут до хост-системы перед добавлением маршрута по умолчанию:
route add -host dev route add default gw
VDE
Другой способ настройки сети это VDE (Virtual Distributed Ethernet).
Известные баги
Отказы сети в гостевых Windows
Под большой нагрузкой сетевой интерфейс в гостевой машине с ОС Windows перестаёт принимать и отправлять пакеты в хост-машину. Такое поведение характерно для любой модели виртуального интерфейса и для любой версии Windows в QEMU-KVM как минимум до версии 1.4.
Существует обходное решение: нужно заново проинициализировать сетевой интерфейс гостевой машины. Либо это можно сделать из гостевой ОС, либо из хост-машины парой команд virsh detach-interface и atttach-interface (и это надёжнее). Проверяем работоспособность при этом, очевидно, командой ping. Варианты скриптов для гостевой машины: [1], [2]. В скрипте для хоста перед проверкой пинга требуется проверить, работает ли гостевая ОС.