(2011/12/13 13:02), MATSUDA, Daiki wrote:
(2011/12/12 22:58), Daniel P. Berrange wrote:
> On Mon, Dec 12, 2011 at 10:18:23AM +0900, MATSUDA, Daiki wrote:
>>
>>>> In addition, the QEMU guest agent requires specified socket. Virt IO
>>>> Console, too. But unfortunately libvirt does not support to xml tags
>>>> to give socket name options to QEMU for the QEMU guest agent and
>>>> Virt IO Console.
>>>
>>> Err, yes we do.
>>>
>>> <channel type='unix'>
>>> <source mode='bind'
path='/var/lib/libvirt/qemu/f16x86_64.agent'/>
>>> <target type='virtio' name='org.qemu.guest_agent.0'/>
>>> </channel>
>>
>> Yes, I confirmed that it can create the socket for guest agent and
>> communicate to guest.
>>
>>> Or for the console
>>>
>>> <console type='unix'>
>>> <source mode='bind'
>> path='/var/lib/libvirt/qemu/f16x86_64.console'/>
>>> <target type='virtio'/>
>>> </channel>
>>>
>>> though you really want to use type=pty for consoles, so that
>> 'virsh console'
>>> works correctly.
>>>
>>> Daniel
>>
>> But It is not enough. Because I use the socket for VirtIO console,
>> i.e. gives the option '-device virtconsole,chardev=...,name=foo' for
>> qemu.
>>
>> And I read the source code, but found funny...
>> In src/conf/domain_conf.h, struct _virDomainChrDef is
>> struct _virDomainChrDef {
>> ...
>> union {
>> int port; /* parallel, serial, console */
>> virSocketAddrPtr addr; /* guestfwd */
>> char *name; /* virtio */
>> } target;
>> ...
>> It is written that virtio must use char *name.
>>
>> But in docs/schemas/domaincommon.rng and others, VirtIO Console use
>> only int port.
>>
>> Thoug I do not understand that which should be used, I attaches the
>> patch for using *name.
>
> Neither is really relevant for virtio-console, it just provides one or
> more
> interactive console for admins.
>
> The name is only relevant when coming to create virtio serial channels
> for non-interactive use. eg the<channel> elements.
>
> Daniel
My simple requirement is to give qemu the option such as
-device virtio-serial \
-chardev socket,path=/tmp/foo,server,nowait,id=foo \
-device virtconsole,chardev=foo,name=org.fedoraproject.console.foo
(e.g.
http://fedoraproject.org/wiki/Features/VirtioSerial it has a
little mistake not virtioconsole but virtconsole.)
But current libvirt source code does not accept name=... with
virtconsole. Because 'virtconsole' is only added on
qemuBuildVirtioSerialPortDevStr() in src/qemu/qemu_command.c when
dev->deviceType is VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE and 'name=' is
only added on some function when dev->deviceType is
VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL.
Similarly it is impossible to use <channel> instead of <console> for
virtconsole because deviceType is set as
VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL.
So, if it is possible to take 2 options port and name for <console>
virtio, could you modify from union to struct on struct _vifDomainChrDef
in src/conf/domain_conf.h ?
MATSUDA Daiki
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
I have modified the patch to change from union to struct for struct
_vifDomainChrDef.
At least, port and name can exist togethter.
MATSUDA Daiki
diff -uNrp libvirt-0.9.8.orig/docs/schemas/domaincommon.rng
libvirt-0.9.8/docs/schemas/domaincommon.rng
--- libvirt-0.9.8.orig/docs/schemas/domaincommon.rng 2011-12-08
11:29:49.000000000 +0900
+++ libvirt-0.9.8/docs/schemas/domaincommon.rng 2011-12-15
08:51:27.829971955 +0900
@@ -1814,6 +1814,9 @@
<optional>
<attribute name="port"/>
</optional>
+ <optional>
+ <attribute name="name"/>
+ </optional>
</interleave>
</element>
</define>
diff -uNrp libvirt-0.9.8.orig/src/conf/domain_conf.c
libvirt-0.9.8/src/conf/domain_conf.c
--- libvirt-0.9.8.orig/src/conf/domain_conf.c 2011-12-08
11:29:49.000000000 +0900
+++ libvirt-0.9.8/src/conf/domain_conf.c 2011-12-15 08:51:27.839971932 +0900
@@ -1156,22 +1156,10 @@ void virDomainChrDefFree(virDomainChrDef
if (!def)
return;
- switch (def->deviceType) {
- case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
- switch (def->targetType) {
- case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
- VIR_FREE(def->target.addr);
- break;
-
- case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
- VIR_FREE(def->target.name);
- break;
- }
- break;
-
- default:
- break;
- }
+ if (def->target.addr)
+ VIR_FREE(def->target.addr);
+ if (def->target.name)
+ VIR_FREE(def->target.name);
virDomainChrSourceDefClear(&def->source);
virDomainDeviceInfoClear(&def->info);
@@ -3969,6 +3957,8 @@ virDomainChrDefParseTargetXML(virCapsPtr
break;
default:
+ def->target.name = virXMLPropString(cur, "name");
+
portStr = virXMLPropString(cur, "port");
if (portStr == NULL) {
/* Set to negative value to indicate we should set it later */
@@ -3983,6 +3973,7 @@ virDomainChrDefParseTargetXML(virCapsPtr
goto error;
}
def->target.port = port;
+
break;
}
@@ -10406,10 +10397,14 @@ virDomainChrDefFormat(virBufferPtr buf,
case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
virBufferAsprintf(buf,
- " <target type='%s'
port='%d'/>\n",
+ " <target type='%s'",
virDomainChrTargetTypeToString(def->deviceType,
- def->targetType),
- def->target.port);
+ def->targetType));
+ if (def->target.port != -1)
+ virBufferAsprintf(buf, " port='%d'", def->target.port);
+ if (def->target.name)
+ virBufferAsprintf(buf, " name='%s'", def->target.name);
+ virBufferAsprintf(buf, "/>\n");
break;
default:
diff -uNrp libvirt-0.9.8.orig/src/conf/domain_conf.h
libvirt-0.9.8/src/conf/domain_conf.h
--- libvirt-0.9.8.orig/src/conf/domain_conf.h 2011-12-08
11:29:49.000000000 +0900
+++ libvirt-0.9.8/src/conf/domain_conf.h 2011-12-15 08:51:27.830961800 +0900
@@ -693,10 +693,10 @@ typedef virDomainChrDef *virDomainChrDef
struct _virDomainChrDef {
int deviceType;
int targetType;
- union {
- int port; /* parallel, serial, console */
+ struct {
+ int port; /* parallel, serial, console, virtio console */
virSocketAddrPtr addr; /* guestfwd */
- char *name; /* virtio */
+ char *name; /* virtio, virtio console */
} target;
virDomainChrSourceDef source;
diff -uNrp libvirt-0.9.8.orig/src/qemu/qemu_command.c
libvirt-0.9.8/src/qemu/qemu_command.c
--- libvirt-0.9.8.orig/src/qemu/qemu_command.c 2011-12-02
12:59:50.000000000 +0900
+++ libvirt-0.9.8/src/qemu/qemu_command.c 2011-12-15 08:51:27.832971775
+0900
@@ -3061,8 +3061,7 @@ qemuBuildVirtioSerialPortDevStr(virDomai
qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC))) {
virBufferAsprintf(&buf, ",chardev=char%s,id=%s",
dev->info.alias, dev->info.alias);
- if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
- dev->target.name) {
+ if (dev->target.name) {
virBufferAsprintf(&buf, ",name=%s", dev->target.name);
}
} else {
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.args
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.args
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.args
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.args
2011-12-15 08:51:27.842971912 +0900
@@ -0,0 +1,12 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu
-S -M \
+pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev \
+socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon \
+chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device \
+virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x3 -hda \
+/dev/HostVG/QEMUGuest1 -chardev pty,id=charserial0 \
+-device isa-serial,chardev=charserial0,id=serial0 -chardev
pty,id=charconsole1 \
+-device virtconsole,chardev=charconsole1,id=console1,name=bar1 -chardev \
+pty,id=charconsole2 -device
virtconsole,chardev=charconsole2,id=console2,name=foo2 \
+-chardev pty,id=charconsole3 -device virtconsole,chardev=charconsole3,\
+id=console3,name=bar3 -usb -device virtio-balloon-pci,id=balloon0,\
+bus=pci.0,addr=0x4
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.xml
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.xml
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.xml
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-mix.xml
2011-12-15 08:51:27.842971912 +0900
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219100</memory>
+ <currentMemory>219100</currentMemory>
+ <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <controller type='virtio-serial' index='0'/>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0' name='foo0'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' name='bar1'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' name='foo2' port='2'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' port='3' name='bar3'/>
+ </console>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.args
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.args
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.args
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.args
2011-12-15 08:51:27.834971875 +0900
@@ -0,0 +1,12 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu
-S -M \
+pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev \
+socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon \
+chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device \
+virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x3 -hda \
+/dev/HostVG/QEMUGuest1 -chardev pty,id=charserial0 \
+-device isa-serial,chardev=charserial0,id=serial0 -chardev
pty,id=charconsole1 \
+-device virtconsole,chardev=charconsole1,id=console1,name=bar1 -chardev \
+pty,id=charconsole2 -device
virtconsole,chardev=charconsole2,id=console2,name=foo2 \
+-chardev pty,id=charconsole3 -device virtconsole,chardev=charconsole3,\
+id=console3,name=bar3 -usb -device virtio-balloon-pci,id=balloon0,\
+bus=pci.0,addr=0x4
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.xml
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.xml
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.xml
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many-name.xml
2011-12-15 08:51:27.834971875 +0900
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219100</memory>
+ <currentMemory>219100</currentMemory>
+ <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <controller type='virtio-serial' index='0'/>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' name='foo0'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' name='bar1'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' name='foo2'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio' name='bar3'/>
+ </console>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.args
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.args
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.args
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.args 2011-12-15
08:51:27.841971785 +0900
@@ -0,0 +1,8 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu
-S -M \
+pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev \
+socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon \
+chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device \
+virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x3 -hda \
+/dev/HostVG/QEMUGuest1 -chardev pty,id=charconsole0 -device virtconsole,\
+chardev=charconsole0,id=console0,name=foo -usb -device
virtio-balloon-pci,id=balloon0,\
+bus=pci.0,addr=0x4
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.xml
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.xml
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.xml
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-mix.xml 2011-12-15
08:51:27.841971785 +0900
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219100</memory>
+ <currentMemory>219100</currentMemory>
+ <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <console type='pty'>
+ <target type='virtio' port='0' name='foo'/>
+ </console>
+ </devices>
+</domain>
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.args
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.args
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.args
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.args
2011-12-15 08:51:27.841971785 +0900
@@ -0,0 +1,8 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu
-S -M \
+pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev \
+socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon \
+chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device \
+virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x3 -hda \
+/dev/HostVG/QEMUGuest1 -chardev pty,id=charconsole0 -device virtconsole,\
+chardev=charconsole0,id=console0,name=foo -usb -device
virtio-balloon-pci,id=balloon0,\
+bus=pci.0,addr=0x4
diff -uNrp
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.xml
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.xml
---
libvirt-0.9.8.orig/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.xml
1970-01-01 09:00:00.000000000 +0900
+++
libvirt-0.9.8/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-name.xml 2011-12-15
08:51:27.841971785 +0900
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219100</memory>
+ <currentMemory>219100</currentMemory>
+ <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <console type='pty'>
+ <target type='virtio' name='foo'/>
+ </console>
+ </devices>
+</domain>
diff -uNrp libvirt-0.9.8.orig/tests/qemuxml2argvtest.c
libvirt-0.9.8/tests/qemuxml2argvtest.c
--- libvirt-0.9.8.orig/tests/qemuxml2argvtest.c 2011-12-02
12:59:56.000000000 +0900
+++ libvirt-0.9.8/tests/qemuxml2argvtest.c 2011-12-15 08:51:27.843971916
+0900
@@ -539,6 +539,14 @@ mymain(void)
QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
DO_TEST("console-virtio-many", false,
QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
+ DO_TEST("console-virtio-name", false,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
+ DO_TEST("console-virtio-many-name", false,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
+ DO_TEST("console-virtio-mix", false,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
+ DO_TEST("console-virtio-many-mix", false,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
DO_TEST("channel-spicevmc", false,
QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC);