48 lines
1 KiB
Go
48 lines
1 KiB
Go
//go:build linux
|
|
|
|
package qemu
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
)
|
|
|
|
type Config struct {
|
|
Name 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
|
|
}
|
|
|
|
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
|
|
}
|