[libvirt] [PATCH 1/4] qemu: Cleanup boot parameter building
Michal Privoznik
mprivozn at redhat.com
Tue Sep 18 16:45:15 UTC 2012
On 18.09.2012 17:36, Martin Kletzander wrote:
> This patch cleans up building the "-boot" parameter and while on that
> fixes one inconsistency by modifying these things:
>
> - First off, there's the cleanup for all *_LAST enum values to end
> without comma at the end. I chose this way because if it were the
> other way around, the patch would have 2 times more lines.
> - I completed the unfinished virDomainBootMenu enum by specifying
> LAST, declaring it and also declaring the TypeFromString and
> TypeToString parameters.
> - Previously mentioned TypeFromString and TypeToString are used when
> parsing the XML.
> - Last, but not least, visible change is that the "-boot" parameter
> is built and parsed properly:
> - The "order=" prefix is used only when additional parameters are
> used (menu, etc.).
> - It's rewritten in a way that other parameters can be added
> easily in the future (used in following patch).
> - The "order=" parameter is properly parsed regardless to where it
> is placed in the string (e.g. "menu=on,order=nc").
> - The "menu=" parameter (and others in the future) are created
> when they should be (i.e. even when bootindex is supported and
> used, but not when bootloader is selected).
> ---
> src/conf/domain_conf.c | 16 +++-
> src/conf/domain_conf.h | 63 ++++++++-------
> src/libvirt_private.syms | 2 +
> src/qemu/qemu_command.c | 93 ++++++++++++++++------
> ...xml2argv-boot-menu-disable-drive-bootindex.args | 1 +
> 5 files changed, 118 insertions(+), 57 deletions(-)
While it's true *_LAST shouldn't be followed by comma (they are the last
items after all) you should save that for a separate patch as
it is something different than cleaning up '-boot' parameter generation.
ACK if you split this. The cleanup patch doesn't have to be part of this
set anyway.
Michal
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 15b360a..35814fb 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -102,6 +102,11 @@ VIR_ENUM_IMPL(virDomainBoot, VIR_DOMAIN_BOOT_LAST,
> "hd",
> "network")
>
> +VIR_ENUM_IMPL(virDomainBootMenu, VIR_DOMAIN_BOOT_MENU_LAST,
> + "default",
> + "yes",
> + "no")
> +
> VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
> "acpi",
> "apic",
> @@ -8181,10 +8186,15 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
>
> bootstr = virXPathString("string(./os/bootmenu[1]/@enable)", ctxt);
> if (bootstr) {
> - if (STREQ(bootstr, "yes"))
> - def->os.bootmenu = VIR_DOMAIN_BOOT_MENU_ENABLED;
> - else
> + def->os.bootmenu = virDomainBootMenuTypeFromString(bootstr);
> + if (def->os.bootmenu <= 0) {
> + /* In order not to break misconfigured machines, this
> + * should not emit an error, but rather set the bootmenu
> + * to disabled */
> + VIR_WARN("disabling bootmenu due to unknown option '%s'",
> + bootstr);
> def->os.bootmenu = VIR_DOMAIN_BOOT_MENU_DISABLED;
> + }
> VIR_FREE(bootstr);
> }
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index f0dea48..510406a 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -134,7 +134,7 @@ typedef enum {
> VIR_DOMAIN_DEVICE_CHR,
> VIR_DOMAIN_DEVICE_MEMBALLOON,
>
> - VIR_DOMAIN_DEVICE_LAST,
> + VIR_DOMAIN_DEVICE_LAST
> } virDomainDeviceType;
>
> typedef struct _virDomainDeviceDef virDomainDeviceDef;
> @@ -178,7 +178,7 @@ enum virDomainVirtType {
> VIR_DOMAIN_VIRT_PHYP,
> VIR_DOMAIN_VIRT_PARALLELS,
>
> - VIR_DOMAIN_VIRT_LAST,
> + VIR_DOMAIN_VIRT_LAST
> };
>
> enum virDomainDeviceAddressType {
> @@ -289,7 +289,7 @@ enum virDomainSeclabelType {
> VIR_DOMAIN_SECLABEL_DYNAMIC,
> VIR_DOMAIN_SECLABEL_STATIC,
>
> - VIR_DOMAIN_SECLABEL_LAST,
> + VIR_DOMAIN_SECLABEL_LAST
> };
>
> /* Security configuration for domain */
> @@ -353,7 +353,7 @@ enum virDomainHostdevMode {
> VIR_DOMAIN_HOSTDEV_MODE_SUBSYS,
> VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES,
>
> - VIR_DOMAIN_HOSTDEV_MODE_LAST,
> + VIR_DOMAIN_HOSTDEV_MODE_LAST
> };
>
> enum virDomainHostdevSubsysType {
> @@ -736,7 +736,7 @@ enum virDomainNetType {
> VIR_DOMAIN_NET_TYPE_DIRECT,
> VIR_DOMAIN_NET_TYPE_HOSTDEV,
>
> - VIR_DOMAIN_NET_TYPE_LAST,
> + VIR_DOMAIN_NET_TYPE_LAST
> };
>
> /* the backend driver used for virtio interfaces */
> @@ -745,7 +745,7 @@ enum virDomainNetBackendType {
> VIR_DOMAIN_NET_BACKEND_TYPE_QEMU, /* userland */
> VIR_DOMAIN_NET_BACKEND_TYPE_VHOST, /* kernel */
>
> - VIR_DOMAIN_NET_BACKEND_TYPE_LAST,
> + VIR_DOMAIN_NET_BACKEND_TYPE_LAST
> };
>
> /* the TX algorithm used for virtio interfaces */
> @@ -754,7 +754,7 @@ enum virDomainNetVirtioTxModeType {
> VIR_DOMAIN_NET_VIRTIO_TX_MODE_IOTHREAD,
> VIR_DOMAIN_NET_VIRTIO_TX_MODE_TIMER,
>
> - VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
> + VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST
> };
>
> /* link interface states */
> @@ -868,7 +868,7 @@ enum virDomainChrDeviceType {
> VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE,
> VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL,
>
> - VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
> + VIR_DOMAIN_CHR_DEVICE_TYPE_LAST
> };
>
> enum virDomainChrChannelTargetType {
> @@ -876,7 +876,7 @@ enum virDomainChrChannelTargetType {
> VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD,
> VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO,
>
> - VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
> + VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST
> };
>
> enum virDomainChrConsoleTargetType {
> @@ -887,7 +887,7 @@ enum virDomainChrConsoleTargetType {
> VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC,
> VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ,
>
> - VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST,
> + VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST
> };
>
> enum virDomainChrType {
> @@ -903,7 +903,7 @@ enum virDomainChrType {
> VIR_DOMAIN_CHR_TYPE_UNIX,
> VIR_DOMAIN_CHR_TYPE_SPICEVMC,
>
> - VIR_DOMAIN_CHR_TYPE_LAST,
> + VIR_DOMAIN_CHR_TYPE_LAST
> };
>
> enum virDomainChrTcpProtocol {
> @@ -912,7 +912,7 @@ enum virDomainChrTcpProtocol {
> VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNETS, /* secure telnet */
> VIR_DOMAIN_CHR_TCP_PROTOCOL_TLS,
>
> - VIR_DOMAIN_CHR_TCP_PROTOCOL_LAST,
> + VIR_DOMAIN_CHR_TCP_PROTOCOL_LAST
> };
>
> enum virDomainChrSpicevmcName {
> @@ -920,7 +920,7 @@ enum virDomainChrSpicevmcName {
> VIR_DOMAIN_CHR_SPICEVMC_SMARTCARD,
> VIR_DOMAIN_CHR_SPICEVMC_USBREDIR,
>
> - VIR_DOMAIN_CHR_SPICEVMC_LAST,
> + VIR_DOMAIN_CHR_SPICEVMC_LAST
> };
>
> /* The host side information for a character device. */
> @@ -973,7 +973,7 @@ enum virDomainSmartcardType {
> VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES,
> VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH,
>
> - VIR_DOMAIN_SMARTCARD_TYPE_LAST,
> + VIR_DOMAIN_SMARTCARD_TYPE_LAST
> };
>
> # define VIR_DOMAIN_SMARTCARD_NUM_CERTIFICATES 3
> @@ -1002,7 +1002,7 @@ enum virDomainInputType {
> VIR_DOMAIN_INPUT_TYPE_MOUSE,
> VIR_DOMAIN_INPUT_TYPE_TABLET,
>
> - VIR_DOMAIN_INPUT_TYPE_LAST,
> + VIR_DOMAIN_INPUT_TYPE_LAST
> };
>
> enum virDomainInputBus {
> @@ -1110,7 +1110,7 @@ enum virDomainGraphicsType {
> VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,
> VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
>
> - VIR_DOMAIN_GRAPHICS_TYPE_LAST,
> + VIR_DOMAIN_GRAPHICS_TYPE_LAST
> };
>
> enum virDomainGraphicsAuthConnectedType {
> @@ -1220,13 +1220,13 @@ enum virDomainGraphicsListenType {
> VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS,
> VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK,
>
> - VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST,
> + VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST
> };
>
> enum virDomainHubType {
> VIR_DOMAIN_HUB_TYPE_USB,
>
> - VIR_DOMAIN_HUB_TYPE_LAST,
> + VIR_DOMAIN_HUB_TYPE_LAST
> };
>
> typedef struct _virDomainGraphicsListenDef virDomainGraphicsListenDef;
> @@ -1352,13 +1352,15 @@ enum virDomainBootOrder {
> VIR_DOMAIN_BOOT_DISK,
> VIR_DOMAIN_BOOT_NET,
>
> - VIR_DOMAIN_BOOT_LAST,
> + VIR_DOMAIN_BOOT_LAST
> };
>
> enum virDomainBootMenu {
> VIR_DOMAIN_BOOT_MENU_DEFAULT = 0,
> VIR_DOMAIN_BOOT_MENU_ENABLED,
> VIR_DOMAIN_BOOT_MENU_DISABLED,
> +
> + VIR_DOMAIN_BOOT_MENU_LAST
> };
>
> enum virDomainFeature {
> @@ -1377,7 +1379,7 @@ enum virDomainApicEoi {
> VIR_DOMAIN_APIC_EOI_ON,
> VIR_DOMAIN_APIC_EOI_OFF,
>
> - VIR_DOMAIN_APIC_EOI_LAST,
> + VIR_DOMAIN_APIC_EOI_LAST
> };
>
> enum virDomainLifecycleAction {
> @@ -1405,7 +1407,7 @@ enum virDomainPMState {
> VIR_DOMAIN_PM_STATE_ENABLED,
> VIR_DOMAIN_PM_STATE_DISABLED,
>
> - VIR_DOMAIN_PM_STATE_LAST,
> + VIR_DOMAIN_PM_STATE_LAST
> };
>
> enum virDomainBIOSUseserial {
> @@ -1429,6 +1431,7 @@ struct _virDomainOSDef {
> char *machine;
> int nBootDevs;
> int bootDevs[VIR_DOMAIN_BOOT_LAST];
> + /* enum virDomainBootMenu */
> int bootmenu;
> char *init;
> char **initargv;
> @@ -1440,6 +1443,7 @@ struct _virDomainOSDef {
> char *bootloader;
> char *bootloaderArgs;
> int smbios_mode;
> +
> virDomainBIOSDef bios;
> };
>
> @@ -1451,7 +1455,7 @@ enum virDomainTimerNameType {
> VIR_DOMAIN_TIMER_NAME_TSC,
> VIR_DOMAIN_TIMER_NAME_KVMCLOCK,
>
> - VIR_DOMAIN_TIMER_NAME_LAST,
> + VIR_DOMAIN_TIMER_NAME_LAST
> };
>
> enum virDomainTimerTrackType {
> @@ -1459,7 +1463,7 @@ enum virDomainTimerTrackType {
> VIR_DOMAIN_TIMER_TRACK_GUEST,
> VIR_DOMAIN_TIMER_TRACK_WALL,
>
> - VIR_DOMAIN_TIMER_TRACK_LAST,
> + VIR_DOMAIN_TIMER_TRACK_LAST
> };
>
> enum virDomainTimerTickpolicyType {
> @@ -1468,7 +1472,7 @@ enum virDomainTimerTickpolicyType {
> VIR_DOMAIN_TIMER_TICKPOLICY_MERGE,
> VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD,
>
> - VIR_DOMAIN_TIMER_TICKPOLICY_LAST,
> + VIR_DOMAIN_TIMER_TICKPOLICY_LAST
> };
>
> enum virDomainTimerModeType {
> @@ -1478,14 +1482,14 @@ enum virDomainTimerModeType {
> VIR_DOMAIN_TIMER_MODE_PARAVIRT,
> VIR_DOMAIN_TIMER_MODE_SMPSAFE,
>
> - VIR_DOMAIN_TIMER_MODE_LAST,
> + VIR_DOMAIN_TIMER_MODE_LAST
> };
>
> enum virDomainCpuPlacementMode {
> VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC = 0,
> VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO,
>
> - VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST,
> + VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST
> };
>
> enum virDomainNumatuneMemPlacementMode {
> @@ -1493,7 +1497,7 @@ enum virDomainNumatuneMemPlacementMode {
> VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_STATIC,
> VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO,
>
> - VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_LAST,
> + VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_LAST
> };
>
> typedef struct _virDomainTimerCatchupDef virDomainTimerCatchupDef;
> @@ -1527,14 +1531,14 @@ enum virDomainClockOffsetType {
> VIR_DOMAIN_CLOCK_OFFSET_VARIABLE = 2,
> VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE = 3,
>
> - VIR_DOMAIN_CLOCK_OFFSET_LAST,
> + VIR_DOMAIN_CLOCK_OFFSET_LAST
> };
>
> enum virDomainClockBasis {
> VIR_DOMAIN_CLOCK_BASIS_UTC = 0,
> VIR_DOMAIN_CLOCK_BASIS_LOCALTIME = 1,
>
> - VIR_DOMAIN_CLOCK_BASIS_LAST,
> + VIR_DOMAIN_CLOCK_BASIS_LAST
> };
>
> typedef struct _virDomainClockDef virDomainClockDef;
> @@ -2129,6 +2133,7 @@ VIR_ENUM_DECL(virDomainTaint)
>
> VIR_ENUM_DECL(virDomainVirt)
> VIR_ENUM_DECL(virDomainBoot)
> +VIR_ENUM_DECL(virDomainBootMenu)
> VIR_ENUM_DECL(virDomainFeature)
> VIR_ENUM_DECL(virDomainApicEoi)
> VIR_ENUM_DECL(virDomainLifecycle)
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index ec2e544..be49214 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -280,6 +280,8 @@ virDomainApicEoiTypeToString;
> virDomainAssignDef;
> virDomainBlockedReasonTypeFromString;
> virDomainBlockedReasonTypeToString;
> +virDomainBootMenuTypeFromString;
> +virDomainBootMenuTypeToString;
> virDomainChrConsoleTargetTypeFromString;
> virDomainChrConsoleTargetTypeToString;
> virDomainChrDefForeach;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index cbf4aee..f8012ec 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4879,6 +4879,8 @@ qemuBuildCommandLine(virConnectPtr conn,
> }
>
> if (!def->os.bootloader) {
> + int boot_nparams = 0;
> + virBuffer boot_buf = VIR_BUFFER_INITIALIZER;
> /*
> * We prefer using explicit bootindex=N parameters for predictable
> * results even though domain XML doesn't use per device boot elements.
> @@ -4901,7 +4903,6 @@ qemuBuildCommandLine(virConnectPtr conn,
> }
>
> if (!emitBootindex) {
> - virBuffer boot_buf = VIR_BUFFER_INITIALIZER;
> char boot[VIR_DOMAIN_BOOT_LAST+1];
>
> for (i = 0 ; i < def->os.nBootDevs ; i++) {
> @@ -4925,19 +4926,38 @@ qemuBuildCommandLine(virConnectPtr conn,
> }
> boot[def->os.nBootDevs] = '\0';
>
> - virCommandAddArg(cmd, "-boot");
> + virBufferAsprintf(&boot_buf, "%s", boot);
> + boot_nparams++;
> + }
> +
> + if (def->os.bootmenu) {
> + if (qemuCapsGet(caps, QEMU_CAPS_BOOT_MENU)) {
> + if (boot_nparams++)
> + virBufferAddChar(&boot_buf, ',');
>
> - if (qemuCapsGet(caps, QEMU_CAPS_BOOT_MENU) &&
> - def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_DEFAULT) {
> if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_ENABLED)
> - virBufferAsprintf(&boot_buf, "order=%s,menu=on", boot);
> - else if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_DISABLED)
> - virBufferAsprintf(&boot_buf, "order=%s,menu=off", boot);
> + virBufferAsprintf(&boot_buf, "menu=on");
> + else
> + virBufferAsprintf(&boot_buf, "menu=off");
> } else {
> - virBufferAdd(&boot_buf, boot, -1);
> + /* We cannot emit an error when bootmenu is enabled but
> + * unsupported because of backward compatibility */
> + VIR_WARN("bootmenu is enabled but not "
> + "supported by this QEMU binary");
> }
>
> - virCommandAddArgBuffer(cmd, &boot_buf);
> + }
> +
> + if (boot_nparams > 0) {
> + virCommandAddArg(cmd, "-boot");
> +
> + if (boot_nparams < 2 || emitBootindex) {
> + virCommandAddArgBuffer(cmd, &boot_buf);
> + } else {
> + virCommandAddArgFormat(cmd,
> + "order=%s",
> + virBufferContentAndReset(&boot_buf));
> + }
> }
>
> if (def->os.kernel)
> @@ -7861,6 +7881,26 @@ error:
> }
>
>
> +static void
> +qemuParseCommandLineBootDevs(virDomainDefPtr def, const char *str) {
> + int n, b = 0;
> +
> + for (n = 0 ; str[n] && b < VIR_DOMAIN_BOOT_LAST ; n++) {
> + if (str[n] == 'a')
> + def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_FLOPPY;
> + else if (str[n] == 'c')
> + def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_DISK;
> + else if (str[n] == 'd')
> + def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_CDROM;
> + else if (str[n] == 'n')
> + def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_NET;
> + else if (str[n] == ',')
> + break;
> + }
> + def->os.nBootDevs = b;
> +}
> +
> +
> /*
> * Analyse the env and argv settings and reconstruct a
> * virDomainDefPtr representing these settings as closely
> @@ -8218,24 +8258,27 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
> if (!(def->os.cmdline = strdup(val)))
> goto no_memory;
> } else if (STREQ(arg, "-boot")) {
> - int n, b = 0;
> + const char *token = NULL;
> WANT_VALUE();
> - for (n = 0 ; val[n] && b < VIR_DOMAIN_BOOT_LAST ; n++) {
> - if (val[n] == 'a')
> - def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_FLOPPY;
> - else if (val[n] == 'c')
> - def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_DISK;
> - else if (val[n] == 'd')
> - def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_CDROM;
> - else if (val[n] == 'n')
> - def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_NET;
> - else if (val[n] == ',')
> - break;
> - }
> - def->os.nBootDevs = b;
>
> - if (strstr(val, "menu=on"))
> - def->os.bootmenu = 1;
> + if (!strchr(val, ','))
> + qemuParseCommandLineBootDevs(def, val);
> + else {
> + token = val;
> + while (token && *token) {
> + if (STRPREFIX(token, "order=")) {
> + token += strlen("order=");
> + qemuParseCommandLineBootDevs(def, token);
> + } else if (STRPREFIX(token, "menu=on")) {
> + def->os.bootmenu = 1;
> + }
> + token = strchr(token, ',');
> + /* This incrementation has to be done here in order to make it
> + * possible to pass the token pointer properly into the loop */
> + if (token)
> + token++;
> + }
> + }
> } else if (STREQ(arg, "-name")) {
> char *process;
> WANT_VALUE();
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.args b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.args
> index 5074e32..75b6b4c 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.args
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.args
> @@ -7,6 +7,7 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu \
> -nodefaults \
> -monitor unix:/tmp/test-monitor,server,nowait \
> -no-acpi \
> +-boot menu=off \
> -drive file=/dev/cdrom,if=none,media=cdrom,id=drive-ide0-1-0 \
> -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 \
> -usb \
>
More information about the libvir-list
mailing list