Skip to content

Commit

Permalink
Merge pull request #19228 from spowelljr/amd64QemuOnArm64
Browse files Browse the repository at this point in the history
Support running x86 QEMU on arm64
  • Loading branch information
spowelljr authored Jul 16, 2024
2 parents 4c7fcd0 + 250786e commit bf89c6a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
27 changes: 20 additions & 7 deletions pkg/drivers/qemu/qemu.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -412,14 +413,11 @@ func (d *Driver) Start() error {
}

// hardware acceleration is important, it increases performance by 10x
if runtime.GOOS == "darwin" {
// On macOS, enable the Hypervisor framework accelerator.
startCmd = append(startCmd,
"-accel", "hvf")
} else if _, err := os.Stat("/dev/kvm"); err == nil && runtime.GOOS == "linux" {
// On Linux, enable the Kernel Virtual Machine accelerator.
accel := hardwareAcceleration()
if accel != "" {
klog.Infof("Using %s for hardware acceleration", accel)
startCmd = append(startCmd,
"-accel", "kvm")
"-accel", accel)
}

startCmd = append(startCmd,
Expand Down Expand Up @@ -546,6 +544,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
Expand Down
4 changes: 4 additions & 0 deletions pkg/minikube/registry/drvs/qemu2/qemu2.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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" {
Expand Down

0 comments on commit bf89c6a

Please sign in to comment.