From 8efc8ec984b64357f786344f168342af9b851a7e Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Mon, 6 Oct 2014 01:09:45 +0400 Subject: [PATCH] add ability to set cache mode for disk Signed-off-by: Vasiliy Tolstov --- builder/qemu/builder.go | 18 ++++++++++++++++++ builder/qemu/step_run.go | 7 ++++--- .../source/docs/builders/qemu.html.markdown | 4 ++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/builder/qemu/builder.go b/builder/qemu/builder.go index 971613dd8..997cbff86 100644 --- a/builder/qemu/builder.go +++ b/builder/qemu/builder.go @@ -56,6 +56,14 @@ var diskInterface = map[string]bool{ "virtio": true, } +var diskCache = map[string]bool{ + "writethrough": true, + "writeback": true, + "none": true, + "unsafe": true, + "directsync": true, +} + type Builder struct { config config runner multistep.Runner @@ -68,6 +76,7 @@ type config struct { BootCommand []string `mapstructure:"boot_command"` DiskInterface string `mapstructure:"disk_interface"` DiskSize uint `mapstructure:"disk_size"` + DiskCache string `mapstructure:"disk_cache` FloppyFiles []string `mapstructure:"floppy_files"` Format string `mapstructure:"format"` Headless bool `mapstructure:"headless"` @@ -126,6 +135,10 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.config.DiskSize = 40000 } + if b.config.DiskCache == "" { + b.config.DiskCache = "writeback" + } + if b.config.Accelerator == "" { b.config.Accelerator = "kvm" } @@ -280,6 +293,11 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { errs, errors.New("unrecognized disk interface type")) } + if _, ok := diskCache[b.config.DiskCache]; !ok { + errs = packer.MultiErrorAppend( + errs, errors.New("unrecognized disk cache type")) + } + if b.config.HTTPPortMin > b.config.HTTPPortMax { errs = packer.MultiErrorAppend( errs, errors.New("http_port_min must be less than http_port_max")) diff --git a/builder/qemu/step_run.go b/builder/qemu/step_run.go index 6d4b43d6e..533cbe0c5 100644 --- a/builder/qemu/step_run.go +++ b/builder/qemu/step_run.go @@ -2,11 +2,12 @@ package qemu import ( "fmt" - "github.com/mitchellh/multistep" - "github.com/mitchellh/packer/packer" "log" "path/filepath" "strings" + + "github.com/mitchellh/multistep" + "github.com/mitchellh/packer/packer" ) // stepRun runs the virtual machine @@ -80,7 +81,7 @@ func getCommandArgs(bootDrive string, state multistep.StateBag) ([]string, error 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) + defaultArgs["-drive"] = fmt.Sprintf("file=%s,if=%s,cache=%s", imgPath, config.DiskInterface, config.DiskCache) defaultArgs["-cdrom"] = isoPath defaultArgs["-boot"] = bootDrive defaultArgs["-m"] = "512M" diff --git a/website/source/docs/builders/qemu.html.markdown b/website/source/docs/builders/qemu.html.markdown index f7f4314f2..d1feac384 100644 --- a/website/source/docs/builders/qemu.html.markdown +++ b/website/source/docs/builders/qemu.html.markdown @@ -117,6 +117,10 @@ each category, the available options are alphabetized and described. commands or kickstart type scripts must have proper adjustments for resulting device names. The Qemu builder uses "virtio" by default. +* `disk_cache` (string) - The cache mode to use for disk. Allowed values + values include any of "writethrough", "writeback", "none", "unsafe" or + "directsync". + * `floppy_files` (array of strings) - A list of files to place onto a floppy disk that is attached when the VM is booted. This is most useful for unattended Windows installs, which look for an `Autounattend.xml` file