Skip to content

Commit f44c0ab

Browse files
authored
fix(vmconfig): invalid vmconfig sometimes causes the virtual machine fail to start (#88)
This PR remove the `mc.KrunKitBin && mc.VFKitBin && mc.GVProxyBin`, change to dynamically calculated when needed.
1 parent 7720dce commit f44c0ab

File tree

6 files changed

+72
-33
lines changed

6 files changed

+72
-33
lines changed

cmd/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func loggerSetup(outType string, f string) {
105105
return
106106
}
107107

108-
fd, err := os.OpenFile(logFile.GetPath(), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
108+
fd, err := os.OpenFile(logFile.GetPath(), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) //nolint:mnd
109109
if err != nil && !errors.Is(err, os.ErrNotExist) {
110110
logrus.Warnf("failed to open log file: %q", err)
111111
return

pkg/machine/gvproxy/gvproxy.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"fmt"
99
"os"
1010
"os/exec"
11-
"path/filepath"
1211
"syscall"
1312
"time"
1413

@@ -29,16 +28,11 @@ func Start(ctx context.Context, mc *vmconfig.MachineConfig) error {
2928
logrus.Warnf("kill old gvproxy from pid process failed: %v", err)
3029
}
3130

32-
execPath, err := os.Executable()
31+
gvpBin, err := mc.GetGVProxyBin()
3332
if err != nil {
34-
return fmt.Errorf("unable to get executable path: %w", err)
33+
return fmt.Errorf("unable to get gvproxy binary path: %w", err)
3534
}
36-
execPath, err = filepath.EvalSymlinks(execPath)
37-
if err != nil {
38-
return fmt.Errorf("unable to eval symlinks: %w", err)
39-
}
40-
41-
gvpBin := filepath.Join(filepath.Dir(filepath.Dir(execPath)), define.Libexec, define.GvProxyBinaryName)
35+
4236
gvpCmd := gvproxyTypes.NewGvproxyCommand()
4337
gvpCmd.SSHPort = mc.SSH.Port
4438
// gvproxy listen a local socks file as Podman API socks (PodmanSocks.InHost)

pkg/machine/krunkit/stubber.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,19 @@ func startKrunKit(ctx context.Context, mc *vmconfig.MachineConfig) error {
8484
return fmt.Errorf("failed to create dynamic machine configure: %w", err)
8585
}
8686

87-
cmd, err := vmc.Cmd(mc.KrunKitBin)
87+
krunkitBin, err := mc.GetKrunkitBin()
88+
if err != nil {
89+
return fmt.Errorf("failed to get krunkit binary: %w", err)
90+
}
91+
92+
cmd, err := vmc.Cmd(krunkitBin)
8893
if err != nil {
8994
return fmt.Errorf("failed to create krunkit command: %w", err)
9095
}
9196

9297
cmd.Args = append(cmd.Args, "--krun-log-level", "3")
9398

94-
cmd = exec.CommandContext(ctx, mc.KrunKitBin, cmd.Args[1:]...)
99+
cmd = exec.CommandContext(ctx, krunkitBin, cmd.Args[1:]...)
95100

96101
logrus.Infof("full cmdline: %q", cmd.Args)
97102

pkg/machine/machine_common.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"context"
88
"fmt"
99
"os"
10-
"path/filepath"
1110
"time"
1211

1312
"bauklotze/pkg/decompress"
@@ -82,19 +81,6 @@ func InitializeVM(opts *vmconfig.VMOpts) (*vmconfig.MachineConfig, error) {
8281
return nil, fmt.Errorf("failed to get ssh port: %w", err)
8382
}
8483

85-
execPath, err := os.Executable()
86-
if err != nil {
87-
return nil, fmt.Errorf("unable to get executable path: %w", err)
88-
}
89-
execPath, err = filepath.EvalSymlinks(execPath)
90-
if err != nil {
91-
return nil, fmt.Errorf("unable to eval symlinks: %w", err)
92-
}
93-
94-
mc.KrunKitBin = filepath.Join(filepath.Dir(filepath.Dir(execPath)), define.Libexec, define.KrunkitBinaryName)
95-
mc.VFKitBin = filepath.Join(filepath.Dir(filepath.Dir(execPath)), define.Libexec, define.VfkitBinaryName)
96-
mc.GVProxyBin = filepath.Join(filepath.Dir(filepath.Dir(execPath)), define.Libexec, define.GvProxyBinaryName)
97-
9884
if err := mc.MakeDirs(); err != nil {
9985
return nil, fmt.Errorf("make work space err: %w", err)
10086
}
@@ -178,7 +164,7 @@ func CreateDynamicConfigure(mc *vmconfig.MachineConfig) (*vfConfig.VirtualMachin
178164
}
179165

180166
// SyncTimeOnWake start Sleep Notifier and dispatch tasks
181-
func SyncTimeOnWake(ctx context.Context, mc *vmconfig.MachineConfig) error {
167+
func SyncTimeOnWake(ctx context.Context, mc *vmconfig.MachineConfig) error { //nolint: staticcheck
182168
notifierCh := notifier.GetInstance().Start()
183169
for {
184170
select {

pkg/machine/vfkit/stubber.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,19 @@ func startVFkit(ctx context.Context, mc *vmconfig.MachineConfig) error {
8383
return fmt.Errorf("failed to create dynamic machine configure: %w", err)
8484
}
8585

86-
cmd, err := vmc.Cmd(mc.VFKitBin)
86+
vfkitBin, err := mc.GetVfkitBin()
87+
if err != nil {
88+
return fmt.Errorf("failed to get vfkit binary: %w", err)
89+
}
90+
cmd, err := vmc.Cmd(vfkitBin)
8791
if err != nil {
8892
return fmt.Errorf("failed to create krunkit command: %w", err)
8993
}
9094

9195
cmd.Args = append(cmd.Args, "--log-level", "info")
9296
cmd.Args = append(cmd.Args, "--device", "virtio-serial,stdio")
9397

94-
cmd = exec.CommandContext(ctx, mc.VFKitBin, cmd.Args[1:]...)
98+
cmd = exec.CommandContext(ctx, vfkitBin, cmd.Args[1:]...)
9599

96100
logrus.Infof("full cmdline: %q", cmd.Args)
97101

pkg/machine/vmconfig/vmconfig.go

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os"
1212
"os/exec"
1313
"path/filepath"
14+
"sync"
1415

1516
"bauklotze/pkg/machine/define"
1617
"bauklotze/pkg/machine/fs"
@@ -29,7 +30,9 @@ type VMState struct {
2930
}
3031

3132
var (
32-
Workspace string
33+
Workspace string
34+
binDir string
35+
binDirLocker sync.Mutex
3336
)
3437

3538
type VMProvider interface { //nolint:interfacebloat
@@ -131,9 +134,6 @@ type MachineConfig struct {
131134
// RestAPISocks is the socks for rest api, it is used by appliance to connect to query the status of vm
132135
// exec cmdline in vm etc...
133136
RestAPISocks string `json:"restAPISocks" validate:"required"`
134-
KrunKitBin string `json:"krunKitBin" validate:"required"`
135-
VFKitBin string `json:"vfKitBin" validate:"required"`
136-
GVProxyBin string `json:"gvProxyBin" validate:"required"`
137137
}
138138

139139
type SSHAuthSocks struct {
@@ -267,3 +267,53 @@ func (mc *MachineConfig) Write() error {
267267
}
268268
return ioutils.AtomicWriteFile(mc.ConfigFile, b, define.DefaultFilePerm) //nolint:wrapcheck
269269
}
270+
271+
// GetLocationDir return the installation dir of ovm
272+
func (mc *MachineConfig) getBinDir() (string, error) {
273+
binDirLocker.Lock()
274+
defer binDirLocker.Unlock()
275+
276+
if binDir != "" {
277+
return binDir, nil
278+
}
279+
280+
execPath, err := os.Executable()
281+
if err != nil {
282+
return "", fmt.Errorf("unable to get executable path: %w", err)
283+
}
284+
285+
execPath, err = filepath.EvalSymlinks(execPath)
286+
if err != nil {
287+
return "", fmt.Errorf("unable to eval symlinks: %w", err)
288+
}
289+
binDir = filepath.Dir(filepath.Dir(execPath))
290+
291+
return binDir, nil
292+
}
293+
294+
func (mc *MachineConfig) GetKrunkitBin() (string, error) {
295+
dir, err := mc.getBinDir()
296+
if err != nil {
297+
return "", fmt.Errorf("get bin dir err: %w", err)
298+
}
299+
300+
return filepath.Join(dir, define.Libexec, define.KrunkitBinaryName), nil
301+
}
302+
303+
func (mc *MachineConfig) GetVfkitBin() (string, error) {
304+
dir, err := mc.getBinDir()
305+
if err != nil {
306+
return "", fmt.Errorf("get bin dir err: %w", err)
307+
}
308+
309+
return filepath.Join(dir, define.Libexec, define.VfkitBinaryName), nil
310+
}
311+
312+
func (mc *MachineConfig) GetGVProxyBin() (string, error) {
313+
dir, err := mc.getBinDir()
314+
if err != nil {
315+
return "", fmt.Errorf("get bin dir err: %w", err)
316+
}
317+
318+
return filepath.Join(dir, define.Libexec, define.GvProxyBinaryName), nil
319+
}

0 commit comments

Comments
 (0)