Skip to content

Commit

Permalink
feat: mount additional disks when using vz
Browse files Browse the repository at this point in the history
Signed-off-by: Justin Alvarez <[email protected]>
  • Loading branch information
pendo324 committed Mar 3, 2023
1 parent 5a9bca3 commit 670a268
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 1 deletion.
10 changes: 10 additions & 0 deletions pkg/driver/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ type Driver interface {

CreateDisk() error

InspectDisk(diskName string) (*store.Disk, error)

Start(_ context.Context) (chan error, error)

Stop(_ context.Context) error
Expand All @@ -36,6 +38,14 @@ func (d *BaseDriver) CreateDisk() error {
return nil
}

func (d *BaseDriver) InspectDisk(diskName string) (*store.Disk, error) {
disk, err := store.InspectDisk(diskName)
if err != nil {
return nil, err
}
return disk, nil
}

func (d *BaseDriver) Start(_ context.Context) (chan error, error) {
return nil, nil
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/qemu/qemu.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func CreateDataDisk(dir string, size int) error {
return err
}

args := []string{"create", "-f", "qcow2", dataDisk, strconv.Itoa(size)}
args := []string{"create", "-f", "raw", dataDisk, strconv.Itoa(size)}
cmd := exec.Command("qemu-img", args...)
if out, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("failed to run %v: %q: %w", cmd.Args, string(out), err)
Expand Down
51 changes: 51 additions & 0 deletions pkg/vz/vm_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"fmt"
"net"
"os"
"os/exec"
"path/filepath"
"strconv"
"syscall"
Expand Down Expand Up @@ -334,6 +335,56 @@ func attachDisks(driver *driver.BaseDriver, vmConfig *vz.VirtualMachineConfigura
}
configurations = append(configurations, diffDisk)

for _, diskName := range driver.Yaml.AdditionalDisks {
d, err := driver.InspectDisk(diskName)
if err != nil {
return fmt.Errorf("failed to run load disk %q: %q", diskName, err)
}

if d.Instance != "" {
return fmt.Errorf("failed to run attach disk %q, in use by instance %q", diskName, d.Instance)
}
logrus.Infof("Mounting disk %q on %q", diskName, d.MountPoint)
err = d.Lock(driver.Instance.Dir)
if err != nil {
return fmt.Errorf("failed to run lock disk %q: %q", diskName, err)
}
extraDiskPath := filepath.Join(d.Dir, filenames.DataDisk)

extraDiskFormat, err := imgutil.DetectFormat(extraDiskPath)
if err != nil {
return fmt.Errorf("failed to run detect disk format %q: %q", diskName, err)
}
if extraDiskFormat != "raw" {
rawPath := fmt.Sprintf("%s.raw", extraDiskPath)
if err = imgutil.QCOWToRaw(extraDiskPath, rawPath); err != nil {
return fmt.Errorf("failed to convert qcow2 disk %q to raw for vz driver: %w", diskName, err)
}
cmd := exec.Command("mv", extraDiskPath, fmt.Sprintf("%s.qcow2", extraDiskPath))
if out, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("failed to run %v: %q: %w", cmd.Args, string(out), err)
}
cmd = exec.Command("mv", rawPath, extraDiskPath)
logrus.Info("Running command: %s", cmd.String())
if out, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("failed to run %v: %q: %w", cmd.Args, string(out), err)
}
}

if err = validateDiskFormat(extraDiskPath); err != nil {
return fmt.Errorf("failed to validate extra disk %q: %w", extraDiskPath, err)
}
extraDiskPathAttachment, err := vz.NewDiskImageStorageDeviceAttachmentWithCacheAndSync(extraDiskPath, false, vz.DiskImageCachingModeAutomatic, vz.DiskImageSynchronizationModeFsync)
if err != nil {
return fmt.Errorf("failed to create disk attachment for extra disk %q: %w", extraDiskPath, err)
}
extraDisk, err := vz.NewVirtioBlockDeviceConfiguration(extraDiskPathAttachment)
if err != nil {
return fmt.Errorf("failed to create new virtio block device config for extra disk %q: %w", extraDiskPath, err)
}
configurations = append(configurations, extraDisk)
}

if err = validateDiskFormat(ciDataPath); err != nil {
return err
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/vz/vz_driver_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"time"

"github.com/lima-vm/lima/pkg/reflectutil"
"github.com/lima-vm/lima/pkg/store"

"github.com/Code-Hex/vz/v3"

Expand Down Expand Up @@ -64,6 +65,7 @@ func (l *LimaVzDriver) Validate() error {
"PropagateProxyEnv",
"CACertificates",
"Rosetta",
"AdditionalDisks",
); len(unknown) > 0 {
logrus.Warnf("Ignoring: vmType %s: %+v", *l.Yaml.VMType, unknown)
}
Expand Down Expand Up @@ -106,6 +108,10 @@ func (l *LimaVzDriver) CreateDisk() error {
return nil
}

func (l *LimaVzDriver) InspectDisk(diskName string) (*store.Disk, error) {
return l.BaseDriver.InspectDisk(diskName)
}

func (l *LimaVzDriver) Start(ctx context.Context) (chan error, error) {
logrus.Infof("Starting VZ (hint: to watch the boot progress, see %q)", filepath.Join(l.Instance.Dir, filenames.SerialLog))
vm, errCh, err := startVM(ctx, l.BaseDriver)
Expand Down

0 comments on commit 670a268

Please sign in to comment.