From cad4d0ee9f356ea0fe6eeb74705557a50f12c440 Mon Sep 17 00:00:00 2001 From: Brent Baude Date: Wed, 18 Oct 2023 10:40:08 -0500 Subject: [PATCH] Fix path for omvf vars on Darwin/arm64 On darwin arm64, we need to set the location of the ovmf vars. It should be put into the imageDir (also known as as dataDir). But because qemu determines the image path late in Init(), the image path is set something like a stream marker. Fixes #20361 [NO NEW TESTS NEEDED] Signed-off-by: Brent Baude --- pkg/machine/qemu/config.go | 20 +++++++++++++++++--- pkg/machine/qemu/options_darwin_amd64.go | 2 +- pkg/machine/qemu/options_darwin_arm64.go | 10 +++++----- pkg/machine/qemu/options_freebsd_amd64.go | 2 +- pkg/machine/qemu/options_freebsd_arm64.go | 2 +- pkg/machine/qemu/options_linux_amd64.go | 2 +- pkg/machine/qemu/options_linux_arm64.go | 2 +- pkg/machine/qemu/options_windows_amd64.go | 2 +- pkg/machine/qemu/options_windows_arm64.go | 2 +- 9 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pkg/machine/qemu/config.go b/pkg/machine/qemu/config.go index 90ebb057f4..10111b8891 100644 --- a/pkg/machine/qemu/config.go +++ b/pkg/machine/qemu/config.go @@ -20,6 +20,14 @@ type QEMUVirtualization struct { machine.Virtualization } +// setNewMachineCMDOpts are options needed to pass +// into setting up the qemu command line. long term, this need +// should be eliminated +// TODO Podman5 +type setNewMachineCMDOpts struct { + imageDir string +} + // findQEMUBinary locates and returns the QEMU binary func findQEMUBinary() (string, error) { cfg, err := config.Default() @@ -41,8 +49,8 @@ func (v *MachineVM) setQMPMonitorSocket() error { // setNewMachineCMD configure the CLI command that will be run to create the new // machine -func (v *MachineVM) setNewMachineCMD(qemuBinary string) { - v.CmdLine = NewQemuBuilder(qemuBinary, v.addArchOptions()) +func (v *MachineVM) setNewMachineCMD(qemuBinary string, cmdOpts *setNewMachineCMDOpts) { + v.CmdLine = NewQemuBuilder(qemuBinary, v.addArchOptions(cmdOpts)) v.CmdLine.SetMemory(v.Memory) v.CmdLine.SetCPUs(v.CPUs) v.CmdLine.SetIgnitionFile(v.IgnitionFile) @@ -63,6 +71,11 @@ func (p *QEMUVirtualization) NewMachine(opts machine.InitOptions) (machine.VM, e vm.Name = opts.Name } + dataDir, err := machine.GetDataDir(p.VMType()) + if err != nil { + return nil, err + } + // set VM ignition file ignitionFile, err := machine.NewMachineFile(filepath.Join(vmConfigDir, vm.Name+".ign"), nil) if err != nil { @@ -112,7 +125,8 @@ func (p *QEMUVirtualization) NewMachine(opts machine.InitOptions) (machine.VM, e } // configure command to run - vm.setNewMachineCMD(execPath) + cmdOpts := setNewMachineCMDOpts{imageDir: dataDir} + vm.setNewMachineCMD(execPath, &cmdOpts) return vm, nil } diff --git a/pkg/machine/qemu/options_darwin_amd64.go b/pkg/machine/qemu/options_darwin_amd64.go index ff8d10db1c..10db185106 100644 --- a/pkg/machine/qemu/options_darwin_amd64.go +++ b/pkg/machine/qemu/options_darwin_amd64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-x86_64" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { opts := []string{"-machine", "q35,accel=hvf:tcg", "-cpu", "host"} return opts } diff --git a/pkg/machine/qemu/options_darwin_arm64.go b/pkg/machine/qemu/options_darwin_arm64.go index d75237938a..9d064e2b02 100644 --- a/pkg/machine/qemu/options_darwin_arm64.go +++ b/pkg/machine/qemu/options_darwin_arm64.go @@ -12,8 +12,8 @@ var ( QemuCommand = "qemu-system-aarch64" ) -func (v *MachineVM) addArchOptions() []string { - ovmfDir := getOvmfDir(v.ImagePath.GetPath(), v.Name) +func (v *MachineVM) addArchOptions(cmdOpts *setNewMachineCMDOpts) []string { + ovmfDir := getOvmfDir(cmdOpts.imageDir, v.Name) opts := []string{ "-accel", "hvf", "-accel", "tcg", @@ -25,18 +25,18 @@ func (v *MachineVM) addArchOptions() []string { } func (v *MachineVM) prepare() error { - ovmfDir := getOvmfDir(v.ImagePath.GetPath(), v.Name) + ovmfDir := getOvmfDir(filepath.Dir(v.ImagePath.GetPath()), v.Name) cmd := []string{"/bin/dd", "if=/dev/zero", "conv=sync", "bs=1m", "count=64", "of=" + ovmfDir} return exec.Command(cmd[0], cmd[1:]...).Run() } func (v *MachineVM) archRemovalFiles() []string { - ovmDir := getOvmfDir(v.ImagePath.GetPath(), v.Name) + ovmDir := getOvmfDir(filepath.Dir(v.ImagePath.GetPath()), v.Name) return []string{ovmDir} } func getOvmfDir(imagePath, vmName string) string { - return filepath.Join(filepath.Dir(imagePath), vmName+"_ovmf_vars.fd") + return filepath.Join(imagePath, vmName+"_ovmf_vars.fd") } /* diff --git a/pkg/machine/qemu/options_freebsd_amd64.go b/pkg/machine/qemu/options_freebsd_amd64.go index ff8d10db1c..10db185106 100644 --- a/pkg/machine/qemu/options_freebsd_amd64.go +++ b/pkg/machine/qemu/options_freebsd_amd64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-x86_64" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { opts := []string{"-machine", "q35,accel=hvf:tcg", "-cpu", "host"} return opts } diff --git a/pkg/machine/qemu/options_freebsd_arm64.go b/pkg/machine/qemu/options_freebsd_arm64.go index 9a222190c8..e5ab376e9a 100644 --- a/pkg/machine/qemu/options_freebsd_arm64.go +++ b/pkg/machine/qemu/options_freebsd_arm64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-aarch64" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { opts := []string{ "-machine", "virt", "-accel", "tcg", diff --git a/pkg/machine/qemu/options_linux_amd64.go b/pkg/machine/qemu/options_linux_amd64.go index 3edd97ea1e..3dbff14dd4 100644 --- a/pkg/machine/qemu/options_linux_amd64.go +++ b/pkg/machine/qemu/options_linux_amd64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-x86_64" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { opts := []string{ "-accel", "kvm", "-cpu", "host", diff --git a/pkg/machine/qemu/options_linux_arm64.go b/pkg/machine/qemu/options_linux_arm64.go index 9481176531..7d0967f09d 100644 --- a/pkg/machine/qemu/options_linux_arm64.go +++ b/pkg/machine/qemu/options_linux_arm64.go @@ -9,7 +9,7 @@ var ( QemuCommand = "qemu-system-aarch64" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { opts := []string{ "-accel", "kvm", "-cpu", "host", diff --git a/pkg/machine/qemu/options_windows_amd64.go b/pkg/machine/qemu/options_windows_amd64.go index c6ea4afb57..081ee9ccd5 100644 --- a/pkg/machine/qemu/options_windows_amd64.go +++ b/pkg/machine/qemu/options_windows_amd64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-x86_64w" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { // "max" level is used, because "host" is not supported with "whpx" acceleration // "vmx=off" disabled nested virtualization (not needed for podman) // QEMU issue to track nested virtualization: https://gitlab.com/qemu-project/qemu/-/issues/628 diff --git a/pkg/machine/qemu/options_windows_arm64.go b/pkg/machine/qemu/options_windows_arm64.go index 984c7e4015..c3d6596802 100644 --- a/pkg/machine/qemu/options_windows_arm64.go +++ b/pkg/machine/qemu/options_windows_arm64.go @@ -4,7 +4,7 @@ var ( QemuCommand = "qemu-system-aarch64w" ) -func (v *MachineVM) addArchOptions() []string { +func (v *MachineVM) addArchOptions(_ *setNewMachineCMDOpts) []string { // stub to fix compilation issues opts := []string{} return opts