diff --git a/builder/virtualbox/common/step_attach_guest_additions.go b/builder/virtualbox/common/step_attach_guest_additions.go index d5698c372..dc3e2a0eb 100644 --- a/builder/virtualbox/common/step_attach_guest_additions.go +++ b/builder/virtualbox/common/step_attach_guest_additions.go @@ -21,8 +21,9 @@ import ( // // Produces: type StepAttachGuestAdditions struct { - attachedPath string - GuestAdditionsMode string + attachedPath string + GuestAdditionsMode string + GuestAdditionsInterface string } func (s *StepAttachGuestAdditions) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { @@ -40,12 +41,22 @@ func (s *StepAttachGuestAdditions) Run(_ context.Context, state multistep.StateB guestAdditionsPath := state.Get("guest_additions_path").(string) // Attach the guest additions to the computer + + controllerName := "IDE Controller" + port := "1" + device := "0" + if s.GuestAdditionsInterface == "sata" { + controllerName = "SATA Controller" + port = "2" + device = "0" + } + log.Println("Attaching guest additions ISO onto IDE controller...") command := []string{ "storageattach", vmName, - "--storagectl", "IDE Controller", - "--port", "1", - "--device", "0", + "--storagectl", controllerName, + "--port", port, + "--device", device, "--type", "dvddrive", "--medium", guestAdditionsPath, } @@ -71,11 +82,20 @@ func (s *StepAttachGuestAdditions) Cleanup(state multistep.StateBag) { driver := state.Get("driver").(Driver) vmName := state.Get("vmName").(string) + controllerName := "IDE Controller" + port := "1" + device := "0" + if s.GuestAdditionsInterface == "sata" { + controllerName = "SATA Controller" + port = "2" + device = "0" + } + command := []string{ "storageattach", vmName, - "--storagectl", "IDE Controller", - "--port", "1", - "--device", "0", + "--storagectl", controllerName, + "--port", port, + "--device", device, "--medium", "none", } diff --git a/builder/virtualbox/common/step_remove_devices.go b/builder/virtualbox/common/step_remove_devices.go index 461705763..d50afb398 100644 --- a/builder/virtualbox/common/step_remove_devices.go +++ b/builder/virtualbox/common/step_remove_devices.go @@ -20,7 +20,8 @@ import ( // // Produces: type StepRemoveDevices struct { - Bundling VBoxBundleConfig + Bundling VBoxBundleConfig + GuestAdditionsInterface string } func (s *StepRemoveDevices) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { @@ -100,11 +101,19 @@ func (s *StepRemoveDevices) Run(_ context.Context, state multistep.StateBag) mul if _, ok := state.GetOk("guest_additions_attached"); ok { ui.Message("Removing guest additions drive...") + controllerName := "IDE Controller" + port := "1" + device := "0" + if s.GuestAdditionsInterface == "sata" { + controllerName = "SATA Controller" + port = "2" + device = "0" + } command := []string{ "storageattach", vmName, - "--storagectl", "IDE Controller", - "--port", "1", - "--device", "0", + "--storagectl", controllerName, + "--port", port, + "--device", device, "--medium", "none", } if err := driver.VBoxManage(command...); err != nil { diff --git a/builder/virtualbox/iso/builder.go b/builder/virtualbox/iso/builder.go index 55aa602a9..dce65c4df 100644 --- a/builder/virtualbox/iso/builder.go +++ b/builder/virtualbox/iso/builder.go @@ -41,20 +41,21 @@ type Config struct { vboxcommon.VBoxVersionConfig `mapstructure:",squash"` vboxcommon.VBoxBundleConfig `mapstructure:",squash"` - DiskSize uint `mapstructure:"disk_size"` - GuestAdditionsMode string `mapstructure:"guest_additions_mode"` - GuestAdditionsPath string `mapstructure:"guest_additions_path"` - GuestAdditionsSHA256 string `mapstructure:"guest_additions_sha256"` - GuestAdditionsURL string `mapstructure:"guest_additions_url"` - GuestOSType string `mapstructure:"guest_os_type"` - HardDriveDiscard bool `mapstructure:"hard_drive_discard"` - HardDriveInterface string `mapstructure:"hard_drive_interface"` - SATAPortCount int `mapstructure:"sata_port_count"` - HardDriveNonrotational bool `mapstructure:"hard_drive_nonrotational"` - ISOInterface string `mapstructure:"iso_interface"` - KeepRegistered bool `mapstructure:"keep_registered"` - SkipExport bool `mapstructure:"skip_export"` - VMName string `mapstructure:"vm_name"` + DiskSize uint `mapstructure:"disk_size"` + GuestAdditionsMode string `mapstructure:"guest_additions_mode"` + GuestAdditionsPath string `mapstructure:"guest_additions_path"` + GuestAdditionsSHA256 string `mapstructure:"guest_additions_sha256"` + GuestAdditionsURL string `mapstructure:"guest_additions_url"` + GuestAdditionsInterface string `mapstructure:"guest_additions_interface"` + GuestOSType string `mapstructure:"guest_os_type"` + HardDriveDiscard bool `mapstructure:"hard_drive_discard"` + HardDriveInterface string `mapstructure:"hard_drive_interface"` + SATAPortCount int `mapstructure:"sata_port_count"` + HardDriveNonrotational bool `mapstructure:"hard_drive_nonrotational"` + ISOInterface string `mapstructure:"iso_interface"` + KeepRegistered bool `mapstructure:"keep_registered"` + SkipExport bool `mapstructure:"skip_export"` + VMName string `mapstructure:"vm_name"` ctx interpolate.Context } @@ -125,6 +126,10 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.config.ISOInterface = "ide" } + if b.config.GuestAdditionsInterface == "" { + b.config.GuestAdditionsInterface = b.config.ISOInterface + } + if b.config.VMName == "" { b.config.VMName = fmt.Sprintf( "packer-%s-%d", b.config.PackerBuildName, interpolate.InitTime.Unix()) @@ -227,7 +232,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe new(stepCreateDisk), new(stepAttachISO), &vboxcommon.StepAttachGuestAdditions{ - GuestAdditionsMode: b.config.GuestAdditionsMode, + GuestAdditionsMode: b.config.GuestAdditionsMode, + GuestAdditionsInterface: b.config.GuestAdditionsInterface, }, &vboxcommon.StepConfigureVRDP{ VRDPBindAddress: b.config.VRDPBindAddress, @@ -280,7 +286,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe Delay: b.config.PostShutdownDelay, }, &vboxcommon.StepRemoveDevices{ - Bundling: b.config.VBoxBundleConfig, + Bundling: b.config.VBoxBundleConfig, + GuestAdditionsInterface: b.config.GuestAdditionsInterface, }, &vboxcommon.StepVBoxManage{ Commands: b.config.VBoxManagePost,