diff --git a/internal/vm/start_linux.go b/internal/vm/start_linux.go new file mode 100644 index 0000000..9f59261 --- /dev/null +++ b/internal/vm/start_linux.go @@ -0,0 +1,53 @@ +//go:build linux + +package vm + +import ( + "fmt" + "os/exec" + + "git.g3e.fr/syonad/two/internal/netns" +) + +type Config struct { + Name string + VpcName string + TapID int + Mac string + VolumePath string + Memory int + CPUs int +} + +func Start(cfg Config) error { + memory := cfg.Memory + if memory == 0 { + memory = 512 + } + + cpus := cfg.CPUs + if cpus == 0 { + cpus = 1 + } + + return netns.Call(cfg.VpcName, func() error { + cmd := exec.Command("qemu-system-x86_64", + "-enable-kvm", + "-cpu", "host", + "-m", fmt.Sprintf("%d", memory), + "-smp", fmt.Sprintf("%d", cpus), + "-serial", fmt.Sprintf("unix:/tmp/%s.sock,server,nowait", cfg.Name), + "-monitor", fmt.Sprintf("unix:/tmp/%s.mon-sock,server,nowait", cfg.Name), + "-qmp", fmt.Sprintf("unix:/tmp/%s.qmp-sock,server,nowait", cfg.Name), + "-display", "none", + "-drive", fmt.Sprintf("file=%s,if=virtio", cfg.VolumePath), + "-netdev", fmt.Sprintf("tap,id=net0,ifname=tap%d,script=no,downscript=no", cfg.TapID), + "-device", fmt.Sprintf("virtio-net-pci,netdev=net0,mac=%s", cfg.Mac), + "-daemonize", + ) + if err := cmd.Run(); err != nil { + return fmt.Errorf("qemu-system-x86_64: %w", err) + } + return nil + }) +} diff --git a/internal/vm/start_other.go b/internal/vm/start_other.go new file mode 100644 index 0000000..9fb56fc --- /dev/null +++ b/internal/vm/start_other.go @@ -0,0 +1,14 @@ +//go:build !linux + +package vm + +import "errors" + +type Config struct { + Name, VpcName, Mac, VolumePath string + TapID, Memory, CPUs int +} + +func Start(cfg Config) error { + return errors.New("vm: not supported on this platform") +}