qemu: support NBD with Unix sockets

This reuses the XML format that was introduced for Gluster.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Paolo Bonzini 2013-02-25 18:44:24 +01:00 committed by Eric Blake
parent 0aa9f522c4
commit be2a15dd60
7 changed files with 82 additions and 21 deletions

View File

@ -1713,9 +1713,11 @@
<td> only one </td>
</tr>
</table>
In case of gluster, valid values for transport attribute are tcp, rdma
or unix. If nothing is specified, tcp is assumed. If transport is unix,
socket attribute specifies path to unix socket.
gluster supports "tcp", "rdma", "unix" as valid values for the
transport attribute. nbd supports "tcp" and "unix". Others only
support "tcp". If nothing is specified, "tcp" is assumed. If the
transport is "unix", the socket attribute specifies the path to an
AF_UNIX socket.
</dd>
<dt><code>address</code></dt>
<dd>If present, the <code>address</code> element ties the disk

View File

@ -2384,26 +2384,35 @@ qemuParseNBDString(virDomainDiskDefPtr disk)
goto no_memory;
host = disk->src + strlen("nbd:");
port = strchr(host, ':');
if (!port) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot parse nbd filename '%s'"), disk->src);
goto error;
if (STRPREFIX(host, "unix:/")) {
src = strchr(host + strlen("unix:"), ':');
if (src)
*src++ = '\0';
h->transport = VIR_DOMAIN_DISK_PROTO_TRANS_UNIX;
h->socket = strdup(host + strlen("unix:"));
} else {
port = strchr(host, ':');
if (!port) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot parse nbd filename '%s'"), disk->src);
goto error;
}
*port++ = '\0';
h->name = strdup(host);
if (!h->name)
goto no_memory;
src = strchr(port, ':');
if (src)
*src++ = '\0';
h->port = strdup(port);
if (!h->port)
goto no_memory;
}
*port++ = '\0';
h->name = strdup(host);
if (!h->name)
goto no_memory;
src = strchr(port, ':');
if (src)
*src++ = '\0';
h->port = strdup(port);
if (!h->port)
goto no_memory;
if (src && STRPREFIX(src, "exportname=")) {
src = strdup(strchr(src, '=') + 1);
if (!src)
@ -2510,6 +2519,14 @@ qemuBuildNBDString(virDomainDiskDefPtr disk, virBufferPtr opt)
disk->hosts->port ? disk->hosts->port :
QEMU_DEFAULT_NBD_PORT);
break;
case VIR_DOMAIN_DISK_PROTO_TRANS_UNIX:
if (!disk->hosts->socket) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("socket attribute required for unix transport"));
return -1;
}
virBufferEscape(opt, ',', ",", "unix:%s", disk->hosts->socket);
break;
default:
transp = virDomainDiskProtocolTransportTypeToString(disk->hosts->transport);
virReportError(VIR_ERR_INTERNAL_ERROR,

View File

@ -186,6 +186,7 @@ mymain(void)
DO_TEST("disk-drive-cache-unsafe");
DO_TEST("disk-drive-network-nbd");
DO_TEST("disk-drive-network-nbd-export");
DO_TEST("disk-drive-network-nbd-unix");
DO_TEST("disk-drive-network-gluster");
DO_TEST("disk-drive-network-rbd");
DO_TEST("disk-drive-network-rbd-ipv6");

View File

@ -0,0 +1,5 @@
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
-no-acpi -boot c -usb -drive file=/dev/HostVG/QEMUGuest1,if=ide,bus=0,unit=0 \
-drive file=nbd:unix:/var/run/nbdsock:exportname=bar,if=virtio,format=raw \
-net none -serial none -parallel none

View File

@ -0,0 +1,33 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>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' target='0' unit='0'/>
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<source protocol='nbd' name='bar'>
<host transport='unix' socket='/var/run/nbdsock'/>
</source>
<target dev='vda' bus='virtio'/>
</disk>
<controller type='usb' index='0'/>
<controller type='ide' index='0'/>
<memballoon model='virtio'/>
</devices>
</domain>

View File

@ -495,6 +495,8 @@ mymain(void)
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-nbd-export",
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-nbd-unix",
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-gluster",
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-rbd",

View File

@ -171,6 +171,7 @@ mymain(void)
DO_TEST("disk-drive-cache-v1-none");
DO_TEST("disk-drive-network-nbd");
DO_TEST("disk-drive-network-nbd-export");
DO_TEST("disk-drive-network-nbd-unix");
DO_TEST("disk-scsi-device");
DO_TEST("disk-scsi-vscsi");
DO_TEST("disk-scsi-virtio-scsi");