feature-32 #35

Manually merged
nicolas.boufideline merged 6 commits from feature-32 into main 2026-06-14 21:05:25 +00:00
4 changed files with 72 additions and 20 deletions
Showing only changes of commit 89899005d9 - Show all commits

f-32: disk: add disk in qemu start

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
GnomeZworc 2026-05-24 15:56:45 +02:00
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632

View file

@ -87,8 +87,11 @@ func vmFromDB(name string, entries map[string]string) (VM, error) {
vm.Interfaces = []VMInterface{{Subnet: subnet, IP: ip, Primary: true}} vm.Interfaces = []VMInterface{{Subnet: subnet, IP: ip, Primary: true}}
} }
if path := entries[prefix+"volume_path"]; path != "" { diskPrefix := prefix + "disk/"
vm.Storage = []VMStorage{{Path: path}} for key, path := range entries {
if dev := strings.TrimPrefix(key, diskPrefix); dev != key {
vm.Storage = append(vm.Storage, VMStorage{Path: path, Dev: dev})
}
} }
return vm, nil return vm, nil

View file

@ -7,13 +7,20 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"sort"
"strings"
) )
type DiskConfig struct {
Path string
Dev string
}
type Config struct { type Config struct {
Name string Name string
TapID int TapID int
Mac string Mac string
VolumePath string Disks []DiskConfig
Memory int Memory int
CPUs int CPUs int
UEFICodePath string UEFICodePath string
@ -64,8 +71,36 @@ func Start(cfg Config) error {
) )
} }
hasScsi := false
for _, d := range cfg.Disks {
if strings.HasPrefix(d.Dev, "sd") {
hasScsi = true
break
}
}
if hasScsi {
args = append(args, "-device", "virtio-scsi-pci,id=scsi0")
}
sorted := make([]DiskConfig, len(cfg.Disks))
copy(sorted, cfg.Disks)
sort.Slice(sorted, func(i, j int) bool { return sorted[i].Dev < sorted[j].Dev })
for _, d := range sorted {
if strings.HasPrefix(d.Dev, "sd") {
scsiID := int(d.Dev[2] - 'a')
args = append(args,
"-drive", fmt.Sprintf("file=%s,if=none,id=%s", d.Path, d.Dev),
"-device", fmt.Sprintf("scsi-hd,drive=%s,bus=scsi0.0,scsi-id=%d", d.Dev, scsiID),
)
} else {
args = append(args,
"-drive", fmt.Sprintf("file=%s,if=virtio,id=%s", d.Path, d.Dev),
)
}
}
args = append(args, args = append(args,
"-drive", fmt.Sprintf("file=%s,if=virtio", cfg.VolumePath),
"-netdev", fmt.Sprintf("tap,id=net0,ifname=tap%d,script=no,downscript=no", cfg.TapID), "-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), "-device", fmt.Sprintf("virtio-net-pci,netdev=net0,mac=%s", cfg.Mac),
"-daemonize", "-daemonize",

View file

@ -4,9 +4,18 @@ package qemu
import "errors" import "errors"
type DiskConfig struct {
Path string
Dev string
}
type Config struct { type Config struct {
Name, Mac, VolumePath string Name string
TapID, Memory, CPUs int TapID int
Mac string
Disks []DiskConfig
Memory int
CPUs int
UEFICodePath string UEFICodePath string
UEFIVarsPath string UEFIVarsPath string
SerialDir string SerialDir string

View file

@ -52,11 +52,16 @@ func StartVM(db *badger.DB, name string, cfg *configuration.Config) error {
return fmt.Errorf("start metadata: %w", err) return fmt.Errorf("start metadata: %w", err)
} }
qDisks := make([]qemu.DiskConfig, len(d.disks))
for i, disk := range d.disks {
qDisks[i] = qemu.DiskConfig{Path: disk.path, Dev: disk.dev}
}
qcfg := qemu.Config{ qcfg := qemu.Config{
Name: name, Name: name,
TapID: d.tapID, TapID: d.tapID,
Mac: d.mac, Mac: d.mac,
VolumePath: d.disks[0].path, Disks: qDisks,
Memory: d.memory, Memory: d.memory,
CPUs: d.cpus, CPUs: d.cpus,
SerialDir: cfg.QEMU.SerialDir, SerialDir: cfg.QEMU.SerialDir,