libvirt + vnc

здравствуйте, есть еще одна проблема с виртуализацией, схема такая:
сервер x86_64 Intel(R) Xeon(R) CPU E5405 @ 2.00GHz. на нем установлен kvm + libvirt. и несколько виртуальных машин созданныз virt-manager, которые запускаются через libvirtd такой строчкой:

/usr/bin/qemu-system-x86_64 --enable-kvm -S -M pc-0.12 -enable-kvm -m 512 -smp 1,sockets=1,cores=1,threads=1 -name dc1 -uuid f090bfc9-1cab-e4e9-51ea-80c9cc775bff -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/dc1.monitor,server,nowait -mon chardev=monitor,mode=readline -localtime -boot c -drive file=/virtual/sdb/dc1.img,if=none,id=drive-ide0-0-0,boot=on,format=qcow2 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -drive if=none,media=cdrom,id=drive-ide0-1-0,format=qcow2 -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device rtl8139,vlan=0,id=net0,mac=52:54:00:7e:a1:a7,bus=pci.0,addr=0x4 -net tap,fd=15,vlan=0,name=hostnet0 -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc 0.0.0.0:0,password -k en-us -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3

заходя потом по vnc на такую виртуалку, консоль qemu (ctrl+alt+2) не работает :(
хотя если запустить виртуалку вручную:

/usr/bin/qemu-system-x86_64 -m 512 -hda /dev/vm-storage/win-2003-template -boot c -vnc :3

то в консоль захожу без проблем..

может кто сталкивался уже с таким?

неужели у всех эта связка

неужели у всех эта связка нормально работает?

libvirt создает сокет для

libvirt создает сокет для консоли управления kvm -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/dc1.monitor,server,nowait и через него управляем процессами kvm
если вы используете libvirt то подключение к консоли не предусматривается. используете virsh

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

через virsh чтобы сменить

через virsh чтобы сменить образ cd нужно перезагружаться же :(
attach-disk --type cdrom win-2003-template /home/media/ISO/WinLite.iso hdc

К сожалению процесс libvirtd

К сожалению процесс libvirtd работает с монитор сокетом и не дает к нему подключиться. Можно сделать так

killall -9 libvirtd
unixterm /var/lib/libvirt/qemu/dc1.monitor (или nc -U, minicom, etc)
/etc/init.d/libvirt restart

разработчики говорят что нельзя передавать команды напрямую из-за угрозы безопасности и отказываются добавить возможность подключаться из клиента в сокету монитора.

Разработчики libvirt совсем не слушают что хотят пользователи. Я просил сделать чтобы в virsh показывало дисплей так

virsh list
ID Имя Статус Display
-------------------------------------------
4 winxp выполнение :13
6 ubuntu выполнение :17

меня послали нафик и пришлось самому патч писать))

тут тоже можно сделать патчик чтобы после -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/dc1.monitor,server,nowait дописать -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/dc1.monitor.free,server,nowait и ко второму сокету можно будет подключаться

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

Разработчики libvirt совсем

Разработчики libvirt совсем не слушают что хотят пользователи.

Не а, не так.
Разработчики libvirt совсем не слушают что хотят пользователи, не являющиеся корпоративными пользователями RHEL.

как бы кто платит зарплату, тот и командует :)

P.S RH нужен oVirt, и потому ломать никто ничего не будет :(

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Попробывал. Не получается kvm

Попробывал хакнуть libvirt чтобы он давал несколько команд -monitor. Не получается kvm не может открыть больше одного monitor сокета. Следующее описание замещает предидущее.
Боюсь что тут ничего не сделать если не хакать qemu чтобы можно было открывать несколько сокетов для libvirt и для пользователя либо както хакать libvirt чтобы можно было сделать virsh monitor (domain) и подключится к монитору, но это уже сложновато для меня.

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

Во! Вроде получилось! надо

Во! Вроде получилось!

надо писать второй сокет как -serial mon:unix а не -monitor unix

запускается такое:
root 22767 0.2 0.0 2208932 21044 ? Sl 20:33 0:00 /usr/bin/qemu-system-x86_64 -S -M pc-0.11 -m 2048 -smp 2 -name test -uuid 17946b4f-48c7-f30e-b731-f3203f24448a -monitor unix:/var/lib/libvirt/qemu/test.monitor,server,nowait -serial mon:unix:/var/lib/libvirt/qemu/test.monitor.free,server,nowait -localtime -boot d -drive file=/data/RIPLinuX-9.3.iso,if=ide,media=cdrom,index=2 -drive file=/data/test.img,if=ide,index=0 -net none -serial none -parallel none -usb -usbdevice tablet -vnc :1 -vga cirrus

сокет /var/lib/libvirt/qemu/test.monitor основной для libvirt
сокет /var/lib/libvirt/qemu/test.monitor.free дополнительный для пользователя

подключаемся туда unixterm /var/lib/libvirt/qemu/test.monitor.free
и нажимаем Ctrl-A c чтобы открыть второй монитор

вот патч чтобы это сделать для libvirt 0.7.2

--- a/qemu_conf.c 2009-09-30 18:20:25.000000000 +0400
+++ b/qemu_conf.c 2010-04-01 20:31:43.000000000 +0400
@@ -1383,7 +1383,8 @@

static int qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
char *buf,
- int buflen)
+ int buflen,
+ char *suf)
{
switch (dev->type) {
case VIR_DOMAIN_CHR_TYPE_NULL:
@@ -1448,13 +1449,21 @@
return -1;
}
break;
-
+//m1
case VIR_DOMAIN_CHR_TYPE_UNIX:
+ if (strlen(suf)>0) {
+ if (snprintf(buf, buflen, "mon:unix:%s%s%s",
+ dev->data.nix.path,
+ suf,
+ dev->data.nix.listen ? ",server,nowait" : "") >= buflen)
+ return -1;
+ } else {
if (snprintf(buf, buflen, "unix:%s%s",
dev->data.nix.path,
dev->data.nix.listen ? ",server,nowait" : "") >= buflen)
return -1;
- break;
+ }
+ break;
}

return 0;
@@ -1746,12 +1755,18 @@

if (monitor_chr) {
char buf[4096];
-
- if (qemudBuildCommandLineChrDevStr(monitor_chr, buf, sizeof(buf)) < 0)
+//m2
+ if (qemudBuildCommandLineChrDevStr(monitor_chr, buf, sizeof(buf), "") < 0)
goto error;

ADD_ARG_LIT("-monitor");
ADD_ARG_LIT(buf);
+
+ if (qemudBuildCommandLineChrDevStr(monitor_chr, buf, sizeof(buf), ".free") < 0)
+ goto error;
+
+ ADD_ARG_LIT("-serial");
+ ADD_ARG_LIT(buf);
}

if (def->localtime)
@@ -2034,7 +2049,7 @@
char buf[4096];
virDomainChrDefPtr serial = def->serials[i];

- if (qemudBuildCommandLineChrDevStr(serial, buf, sizeof(buf)) < 0)
+ if (qemudBuildCommandLineChrDevStr(serial, buf, sizeof(buf), "") < 0)
goto error;

ADD_ARG_LIT("-serial");
@@ -2050,7 +2065,7 @@
char buf[4096];
virDomainChrDefPtr parallel = def->parallels[i];

- if (qemudBuildCommandLineChrDevStr(parallel, buf, sizeof(buf)) < 0)
+ if (qemudBuildCommandLineChrDevStr(parallel, buf, sizeof(buf), "") < 0)
goto error;

ADD_ARG_LIT("-parallel");

Довольно криво но сделал как смог))

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

а вот патч для вирш чтобы

а вот патч для вирш чтобы показывал номер vnc дисплея

*** a/tools/virsh.c Tue Oct 13 18:17:07 2009
--- b/tools/virsh.c Tue Dec 8 20:48:07 2009
***************
*** 622,627 ****
--- 622,634 ----
char **names = NULL;
int maxname = 0;
inactive |= all;
+ //DIMA
+ xmlDocPtr xml = NULL;
+ xmlXPathObjectPtr obj = NULL;
+ xmlXPathContextPtr ctxt = NULL;
+ int ret = FALSE;
+ int port = 0;
+ char *doc;

if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
return FALSE;
***************
*** 664,671 ****
qsort(&names[0], maxname, sizeof(char*), namesorter);
}
}
! vshPrintExtra(ctl, "%3s %-20s %s\n", _("Id"), _("Name"), _("State"));
! vshPrintExtra(ctl, "----------------------------------\n");

for (i = 0; i < maxid; i++) {
virDomainInfo info;
--- 671,678 ----
qsort(&names[0], maxname, sizeof(char*), namesorter);
}
}
! vshPrintExtra(ctl, "%3s %-20s %-10s %s\n", _("Id"), _("Name"), _("State"), _("Display"));
! vshPrintExtra(ctl, "-------------------------------------------\n");

for (i = 0; i < maxid; i++) {
virDomainInfo info;
***************
*** 681,691 ****
else
state = N_(vshDomainStateToString(info.state));

! vshPrint(ctl, "%3d %-20s %s\n",
virDomainGetID(dom),
virDomainGetName(dom),
! state);
virDomainFree(dom);
}
for (i = 0; i < maxname; i++) {
virDomainInfo info;
--- 688,730 ----
else
state = N_(vshDomainStateToString(info.state));

! //DIMA
! port=-1;
! doc = virDomainGetXMLDesc(dom, 0);
! //vshPrint(ctl, "\n%s\n",doc);
!
! if (!doc)
! goto print;
!
! xml = xmlReadDoc((const xmlChar *) doc, "domain.xml", NULL,
! XML_PARSE_NOENT | XML_PARSE_NONET |
! XML_PARSE_NOWARNING);
! free(doc);
! if (!xml)
! goto print;
!
! ctxt = xmlXPathNewContext(xml);
! if (!ctxt)
! goto print;
!
! obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt);
! if ((obj == NULL) || (obj->type != XPATH_STRING) ||
! (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
! goto print;
! }
!
! if (virStrToLong_i((const char *)obj->stringval, NULL, 10, &port) || port < 0)
! port=-1;
!
! xmlXPathFreeObject(obj);
!
! print:
! vshPrint(ctl, "%3d %-20s %-10s :%d\n",
virDomainGetID(dom),
virDomainGetName(dom),
! state,port-5900);
virDomainFree(dom);
+ //DIMA
}
for (i = 0; i < maxname; i++) {
virDomainInfo info;

Да, надо было оформить как процедуру, а не копировать код, но получилось только так и вроде работает))

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

чтобы открыть монитор

чтобы открыть монитор нажимает Ctrl+A потом С

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

Я извиняюсь, если вмешиваюсь

Я извиняюсь, если вмешиваюсь не в свое дело, но может вместо того, чтобы патч писать, легче было бы пропарсить.

Есть функция vncdisplay (вы наверняка о ней знали). Можно написать к примеру такой небольшой скриптик:

$cat ./virsh_list
#!/bin/sh                                                                                                                             
                                                                                                                                      
echo "Id Name Status VNC"                                                                                                             
echo "---------------------"                                                                                                          
virsh list | grep -vE '^----| Id |^$'| while read id name stat ;                                                                      
do                                                                                                                                    
    echo "$id $name $stat `virsh vncdisplay $id`"                                                                                     
done

спасибо, завтра обязательно

спасибо, завтра обязательно попробую..
кстати, а никто не пробовал ovirt под гентой запустить?

кстати, а никто не пробовал

кстати, а никто не пробовал ovirt под гентой запустить?

Я пробовал :)

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

и как оно? все работает?

и как оно? все работает?

akamit написал(а): и как оно?

akamit написал(а):
и как оно? все работает?

Вы видели ебилды freeipa? а 389 ? а что говорит про них их автор ?
Нет freeipa, нету и oVirt.

П.С пока не работает - и врядли в данной ситуации заработает :(

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Это лучше на Fedora Core

Это лучше на Fedora Core попробывать. Там все легко ставится и отлично работает и даже можно скачать livecd для managed node.

..................................................................
Unix - дружественная система, но своих друзей она хорошо выбирает.

dmitryilyin2 написал(а): Это

dmitryilyin2 написал(а):
Это лучше на Fedora Core попробывать. Там все легко ставится и отлично работает и даже можно скачать livecd для managed node.

Ты всерьез думаешь, что мы тут этого не знали ? :)

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".