From e7b9b4437ff18270cb91f8197a22d1516f1ee32e Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 26 Jan 2025 15:30:19 +0100 Subject: [PATCH 1/7] Add ports option --- internal/gok/vmrun.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 95253d2..7e47868 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -10,6 +10,7 @@ import ( "path/filepath" "runtime" "strconv" + "strings" "github.com/gokrazy/internal/config" "github.com/gokrazy/internal/instanceflag" @@ -46,6 +47,7 @@ type vmRunConfig struct { sudo string targetStorageBytes int arch string + ports string } var vmRunImpl vmRunConfig @@ -54,6 +56,7 @@ func init() { vmRunCmd.Flags().StringVarP(&vmRunImpl.sudo, "sudo", "", "", "Whether to elevate privileges using sudo when required (one of auto, always, never, default auto)") vmRunCmd.Flags().IntVarP(&vmRunImpl.targetStorageBytes, "target_storage_bytes", "", 1258299392, "Size of the disk image in bytes") vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", runtime.GOARCH, "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") + vmRunCmd.Flags().StringVarP(&vmRunImpl.ports, "ports", "", "", "additional ports to forward to the VM (comma-separated list of host:vm TCP ports)") vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "keep ephemeral disk images around instead of deleting them when QEMU exits") vmRunCmd.Flags().BoolVarP(&vmRunImpl.dry, "dryrun", "", false, "Whether to actually run QEMU or merely print the command") vmRunCmd.Flags().BoolVarP(&vmRunImpl.graphic, "graphic", "", true, "Run QEMU in graphical mode?") @@ -127,11 +130,11 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { } defer os.RemoveAll(tmp) amd64EFI := filepath.Join(tmp, "amd64-OVMF_CODE.fd") - if err := os.WriteFile(amd64EFI, edk.Amd64EFI, 0644); err != nil { + if err := os.WriteFile(amd64EFI, edk.Amd64EFI, 0o644); err != nil { return err } arm64EFI := filepath.Join(tmp, "arm64-QEMU_EFI.fd") - if err := os.WriteFile(arm64EFI, edk.Arm64EFI, 0644); err != nil { + if err := os.WriteFile(arm64EFI, edk.Arm64EFI, 0o644); err != nil { return err } @@ -143,6 +146,15 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { qemuBin = "qemu-system-aarch64" } + ports := "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22" + for _, port := range strings.Split(r.ports, ",") { + p := strings.Split(port, ":") + if len(p) != 2 { + return fmt.Errorf("invalid port forwarding specification: %q", port) + } + ports += ",hostfwd=tcp::" + p[0] + "-:" + p[1] + } + qemu := exec.CommandContext(ctx, qemuBin, "-name", instanceflag.Instance(), "-boot", "order=d", @@ -151,7 +163,7 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { "-watchdog-action", "reset", "-smp", strconv.Itoa(max(runtime.NumCPU(), 2)), "-device", "e1000,netdev=net0", - "-netdev", "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22", + "-netdev", ports, "-m", "1024") // Start in EFI mode (not legacy BIOS) so that we get a frame buffer (for From e9e1cfb5f84f0d0a2a430204b556606ff123d3b1 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 26 Jan 2025 15:35:34 +0100 Subject: [PATCH 2/7] wip --- internal/gok/vmrun.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 7e47868..3b5fcb2 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -147,12 +147,14 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { } ports := "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22" - for _, port := range strings.Split(r.ports, ",") { - p := strings.Split(port, ":") - if len(p) != 2 { - return fmt.Errorf("invalid port forwarding specification: %q", port) + if r.ports != "" { + for _, port := range strings.Split(r.ports, ",") { + p := strings.Split(port, ":") + if len(p) != 2 { + return fmt.Errorf("invalid port forwarding specification: %q", port) + } + ports += ",hostfwd=tcp::" + p[0] + "-:" + p[1] } - ports += ",hostfwd=tcp::" + p[0] + "-:" + p[1] } qemu := exec.CommandContext(ctx, qemuBin, From ca6a7213974f4246d51b00913e015847441bd2bc Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 27 Jan 2025 09:26:20 +0100 Subject: [PATCH 3/7] Use netdev --- internal/gok/vmrun.go | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 3b5fcb2..b0e4583 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -10,7 +10,6 @@ import ( "path/filepath" "runtime" "strconv" - "strings" "github.com/gokrazy/internal/config" "github.com/gokrazy/internal/instanceflag" @@ -47,7 +46,7 @@ type vmRunConfig struct { sudo string targetStorageBytes int arch string - ports string + netdev string } var vmRunImpl vmRunConfig @@ -56,7 +55,7 @@ func init() { vmRunCmd.Flags().StringVarP(&vmRunImpl.sudo, "sudo", "", "", "Whether to elevate privileges using sudo when required (one of auto, always, never, default auto)") vmRunCmd.Flags().IntVarP(&vmRunImpl.targetStorageBytes, "target_storage_bytes", "", 1258299392, "Size of the disk image in bytes") vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", runtime.GOARCH, "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") - vmRunCmd.Flags().StringVarP(&vmRunImpl.ports, "ports", "", "", "additional ports to forward to the VM (comma-separated list of host:vm TCP ports)") + vmRunCmd.Flags().StringVarP(&vmRunImpl.netdev, "netdev", "", "", "additional qemu netdev arguments") vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "keep ephemeral disk images around instead of deleting them when QEMU exits") vmRunCmd.Flags().BoolVarP(&vmRunImpl.dry, "dryrun", "", false, "Whether to actually run QEMU or merely print the command") vmRunCmd.Flags().BoolVarP(&vmRunImpl.graphic, "graphic", "", true, "Run QEMU in graphical mode?") @@ -146,15 +145,9 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { qemuBin = "qemu-system-aarch64" } - ports := "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22" - if r.ports != "" { - for _, port := range strings.Split(r.ports, ",") { - p := strings.Split(port, ":") - if len(p) != 2 { - return fmt.Errorf("invalid port forwarding specification: %q", port) - } - ports += ",hostfwd=tcp::" + p[0] + "-:" + p[1] - } + netdev := "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22" + if r.netdev != "" { + netdev += "," + r.netdev } qemu := exec.CommandContext(ctx, qemuBin, @@ -165,7 +158,7 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { "-watchdog-action", "reset", "-smp", strconv.Itoa(max(runtime.NumCPU(), 2)), "-device", "e1000,netdev=net0", - "-netdev", ports, + "-netdev", netdev, "-m", "1024") // Start in EFI mode (not legacy BIOS) so that we get a frame buffer (for From 2d9cfc4967adb0f93523cb1000ed30e68b082495 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 27 Jan 2025 15:38:19 +0100 Subject: [PATCH 4/7] Update internal/gok/vmrun.go --- internal/gok/vmrun.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 3af4e5a..83aa2ab 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -62,7 +62,7 @@ var vmRunImpl vmRunConfig func init() { vmRunCmd.Flags().StringVarP(&vmRunImpl.sudo, "sudo", "", "", "Whether to elevate privileges using sudo when required (one of auto, always, never, default auto)") vmRunCmd.Flags().IntVarP(&vmRunImpl.targetStorageBytes, "target_storage_bytes", "", 1258299392, "Size of the disk image in bytes") - vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", runtime.GOARCH, "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") + vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", "", "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") vmRunCmd.Flags().StringVarP(&vmRunImpl.netdev, "netdev", "", "", "additional qemu netdev arguments") vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "keep ephemeral disk images around instead of deleting them when QEMU exits") vmRunCmd.Flags().BoolVarP(&vmRunImpl.dry, "dryrun", "", false, "Whether to actually run QEMU or merely print the command") From 4f55081f38205ec4c2267d53fc7664efe4e22153 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 27 Jan 2025 20:31:12 +0100 Subject: [PATCH 5/7] Override netdev --- internal/gok/vmrun.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 83aa2ab..194b221 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -62,9 +62,9 @@ var vmRunImpl vmRunConfig func init() { vmRunCmd.Flags().StringVarP(&vmRunImpl.sudo, "sudo", "", "", "Whether to elevate privileges using sudo when required (one of auto, always, never, default auto)") vmRunCmd.Flags().IntVarP(&vmRunImpl.targetStorageBytes, "target_storage_bytes", "", 1258299392, "Size of the disk image in bytes") - vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", "", "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") - vmRunCmd.Flags().StringVarP(&vmRunImpl.netdev, "netdev", "", "", "additional qemu netdev arguments") - vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "keep ephemeral disk images around instead of deleting them when QEMU exits") + vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", "", "Architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") + vmRunCmd.Flags().StringVarP(&vmRunImpl.netdev, "netdev", "", "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22", "QEMU -netdev argument") + vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "Keep ephemeral disk images around instead of deleting them when QEMU exits") vmRunCmd.Flags().BoolVarP(&vmRunImpl.dry, "dryrun", "", false, "Whether to actually run QEMU or merely print the command") vmRunCmd.Flags().BoolVarP(&vmRunImpl.graphic, "graphic", "", true, "Run QEMU in graphical mode?") instanceflag.RegisterPflags(vmRunCmd.Flags()) @@ -156,11 +156,6 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { qemuBin = "qemu-system-aarch64" } - netdev := "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22" - if r.netdev != "" { - netdev += "," + r.netdev - } - qemu := exec.CommandContext(ctx, qemuBin, "-name", instanceflag.Instance(), "-boot", "order=d", @@ -169,7 +164,7 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { "-watchdog-action", "reset", "-smp", strconv.Itoa(max(runtime.NumCPU(), 2)), "-device", "e1000,netdev=net0", - "-netdev", netdev, + "-netdev", r.netdev, "-m", "1024") // Start in EFI mode (not legacy BIOS) so that we get a frame buffer (for From 23157b6c37e6e5d03b530fa97369c1ea2ffd668f Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 27 Jan 2025 20:34:13 +0100 Subject: [PATCH 6/7] wip --- internal/gok/vmrun.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 194b221..21b4d57 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -62,9 +62,9 @@ var vmRunImpl vmRunConfig func init() { vmRunCmd.Flags().StringVarP(&vmRunImpl.sudo, "sudo", "", "", "Whether to elevate privileges using sudo when required (one of auto, always, never, default auto)") vmRunCmd.Flags().IntVarP(&vmRunImpl.targetStorageBytes, "target_storage_bytes", "", 1258299392, "Size of the disk image in bytes") - vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", "", "Architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") + vmRunCmd.Flags().StringVarP(&vmRunImpl.arch, "arch", "", "", "architecture for which to build and run QEMU. One of 'amd64' or 'arm64'") vmRunCmd.Flags().StringVarP(&vmRunImpl.netdev, "netdev", "", "user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::8022-:22", "QEMU -netdev argument") - vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "Keep ephemeral disk images around instead of deleting them when QEMU exits") + vmRunCmd.Flags().BoolVarP(&vmRunImpl.keep, "keep", "", false, "keep ephemeral disk images around instead of deleting them when QEMU exits") vmRunCmd.Flags().BoolVarP(&vmRunImpl.dry, "dryrun", "", false, "Whether to actually run QEMU or merely print the command") vmRunCmd.Flags().BoolVarP(&vmRunImpl.graphic, "graphic", "", true, "Run QEMU in graphical mode?") instanceflag.RegisterPflags(vmRunCmd.Flags()) From fad6c407c619b511d5f6b8dd65e9d1a1f59beaaa Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 28 Jan 2025 20:59:49 +0100 Subject: [PATCH 7/7] Update vmrun.go --- internal/gok/vmrun.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/gok/vmrun.go b/internal/gok/vmrun.go index 4c98a51..2f20570 100644 --- a/internal/gok/vmrun.go +++ b/internal/gok/vmrun.go @@ -147,7 +147,7 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error { return err } arm64EFI := filepath.Join(tmp, "arm64-QEMU_EFI.fd") - if err := os.WriteFile(arm64EFI, edk.Arm64EFI, 0o644); err != nil { + if err := os.WriteFile(arm64EFI, edk.Arm64EFI, 0644); err != nil { return err }