mirror of https://gitee.com/openkylin/libvirt.git
Detect QEMU flags per VM instead of once for driver as a whole
This commit is contained in:
parent
b32f429849
commit
136ebc6e3c
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,11 @@
|
|||
Fri Sep 21 17:14:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* src/qemu_conf.c, src/qemu_conf.h: Detect QEMU flags per-VM,
|
||||
not per driver, since different QEMU binaries have their own
|
||||
requirements.
|
||||
* tests/qemuxml2xmltest.c, tests/qemuxml2argvtets.c: Update
|
||||
to changed internal QEMU api/structs.
|
||||
|
||||
Fri Sep 21 16:22:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* src/remote_internal.c: Add a no_tty flag to stop SSH prompting
|
||||
|
@ -6,11 +14,11 @@ Fri Sep 21 16:22:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
|||
|
||||
Fri Sep 21 15:06:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* acinclude.m4: Check all compiler flags link successfully
|
||||
* acinclude.m4: Check all compiler flags link successfully
|
||||
instead of just compiling, to deal with broken debian linker
|
||||
with stack protector
|
||||
* configure.in: Remove redundant -fno-stack-protector workaround
|
||||
|
||||
|
||||
Fri Sep 21 15:06:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* src/qemu_driver.c: Use libxml for parsing & checking URIs
|
||||
|
|
|
@ -287,7 +287,6 @@ static const char *qemudDefaultBinaryForArch(const char *arch) {
|
|||
|
||||
/* Find the fully qualified path to the binary for an architecture */
|
||||
static char *qemudLocateBinaryForArch(virConnectPtr conn,
|
||||
struct qemud_driver *driver ATTRIBUTE_UNUSED,
|
||||
int virtType, const char *arch) {
|
||||
const char *name;
|
||||
char *path;
|
||||
|
@ -408,14 +407,15 @@ static int qemudExtractVersionInfo(const char *qemu, int *version, int *flags) {
|
|||
}
|
||||
|
||||
int qemudExtractVersion(virConnectPtr conn,
|
||||
struct qemud_driver *driver) {
|
||||
struct qemud_driver *driver ATTRIBUTE_UNUSED) {
|
||||
char *binary = NULL;
|
||||
struct stat sb;
|
||||
int ignored;
|
||||
|
||||
if (driver->qemuVersion > 0)
|
||||
return 0;
|
||||
|
||||
if (!(binary = qemudLocateBinaryForArch(conn, driver, QEMUD_VIRT_QEMU, "i686")))
|
||||
if (!(binary = qemudLocateBinaryForArch(conn, QEMUD_VIRT_QEMU, "i686")))
|
||||
return -1;
|
||||
|
||||
if (stat(binary, &sb) < 0) {
|
||||
|
@ -426,7 +426,7 @@ int qemudExtractVersion(virConnectPtr conn,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (qemudExtractVersionInfo(binary, &driver->qemuVersion, &driver->qemuCmdFlags) < 0) {
|
||||
if (qemudExtractVersionInfo(binary, &driver->qemuVersion, &ignored) < 0) {
|
||||
free(binary);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1199,7 +1199,7 @@ static struct qemud_vm_def *qemudParseXML(virConnectPtr conn,
|
|||
obj = xmlXPathEval(BAD_CAST "string(/domain/devices/emulator[1])", ctxt);
|
||||
if ((obj == NULL) || (obj->type != XPATH_STRING) ||
|
||||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) {
|
||||
char *tmp = qemudLocateBinaryForArch(conn, driver, def->virtType, def->os.arch);
|
||||
char *tmp = qemudLocateBinaryForArch(conn, def->virtType, def->os.arch);
|
||||
if (!tmp) {
|
||||
goto error;
|
||||
}
|
||||
|
@ -1466,8 +1466,23 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||
struct utsname ut;
|
||||
int disableKQEMU = 0;
|
||||
|
||||
if (qemudExtractVersion(conn, driver) < 0)
|
||||
/* Make sure the binary we are about to try exec'ing exists.
|
||||
* Technically we could catch the exec() failure, but that's
|
||||
* in a sub-process so its hard to feed back a useful error
|
||||
*/
|
||||
if (stat(vm->def->os.binary, &sb) < 0) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"Cannot find QEMU binary %s: %s", vm->def->os.binary,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vm->qemuVersion == 0) {
|
||||
if (qemudExtractVersionInfo(vm->def->os.binary,
|
||||
&(vm->qemuVersion),
|
||||
&(vm->qemuCmdFlags)) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
uname(&ut);
|
||||
|
||||
|
@ -1483,22 +1498,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||
* 2. Guest is 'qemu'
|
||||
* 3. The qemu binary has the -no-kqemu flag
|
||||
*/
|
||||
if ((driver->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) &&
|
||||
if ((vm->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) &&
|
||||
!strcmp(ut.machine, vm->def->os.arch) &&
|
||||
vm->def->virtType == QEMUD_VIRT_QEMU)
|
||||
disableKQEMU = 1;
|
||||
|
||||
/* Make sure the binary we are about to try exec'ing exists.
|
||||
* Technically we could catch the exec() failure, but that's
|
||||
* in a sub-process so its hard to feed back a useful error
|
||||
*/
|
||||
if (stat(vm->def->os.binary, &sb) < 0) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"Cannot find QEMU binary %s: %s", vm->def->os.binary,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
len = 1 + /* qemu */
|
||||
2 + /* machine type */
|
||||
disableKQEMU + /* Disable kqemu */
|
||||
|
@ -1511,7 +1515,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||
2 + /* boot device */
|
||||
2 + /* monitor */
|
||||
(vm->def->localtime ? 1 : 0) + /* localtime */
|
||||
(driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
(vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
vm->def->noReboot ? 1 : 0) + /* no-reboot */
|
||||
(vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */
|
||||
(vm->def->os.kernel[0] ? 2 : 0) + /* kernel */
|
||||
|
@ -1567,7 +1571,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||
goto no_memory;
|
||||
}
|
||||
|
||||
if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
vm->def->noReboot) {
|
||||
if (!((*argv)[++n] = strdup("-no-reboot")))
|
||||
goto no_memory;
|
||||
|
@ -1748,7 +1752,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||
if (vm->def->graphicsType == QEMUD_GRAPHICS_VNC) {
|
||||
char vncdisplay[BR_INET_ADDR_MAXLEN+20];
|
||||
int ret;
|
||||
if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON)
|
||||
if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON)
|
||||
ret = snprintf(vncdisplay, sizeof(vncdisplay), "%s:%d",
|
||||
vm->def->vncListen,
|
||||
vm->def->vncActivePort - 5900);
|
||||
|
@ -1885,7 +1889,9 @@ qemudAssignVMDef(virConnectPtr conn,
|
|||
qemudFreeVMDef(vm->newDef);
|
||||
vm->newDef = def;
|
||||
}
|
||||
|
||||
/* Reset version, because the emulator path might have changed */
|
||||
vm->qemuVersion = 0;
|
||||
vm->qemuCmdFlags = 0;
|
||||
return vm;
|
||||
}
|
||||
|
||||
|
|
|
@ -211,6 +211,9 @@ struct qemud_vm {
|
|||
int *tapfds;
|
||||
int ntapfds;
|
||||
|
||||
int qemuVersion;
|
||||
int qemuCmdFlags; /* values from enum qemud_cmd_flags */
|
||||
|
||||
char configFile[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
char migrateFrom[PATH_MAX];
|
||||
|
@ -272,7 +275,6 @@ struct qemud_network {
|
|||
/* Main driver state */
|
||||
struct qemud_driver {
|
||||
int qemuVersion;
|
||||
int qemuCmdFlags; /* values from enum qemud_cmd_flags */
|
||||
int nactivevms;
|
||||
int ninactivevms;
|
||||
struct qemud_vm *vms;
|
||||
|
|
|
@ -37,6 +37,10 @@ static int testCompareXMLToArgvFiles(const char *xml, const char *cmd) {
|
|||
vm.def = vmdef;
|
||||
vm.pid = -1;
|
||||
vm.id = -1;
|
||||
vm.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1;
|
||||
vm.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON |
|
||||
QEMUD_CMD_FLAG_NO_REBOOT;
|
||||
|
||||
vmdef->vncActivePort = vmdef->vncPort;
|
||||
|
||||
if (qemudBuildCommandLine(NULL, &driver, &vm, &argv) < 0)
|
||||
|
@ -107,10 +111,6 @@ main(int argc, char **argv)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
driver.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1;
|
||||
driver.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON |
|
||||
QEMUD_CMD_FLAG_NO_REBOOT;
|
||||
|
||||
if (virtTestRun("QEMU XML-2-ARGV minimal",
|
||||
1, testCompareXMLToArgvHelper, "minimal") < 0)
|
||||
ret = -1;
|
||||
|
|
|
@ -31,6 +31,10 @@ static int testCompareXMLToXMLFiles(const char *xml) {
|
|||
vm.def = vmdef;
|
||||
vm.pid = -1;
|
||||
vm.id = -1;
|
||||
vm.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1;
|
||||
vm.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON |
|
||||
QEMUD_CMD_FLAG_NO_REBOOT;
|
||||
|
||||
vmdef->vncActivePort = vmdef->vncPort;
|
||||
|
||||
if (!(actual = qemudGenerateXML(NULL, &driver, &vm, vmdef, 0)))
|
||||
|
@ -72,10 +76,6 @@ main(int argc, char **argv)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
driver.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1;
|
||||
driver.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON |
|
||||
QEMUD_CMD_FLAG_NO_REBOOT;
|
||||
|
||||
if (virtTestRun("QEMU XML-2-ARGV minimal",
|
||||
1, testCompareXMLToXMLHelper, "minimal") < 0)
|
||||
ret = -1;
|
||||
|
|
Loading…
Reference in New Issue