From 0f638f91115d1b69ef40cf0eabcec60b1d886599 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 17 May 2016 16:26:59 +0300 Subject: [PATCH 1/3] builder/qemu: add simple kvm/tcg autodetection Signed-off-by: Vasiliy Tolstov --- builder/qemu/builder.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/builder/qemu/builder.go b/builder/qemu/builder.go index 59490049c..e1c2dc059 100644 --- a/builder/qemu/builder.go +++ b/builder/qemu/builder.go @@ -154,8 +154,16 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { if runtime.GOOS == "windows" { b.config.Accelerator = "tcg" } else { - b.config.Accelerator = "kvm" + if fp, err := os.Open("/dev/kvm"); err != nil { + b.config.Accelerator = "tcg" + } else { + fp.Close() + b.config.Accelerator = "kvm" + } } + log.Printf("use detected accelerator: %s", b.config.Accelerator) + } else { + log.Printf("use specified accelerator: %s", b.config.Accelerator) } if b.config.MachineType == "" { From bff939b373c18c3b871391be4edd8598eb01cb6e Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Thu, 19 May 2016 22:53:53 -0700 Subject: [PATCH 2/3] Added comment on why we need to open /dev/kvm before using it --- builder/qemu/builder.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/builder/qemu/builder.go b/builder/qemu/builder.go index e1c2dc059..2c7418180 100644 --- a/builder/qemu/builder.go +++ b/builder/qemu/builder.go @@ -154,6 +154,10 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { if runtime.GOOS == "windows" { b.config.Accelerator = "tcg" } else { + // /dev/kvm is a kernel module that may be loaded if kvm is + // installed and the host supports VT-x extensions. To make sure + // this will actually work we need to os.Open() it. If os.Open fails + // the kernel module was not installed or loaded correctly. if fp, err := os.Open("/dev/kvm"); err != nil { b.config.Accelerator = "tcg" } else { From 6c1ca3ad49a414565c91415017a773755f01911f Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Thu, 19 May 2016 22:54:08 -0700 Subject: [PATCH 3/3] Updated qemu docs to reflect new behavior --- website/source/docs/builders/qemu.html.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/website/source/docs/builders/qemu.html.md b/website/source/docs/builders/qemu.html.md index 44b34d264..015845551 100644 --- a/website/source/docs/builders/qemu.html.md +++ b/website/source/docs/builders/qemu.html.md @@ -108,9 +108,10 @@ builder. ### Optional: - `accelerator` (string) - The accelerator type to use when running the VM. - This may have a value of either "none", "kvm", "tcg", or "xen" and you must - have that support in on the machine on which you run the builder. By default - "kvm" is used. + This may be `none`, `kvm`, `tcg`, or `xen`. The appropriate software must + already been installed on your build machine to use the accelerator you + specified. When no accelerator is specified, Packer will try to use `kvm` + if it is available but will default to `tcg` otherwise. - `boot_command` (array of strings) - This is an array of commands to type when the virtual machine is first booted. The goal of these commands should