diff --git a/builder/qemu/builder.go b/builder/qemu/builder.go index 301884ed0..127c1d5ed 100644 --- a/builder/qemu/builder.go +++ b/builder/qemu/builder.go @@ -26,6 +26,7 @@ var netDevice = map[string]bool{ "pcnet": true, "virtio": true, "virtio-net": true, + "virtio-net-pci": true, "usb-net": true, "i82559a": true, "i82559b": true, @@ -255,9 +256,9 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { errs, errors.New("invalid format, only 'qcow2' or 'raw' are allowed")) } - if !(b.config.Accelerator == "kvm" || b.config.Accelerator == "xen") { + if !(b.config.Accelerator == "kvm" || b.config.Accelerator == "xen" || b.config.Accelerator == "none") { errs = packer.MultiErrorAppend( - errs, errors.New("invalid format, only 'kvm' or 'xen' are allowed")) + errs, errors.New("invalid format, only 'kvm' or 'xen' or 'none' are allowed")) } if _, ok := netDevice[b.config.NetDevice]; !ok { diff --git a/builder/qemu/step_run.go b/builder/qemu/step_run.go index 649ba63ee..176697670 100644 --- a/builder/qemu/step_run.go +++ b/builder/qemu/step_run.go @@ -61,23 +61,23 @@ func getCommandArgs(bootDrive string, state multistep.StateBag) ([]string, error sshHostPort := state.Get("sshHostPort").(uint) ui := state.Get("ui").(packer.Ui) - guiArgument := "sdl" vnc := fmt.Sprintf("0.0.0.0:%d", vncPort-5900) vmName := config.VMName imgPath := filepath.Join(config.OutputDir, fmt.Sprintf("%s.%s", vmName, strings.ToLower(config.Format))) + defaultArgs := make(map[string]string) + if config.Headless == true { ui.Message("WARNING: The VM will be started in headless mode, as configured.\n" + "In headless mode, errors during the boot sequence or OS setup\n" + "won't be easily visible. Use at your own discretion.") - guiArgument = "none" + } else { + defaultArgs["-display"] = "sdl" } - defaultArgs := make(map[string]string) defaultArgs["-name"] = vmName - defaultArgs["-machine"] = fmt.Sprintf("type=%s,accel=%s", config.MachineType, config.Accelerator) - defaultArgs["-display"] = guiArgument + defaultArgs["-machine"] = fmt.Sprintf("type=%s", config.MachineType) defaultArgs["-netdev"] = "user,id=user.0" defaultArgs["-device"] = fmt.Sprintf("%s,netdev=user.0", config.NetDevice) defaultArgs["-drive"] = fmt.Sprintf("file=%s,if=%s", imgPath, config.DiskInterface) @@ -87,6 +87,14 @@ func getCommandArgs(bootDrive string, state multistep.StateBag) ([]string, error defaultArgs["-redir"] = fmt.Sprintf("tcp:%v::22", sshHostPort) defaultArgs["-vnc"] = vnc + // Append the accelerator to the machine type if it is specified + if config.Accelerator != "none" { + defaultArgs["-machine"] += fmt.Sprintf(",accel=%s", config.Accelerator) + } else { + ui.Message("WARNING: The VM will be started with no hardware acceleration.\n" + + "The installation may take considerably longer to finish.\n") + } + // Determine if we have a floppy disk to attach if floppyPathRaw, ok := state.GetOk("floppy_path"); ok { defaultArgs["-fda"] = floppyPathRaw.(string) diff --git a/website/source/docs/builders/qemu.html.markdown b/website/source/docs/builders/qemu.html.markdown index c81e77a6c..c9cac0a8a 100644 --- a/website/source/docs/builders/qemu.html.markdown +++ b/website/source/docs/builders/qemu.html.markdown @@ -92,7 +92,7 @@ each category, the available options are alphabetized and described. ### Optional: * `accelerator` (string) - The accelerator type to use when running the VM. - This may have a value of either "kvm" or "xen" and you must have that + This may have a value of either "none", "kvm", or "xen" and you must have that support in on the machine on which you run the builder. * `boot_command` (array of strings) - This is an array of commands to type