From b08324a354cd186a7beafedb4e6c5eb671c7bf94 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Wed, 10 Jul 2024 13:37:30 -0500 Subject: [PATCH 1/3] Support running x86 QEMU on arm64 --- pkg/drivers/qemu/qemu.go | 14 ++++++++++---- pkg/minikube/registry/drvs/qemu2/qemu2.go | 4 ++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/drivers/qemu/qemu.go b/pkg/drivers/qemu/qemu.go index 5d1569a4aa6a..84dd24593e88 100644 --- a/pkg/drivers/qemu/qemu.go +++ b/pkg/drivers/qemu/qemu.go @@ -42,6 +42,7 @@ import ( "k8s.io/klog/v2" pkgdrivers "k8s.io/minikube/pkg/drivers" + "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/firewall" "k8s.io/minikube/pkg/minikube/out" @@ -412,14 +413,19 @@ func (d *Driver) Start() error { } // hardware acceleration is important, it increases performance by 10x - if runtime.GOOS == "darwin" { + var accel string + if detect.IsAmd64M1Emulation() { + accel = "tcg" + } else if runtime.GOOS == "darwin" { // On macOS, enable the Hypervisor framework accelerator. - startCmd = append(startCmd, - "-accel", "hvf") + accel = "hvf" } else if _, err := os.Stat("/dev/kvm"); err == nil && runtime.GOOS == "linux" { // On Linux, enable the Kernel Virtual Machine accelerator. + accel = "kvm" + } + if accel != "" { startCmd = append(startCmd, - "-accel", "kvm") + "-accel", accel) } startCmd = append(startCmd, diff --git a/pkg/minikube/registry/drvs/qemu2/qemu2.go b/pkg/minikube/registry/drvs/qemu2/qemu2.go index 0e4fa2f8d4c4..4b848694abcc 100644 --- a/pkg/minikube/registry/drvs/qemu2/qemu2.go +++ b/pkg/minikube/registry/drvs/qemu2/qemu2.go @@ -31,6 +31,7 @@ import ( "k8s.io/minikube/pkg/drivers/qemu" "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/download" "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/localpath" @@ -76,6 +77,9 @@ func qemuFirmwarePath(customPath string) (string, error) { if runtime.GOOS == "windows" { return "C:\\Program Files\\qemu\\share\\edk2-x86_64-code.fd", nil } + if detect.IsAmd64M1Emulation() { + return "/opt/homebrew/opt/qemu/share/qemu/edk2-x86_64-code.fd", nil + } arch := runtime.GOARCH // For macOS, find the correct brew installation path for qemu firmware if runtime.GOOS == "darwin" { From 3f865e4da7a29ad564c6abeecaab553a9d5a1c05 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Mon, 15 Jul 2024 15:53:55 -0500 Subject: [PATCH 2/3] QEMU: refactor selecting hardware selection into func --- pkg/drivers/qemu/qemu.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/pkg/drivers/qemu/qemu.go b/pkg/drivers/qemu/qemu.go index 84dd24593e88..96d28ae5e317 100644 --- a/pkg/drivers/qemu/qemu.go +++ b/pkg/drivers/qemu/qemu.go @@ -413,16 +413,7 @@ func (d *Driver) Start() error { } // hardware acceleration is important, it increases performance by 10x - var accel string - if detect.IsAmd64M1Emulation() { - accel = "tcg" - } else if runtime.GOOS == "darwin" { - // On macOS, enable the Hypervisor framework accelerator. - accel = "hvf" - } else if _, err := os.Stat("/dev/kvm"); err == nil && runtime.GOOS == "linux" { - // On Linux, enable the Kernel Virtual Machine accelerator. - accel = "kvm" - } + accel := hardwareAcceleration() if accel != "" { startCmd = append(startCmd, "-accel", accel) @@ -552,6 +543,21 @@ func (d *Driver) Start() error { return WaitForTCPWithDelay(fmt.Sprintf("%s:%d", d.IPAddress, d.SSHPort), time.Second) } +func hardwareAcceleration() string { + if detect.IsAmd64M1Emulation() { + return "tcg" + } + if runtime.GOOS == "darwin" { + // On macOS, enable the Hypervisor framework accelerator. + return "hvf" + } + if _, err := os.Stat("/dev/kvm"); err == nil && runtime.GOOS == "linux" { + // On Linux, enable the Kernel Virtual Machine accelerator. + return "kvm" + } + return "" +} + func isBootpdError(err error) bool { if runtime.GOOS != "darwin" { return false From 250786e3d78a02b9b5829017be504a497f87ce75 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 16 Jul 2024 18:53:26 -0500 Subject: [PATCH 3/3] log what hardware acceleration value is used --- pkg/drivers/qemu/qemu.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/drivers/qemu/qemu.go b/pkg/drivers/qemu/qemu.go index 96d28ae5e317..018974d07f6e 100644 --- a/pkg/drivers/qemu/qemu.go +++ b/pkg/drivers/qemu/qemu.go @@ -415,6 +415,7 @@ func (d *Driver) Start() error { // hardware acceleration is important, it increases performance by 10x accel := hardwareAcceleration() if accel != "" { + klog.Infof("Using %s for hardware acceleration", accel) startCmd = append(startCmd, "-accel", accel) }