2007-02-14 01:40:09 +00:00
|
|
|
/*
|
2009-05-21 14:16:55 +00:00
|
|
|
* qemu_conf.h: QEMU configuration management
|
2007-02-14 01:40:09 +00:00
|
|
|
*
|
2009-01-30 17:15:39 +00:00
|
|
|
* Copyright (C) 2006, 2007, 2009 Red Hat, Inc.
|
2007-02-14 01:40:09 +00:00
|
|
|
* Copyright (C) 2006 Daniel P. Berrange
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
|
|
*/
|
|
|
|
|
2007-02-14 15:41:03 +00:00
|
|
|
#ifndef __QEMUD_CONF_H
|
|
|
|
#define __QEMUD_CONF_H
|
2007-02-14 01:40:09 +00:00
|
|
|
|
2008-01-29 18:15:54 +00:00
|
|
|
#include <config.h>
|
2007-11-26 11:50:16 +00:00
|
|
|
|
2007-06-27 00:12:29 +00:00
|
|
|
#include "internal.h"
|
2008-07-11 19:34:11 +00:00
|
|
|
#include "bridge.h"
|
2008-02-27 04:35:08 +00:00
|
|
|
#include "capabilities.h"
|
2008-07-11 17:33:45 +00:00
|
|
|
#include "network_conf.h"
|
2008-07-11 19:34:11 +00:00
|
|
|
#include "domain_conf.h"
|
2008-11-04 23:33:57 +00:00
|
|
|
#include "domain_event.h"
|
2009-01-15 19:56:05 +00:00
|
|
|
#include "threads.h"
|
2009-03-03 12:03:44 +00:00
|
|
|
#include "security.h"
|
2009-07-09 13:10:59 +00:00
|
|
|
#include "cgroup.h"
|
2009-08-17 14:05:23 +00:00
|
|
|
#include "pci.h"
|
2007-06-26 23:48:46 +00:00
|
|
|
|
|
|
|
#define qemudDebug(fmt, ...) do {} while(0)
|
2007-06-26 22:42:47 +00:00
|
|
|
|
2008-05-22 16:27:20 +00:00
|
|
|
#define QEMUD_CPUMASK_LEN CPU_SETSIZE
|
2007-06-26 23:48:46 +00:00
|
|
|
|
2007-06-26 22:13:21 +00:00
|
|
|
/* Internal flags to keep track of qemu command line capabilities */
|
|
|
|
enum qemud_cmd_flags {
|
2009-01-29 17:27:54 +00:00
|
|
|
QEMUD_CMD_FLAG_KQEMU = (1 << 0), /* Whether KQEMU is compiled in */
|
|
|
|
QEMUD_CMD_FLAG_VNC_COLON = (1 << 1), /* Does the VNC take just port, or address + display */
|
|
|
|
QEMUD_CMD_FLAG_NO_REBOOT = (1 << 2), /* Is the -no-reboot flag available */
|
|
|
|
QEMUD_CMD_FLAG_DRIVE = (1 << 3), /* Is the new -drive arg available */
|
|
|
|
QEMUD_CMD_FLAG_DRIVE_BOOT = (1 << 4), /* Does -drive support boot=on */
|
|
|
|
QEMUD_CMD_FLAG_NAME = (1 << 5), /* Is the -name flag available */
|
|
|
|
QEMUD_CMD_FLAG_UUID = (1 << 6), /* Is the -uuid flag available */
|
|
|
|
QEMUD_CMD_FLAG_DOMID = (1 << 7), /* Xenner only, special -domid flag available */
|
|
|
|
QEMUD_CMD_FLAG_VNET_HDR = (1 << 8),
|
|
|
|
QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO = (1 << 9), /* Original migration code from KVM. Also had tcp, but we can't use that
|
|
|
|
* since it had a design bug blocking the entire monitor console */
|
|
|
|
QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP = (1 << 10), /* New migration syntax after merge to QEMU with TCP transport */
|
|
|
|
QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC = (1 << 11), /* New migration syntax after merge to QEMU with EXEC transport */
|
2009-01-30 17:15:39 +00:00
|
|
|
QEMUD_CMD_FLAG_DRIVE_CACHE_V2 = (1 << 12), /* Is the cache= flag wanting new v2 values */
|
2009-03-20 11:20:26 +00:00
|
|
|
QEMUD_CMD_FLAG_KVM = (1 << 13), /* Whether KVM is compiled in */
|
2009-06-16 15:17:10 +00:00
|
|
|
QEMUD_CMD_FLAG_DRIVE_FORMAT = (1 << 14), /* Is -drive format= avail */
|
2009-07-06 13:59:19 +00:00
|
|
|
QEMUD_CMD_FLAG_VGA = (1 << 15), /* Is -vga avail */
|
2009-07-17 21:08:33 +00:00
|
|
|
|
|
|
|
/* features added in qemu-0.10.0 */
|
|
|
|
QEMUD_CMD_FLAG_0_10 = (1 << 16),
|
|
|
|
QEMUD_CMD_FLAG_NET_NAME = QEMUD_CMD_FLAG_0_10, /* -net ...,name=str */
|
|
|
|
QEMUD_CMD_FLAG_HOST_NET_ADD = QEMUD_CMD_FLAG_0_10, /* host_net_add monitor command */
|
2009-08-14 07:31:11 +00:00
|
|
|
|
|
|
|
QEMUD_CMD_FLAG_PCIDEVICE = (1 << 17), /* PCI device assignment only supported by qemu-kvm */
|
Support configuration of huge pages in guests
Add option to domain XML for
<memoryBacking>
<hugepages/>
</memoryBacking>
* configure.in: Add check for mntent.h
* qemud/libvirtd_qemu.aug, qemud/test_libvirtd_qemu.aug, src/qemu.conf
Add 'hugetlbfs_mount' config parameter
* src/qemu_conf.c, src/qemu_conf.h: Check for -mem-path flag in QEMU,
and pass it when hugepages are requested.
Load hugetlbfs_mount config parameter, search for mount if not given.
* src/qemu_driver.c: Free hugetlbfs_mount/path parameter in driver shutdown.
Create directory for QEMU hugepage usage, chowning if required.
* docs/formatdomain.html.in: Document memoryBacking/hugepages elements
* docs/schemas/domain.rng: Add memoryBacking/hugepages elements to schema
* src/util.c, src/util.h, src/libvirt_private.syms: Add virFileFindMountPoint
helper API
* tests/qemuhelptest.c: Add -mem-path constants
* tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c: Add tests for hugepage
handling
* tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml,
tests/qemuxml2argvdata/qemuxml2argv-hugepages.args: Data files for
hugepage tests
2009-08-25 14:05:18 +00:00
|
|
|
QEMUD_CMD_FLAG_MEM_PATH = (1 << 18), /* mmap'ped guest backing supported */
|
2009-08-14 11:22:01 +00:00
|
|
|
QEMUD_CMD_FLAG_DRIVE_SERIAL = (1 << 19), /* -driver serial= available */
|
2007-06-26 22:13:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Main driver state */
|
|
|
|
struct qemud_driver {
|
2009-01-15 19:56:05 +00:00
|
|
|
virMutex lock;
|
2008-12-04 21:06:41 +00:00
|
|
|
|
2009-06-12 13:20:13 +00:00
|
|
|
int privileged;
|
|
|
|
|
2009-07-15 21:25:01 +00:00
|
|
|
uid_t user;
|
|
|
|
gid_t group;
|
|
|
|
|
2008-08-29 07:11:15 +00:00
|
|
|
unsigned int qemuVersion;
|
2007-06-26 22:13:21 +00:00
|
|
|
int nextvmid;
|
2008-07-11 17:33:45 +00:00
|
|
|
|
2009-07-09 13:10:59 +00:00
|
|
|
virCgroupPtr cgroup;
|
2009-07-22 15:08:04 +00:00
|
|
|
int cgroupControllers;
|
|
|
|
char **cgroupDeviceACL;
|
|
|
|
|
2008-10-10 14:20:37 +00:00
|
|
|
virDomainObjList domains;
|
2008-07-11 17:33:45 +00:00
|
|
|
|
2007-06-26 22:13:21 +00:00
|
|
|
brControl *brctl;
|
|
|
|
char *configDir;
|
|
|
|
char *autostartDir;
|
2008-07-11 19:34:11 +00:00
|
|
|
char *logDir;
|
2008-12-18 15:22:49 +00:00
|
|
|
char *stateDir;
|
2007-11-15 10:56:24 +00:00
|
|
|
unsigned int vncTLS : 1;
|
|
|
|
unsigned int vncTLSx509verify : 1;
|
2009-03-16 13:54:26 +00:00
|
|
|
unsigned int vncSASL : 1;
|
2007-10-12 16:05:44 +00:00
|
|
|
char *vncTLSx509certdir;
|
2008-07-11 19:34:11 +00:00
|
|
|
char *vncListen;
|
2009-01-29 17:50:00 +00:00
|
|
|
char *vncPassword;
|
2009-03-16 13:54:26 +00:00
|
|
|
char *vncSASLdir;
|
Support configuration of huge pages in guests
Add option to domain XML for
<memoryBacking>
<hugepages/>
</memoryBacking>
* configure.in: Add check for mntent.h
* qemud/libvirtd_qemu.aug, qemud/test_libvirtd_qemu.aug, src/qemu.conf
Add 'hugetlbfs_mount' config parameter
* src/qemu_conf.c, src/qemu_conf.h: Check for -mem-path flag in QEMU,
and pass it when hugepages are requested.
Load hugetlbfs_mount config parameter, search for mount if not given.
* src/qemu_driver.c: Free hugetlbfs_mount/path parameter in driver shutdown.
Create directory for QEMU hugepage usage, chowning if required.
* docs/formatdomain.html.in: Document memoryBacking/hugepages elements
* docs/schemas/domain.rng: Add memoryBacking/hugepages elements to schema
* src/util.c, src/util.h, src/libvirt_private.syms: Add virFileFindMountPoint
helper API
* tests/qemuhelptest.c: Add -mem-path constants
* tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c: Add tests for hugepage
handling
* tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml,
tests/qemuxml2argvdata/qemuxml2argv-hugepages.args: Data files for
hugepage tests
2009-08-25 14:05:18 +00:00
|
|
|
char *hugetlbfs_mount;
|
|
|
|
char *hugepage_path;
|
2008-02-27 04:35:08 +00:00
|
|
|
|
|
|
|
virCapsPtr caps;
|
2008-10-23 13:18:18 +00:00
|
|
|
|
|
|
|
/* An array of callbacks */
|
|
|
|
virDomainEventCallbackListPtr domainEventCallbacks;
|
2008-12-04 21:09:20 +00:00
|
|
|
virDomainEventQueuePtr domainEventQueue;
|
|
|
|
int domainEventTimer;
|
|
|
|
int domainEventDispatching;
|
2009-03-03 12:03:44 +00:00
|
|
|
|
|
|
|
char *securityDriverName;
|
|
|
|
virSecurityDriverPtr securityDriver;
|
Compressed save image format for Qemu.
Implement a compressed save image format for qemu. While ideally
we would have the choice between compressed/non-compressed
available to the libvirt API, unfortunately there is no "flags"
parameter to the virDomainSave() API. Therefore, implement this
as a qemu.conf option. gzip, bzip2, and lzma are implemented, and
it should be very easy to implement additional compression
methods.
One open question is if/how we should detect the compression
binaries. One way to do it is to do compile-time setting of the
paths (via configure.in), but that doesn't seem like a great thing
to do. My preferred solution is not to detect at all;
when we go to run the commands that need them, if they
aren't available, or aren't available in one of the standard paths,
then we'll fail. That's also the solution implemented in this patch.
In the future, we'll have a more robust (managed) save/restore API,
at which time we can expose this functionality properly in the API.
V2: get rid of redundant dd command and just use >> to append data.
V3: Add back the missing pieces for the enum and bumping the save version.
V4: Make the compressed field in the save_header an int.
Implement LZMA compression.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2009-08-07 11:34:05 +00:00
|
|
|
|
|
|
|
char *saveImageFormat;
|
2009-08-17 14:05:23 +00:00
|
|
|
|
|
|
|
pciDeviceList *activePciHostdevs;
|
2007-06-26 22:13:21 +00:00
|
|
|
};
|
|
|
|
|
2008-12-20 13:09:45 +00:00
|
|
|
|
2008-11-14 08:42:47 +00:00
|
|
|
/* Port numbers used for KVM migration. */
|
|
|
|
#define QEMUD_MIGRATION_FIRST_PORT 49152
|
|
|
|
#define QEMUD_MIGRATION_NUM_PORTS 64
|
2007-06-26 22:13:21 +00:00
|
|
|
|
2009-05-21 14:14:01 +00:00
|
|
|
/* Config type for XML import/export conversions */
|
|
|
|
#define QEMU_CONFIG_FORMAT_ARGV "qemu-argv"
|
|
|
|
|
2008-10-09 15:38:31 +00:00
|
|
|
#define qemudReportError(conn, dom, net, code, fmt...) \
|
2008-11-04 22:30:33 +00:00
|
|
|
virReportErrorHelper(conn, VIR_FROM_QEMU, code, __FILE__, \
|
2008-10-09 15:38:31 +00:00
|
|
|
__FUNCTION__, __LINE__, fmt)
|
2007-06-26 22:13:21 +00:00
|
|
|
|
|
|
|
|
2007-10-12 16:05:44 +00:00
|
|
|
int qemudLoadDriverConfig(struct qemud_driver *driver,
|
|
|
|
const char *filename);
|
2007-06-26 22:13:21 +00:00
|
|
|
|
2009-07-24 11:34:20 +00:00
|
|
|
virCapsPtr qemudCapsInit (virCapsPtr old_caps);
|
2008-02-27 04:35:08 +00:00
|
|
|
|
2007-07-12 15:09:01 +00:00
|
|
|
int qemudExtractVersion (virConnectPtr conn,
|
|
|
|
struct qemud_driver *driver);
|
2008-07-11 19:34:11 +00:00
|
|
|
int qemudExtractVersionInfo (const char *qemu,
|
2008-08-29 07:11:15 +00:00
|
|
|
unsigned int *version,
|
|
|
|
unsigned int *flags);
|
2007-10-27 01:18:38 +00:00
|
|
|
|
2009-06-11 14:17:42 +00:00
|
|
|
int qemudParseHelpStr (const char *str,
|
|
|
|
unsigned int *flags,
|
|
|
|
unsigned int *version,
|
|
|
|
unsigned int *is_kvm,
|
|
|
|
unsigned int *kvm_version);
|
|
|
|
|
2008-07-11 19:34:11 +00:00
|
|
|
int qemudBuildCommandLine (virConnectPtr conn,
|
2007-07-12 15:09:01 +00:00
|
|
|
struct qemud_driver *driver,
|
2009-04-19 14:50:01 +00:00
|
|
|
virDomainDefPtr def,
|
2009-07-09 17:06:38 +00:00
|
|
|
virDomainChrDefPtr monitor_chr,
|
2008-08-29 07:11:15 +00:00
|
|
|
unsigned int qemuCmdFlags,
|
2008-10-10 16:52:20 +00:00
|
|
|
const char ***retargv,
|
|
|
|
const char ***retenv,
|
2008-07-11 19:34:11 +00:00
|
|
|
int **tapfds,
|
|
|
|
int *ntapfds,
|
|
|
|
const char *migrateFrom);
|
2007-02-23 08:48:02 +00:00
|
|
|
|
2009-07-17 21:08:34 +00:00
|
|
|
int qemuBuildHostNetStr (virConnectPtr conn,
|
|
|
|
virDomainNetDefPtr net,
|
|
|
|
const char *prefix,
|
|
|
|
char type_sep,
|
|
|
|
int vlan,
|
2009-07-22 19:17:14 +00:00
|
|
|
const char *tapfd,
|
2009-07-17 21:08:34 +00:00
|
|
|
char **str);
|
|
|
|
|
|
|
|
int qemuBuildNicStr (virConnectPtr conn,
|
|
|
|
virDomainNetDefPtr net,
|
|
|
|
const char *prefix,
|
|
|
|
char type_sep,
|
|
|
|
int vlan,
|
|
|
|
char **str);
|
|
|
|
|
2009-07-22 19:17:13 +00:00
|
|
|
int qemudNetworkIfaceConnect (virConnectPtr conn,
|
|
|
|
struct qemud_driver *driver,
|
|
|
|
virDomainNetDefPtr net,
|
|
|
|
int qemuCmdFlags);
|
|
|
|
|
2009-07-17 21:08:34 +00:00
|
|
|
int qemuAssignNetNames (virDomainDefPtr def,
|
|
|
|
virDomainNetDefPtr net);
|
|
|
|
|
2009-07-23 17:31:34 +00:00
|
|
|
int qemudProbeMachineTypes (const char *binary,
|
|
|
|
virCapsGuestMachinePtr **machines,
|
|
|
|
int *nmachines);
|
|
|
|
|
2009-05-21 14:16:55 +00:00
|
|
|
virDomainDefPtr qemuParseCommandLine(virConnectPtr conn,
|
2009-05-28 13:21:19 +00:00
|
|
|
virCapsPtr caps,
|
2009-05-21 14:16:55 +00:00
|
|
|
const char **progenv,
|
|
|
|
const char **progargv);
|
|
|
|
virDomainDefPtr qemuParseCommandLineString(virConnectPtr conn,
|
2009-05-28 13:21:19 +00:00
|
|
|
virCapsPtr caps,
|
2009-05-21 14:16:55 +00:00
|
|
|
const char *args);
|
|
|
|
|
2007-11-26 11:50:16 +00:00
|
|
|
#endif /* __QEMUD_CONF_H */
|