feature-32 #35
4 changed files with 72 additions and 20 deletions
f-32: disk: add disk in qemu start
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
commit
89899005d9
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue