Skip to content

Commit e2aefcb

Browse files
Merge pull request #14182 from sharifelgamal/firmware-path
fix qemu firmware path locations
2 parents c49e799 + c9c8b31 commit e2aefcb

File tree

2 files changed

+53
-26
lines changed

2 files changed

+53
-26
lines changed

pkg/drivers/qemu/qemu.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/docker/machine/libmachine/mcnutils"
3939
"github.com/docker/machine/libmachine/ssh"
4040
"github.com/docker/machine/libmachine/state"
41+
"github.com/pkg/errors"
4142

4243
pkgdrivers "k8s.io/minikube/pkg/drivers"
4344
)
@@ -79,11 +80,9 @@ type Driver struct {
7980
DiskPath string
8081
CacheMode string
8182
IOMode string
82-
// conn *libvirt.Connect
83-
// VM *libvirt.Domain
84-
UserDataFile string
85-
CloudConfigRoot string
86-
LocalPorts string
83+
UserDataFile string
84+
CloudConfigRoot string
85+
LocalPorts string
8786
}
8887

8988
func (d *Driver) GetMachineName() string {
@@ -271,21 +270,25 @@ func parsePortRange(rawPortRange string) (int, int, error) {
271270

272271
portRange := strings.Split(rawPortRange, "-")
273272

273+
if len(portRange) < 2 {
274+
return 0, 0, errors.New("Invalid port range, must be at least of length 2")
275+
}
276+
274277
minPort, err := strconv.Atoi(portRange[0])
275278
if err != nil {
276-
return 0, 0, fmt.Errorf("invalid port range")
279+
return 0, 0, errors.Wrap(err, "Invalid port range")
277280
}
278281
maxPort, err := strconv.Atoi(portRange[1])
279282
if err != nil {
280-
return 0, 0, fmt.Errorf("invalid port range")
283+
return 0, 0, errors.Wrap(err, "Invalid port range")
281284
}
282285

283286
if maxPort < minPort {
284-
return 0, 0, fmt.Errorf("invalid port range")
287+
return 0, 0, errors.New("Invalid port range")
285288
}
286289

287290
if maxPort-minPort < 2 {
288-
return 0, 0, fmt.Errorf("port range must be minimum 2 ports")
291+
return 0, 0, errors.New("Port range must be minimum 2 ports")
289292
}
290293

291294
return minPort, maxPort, nil
@@ -338,10 +341,6 @@ func (d *Driver) Start() error {
338341

339342
if d.MachineType != "" {
340343
machineType := d.MachineType
341-
if runtime.GOOS == "darwin" {
342-
// highmem=off needed, see https://patchwork.kernel.org/project/qemu-devel/patch/[email protected]/#23800615 for details
343-
machineType += ",accel=hvf,highmem=off"
344-
}
345344
startCmd = append(startCmd,
346345
"-M", machineType,
347346
)
@@ -380,6 +379,13 @@ func (d *Driver) Start() error {
380379
}
381380
}
382381

382+
// hardware acceleration is important, it increases performance by 10x
383+
if runtime.GOOS == "darwin" {
384+
startCmd = append(startCmd, "-accel", "hvf")
385+
} else if _, err := os.Stat("/dev/kvm"); err == nil && runtime.GOOS == "linux" {
386+
startCmd = append(startCmd, "-accel", "kvm")
387+
}
388+
383389
startCmd = append(startCmd,
384390
"-m", fmt.Sprintf("%d", d.Memory),
385391
"-smp", fmt.Sprintf("%d", d.CPU),
@@ -419,12 +425,6 @@ func (d *Driver) Start() error {
419425

420426
startCmd = append(startCmd, "-daemonize")
421427

422-
// other options
423-
// "-enable-kvm" if its available
424-
if _, err := os.Stat("/dev/kvm"); err == nil {
425-
startCmd = append(startCmd, "-enable-kvm")
426-
}
427-
428428
if d.CloudConfigRoot != "" {
429429
startCmd = append(startCmd,
430430
"-fsdev",

pkg/minikube/registry/drvs/qemu2/qemu2.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ package qemu2
1818

1919
import (
2020
"fmt"
21+
"io/ioutil"
2122
"os"
2223
"os/exec"
24+
"path"
2325
"path/filepath"
2426
"runtime"
2527

@@ -64,17 +66,35 @@ func qemuSystemProgram() (string, error) {
6466

6567
func qemuFirmwarePath() (string, error) {
6668
arch := runtime.GOARCH
69+
// For macOS, find the correct brew installation path for qemu firmware
70+
if runtime.GOOS == "darwin" {
71+
var p, fw string
72+
switch arch {
73+
case "amd64":
74+
p = "/usr/local/Cellar/qemu"
75+
fw = "share/qemu/edk2-x86_64-code.fd"
76+
case "arm64":
77+
p = "/opt/homebrew/Cellar/qemu"
78+
fw = "share/qemu/edk2-aarch64-code.fd"
79+
default:
80+
return "", fmt.Errorf("unknown arch: %s", arch)
81+
}
82+
83+
v, err := ioutil.ReadDir(p)
84+
if err != nil {
85+
return "", fmt.Errorf("lookup qemu: %v", err)
86+
}
87+
for _, version := range v {
88+
if version.IsDir() {
89+
return path.Join(p, version.Name(), fw), nil
90+
}
91+
}
92+
}
93+
6794
switch arch {
6895
case "amd64":
69-
// on macOS, we assume qemu is installed via homebrew for simplicity
70-
if runtime.GOOS == "darwin" {
71-
return "/usr/local/Cellar/qemu/6.2.0_1/share/qemu/edk2-x86_64-code.fd", nil
72-
}
7396
return "/usr/share/OVMF/OVMF_CODE.fd", nil
7497
case "arm64":
75-
if runtime.GOOS == "darwin" {
76-
return "/opt/homebrew/Cellar/qemu/6.2.0_1/share/qemu/edk2-aarch64-code.fd", nil
77-
}
7898
return "/usr/share/AAVMF/AAVMF_CODE.fd", nil
7999
default:
80100
return "", fmt.Errorf("unknown arch: %s", arch)
@@ -96,6 +116,13 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
96116
case "arm64":
97117
qemuMachine = "virt"
98118
qemuCPU = "cortex-a72"
119+
// highmem=off needed, see https://patchwork.kernel.org/project/qemu-devel/patch/[email protected]/#23800615 for details
120+
if runtime.GOOS == "darwin" {
121+
qemuMachine = "virt,highmem=off"
122+
} else if _, err := os.Stat("/dev/kvm"); err == nil {
123+
qemuMachine = "virt,gic-version=3"
124+
qemuCPU = "host"
125+
}
99126
default:
100127
return nil, fmt.Errorf("unknown arch: %s", runtime.GOARCH)
101128
}

0 commit comments

Comments
 (0)