Skip to content

Commit 5bf5320

Browse files
authored
Merge pull request #3180 from nirs/limactl-disk-no-qemu
limactl disk: Do not use qemu-img for raw disks
2 parents 03863d8 + be8ad7a commit 5bf5320

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

cmd/limactl/disk.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"text/tabwriter"
1313

1414
"github.com/docker/go-units"
15+
"github.com/lima-vm/lima/pkg/nativeimgutil"
1516
"github.com/lima-vm/lima/pkg/qemu"
1617
"github.com/lima-vm/lima/pkg/store"
1718
"github.com/sirupsen/logrus"
@@ -104,7 +105,13 @@ func diskCreateAction(cmd *cobra.Command, args []string) error {
104105
return err
105106
}
106107

107-
if err := qemu.CreateDataDisk(diskDir, format, int(diskSize)); err != nil {
108+
// qemu may not be available, use it only if needed.
109+
if format == "raw" {
110+
err = nativeimgutil.CreateRawDataDisk(diskDir, int(diskSize))
111+
} else {
112+
err = qemu.CreateDataDisk(diskDir, format, int(diskSize))
113+
}
114+
if err != nil {
108115
rerr := os.RemoveAll(diskDir)
109116
if rerr != nil {
110117
err = errors.Join(err, fmt.Errorf("failed to remove a directory %q: %w", diskDir, rerr))
@@ -393,9 +400,17 @@ func diskResizeAction(cmd *cobra.Command, args []string) error {
393400
}
394401
}
395402
}
396-
if err := qemu.ResizeDataDisk(disk.Dir, disk.Format, int(diskSize)); err != nil {
403+
404+
// qemu may not be available, use it only if needed.
405+
if disk.Format == "raw" {
406+
err = nativeimgutil.ResizeRawDataDisk(disk.Dir, int(diskSize))
407+
} else {
408+
err = qemu.ResizeDataDisk(disk.Dir, disk.Format, int(diskSize))
409+
}
410+
if err != nil {
397411
return fmt.Errorf("failed to resize disk %q: %w", diskName, err)
398412
}
413+
399414
logrus.Infof("Resized disk %q (%q)", diskName, disk.Dir)
400415
return nil
401416
}

pkg/nativeimgutil/nativeimgutil.go

+25-2
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,44 @@
55
package nativeimgutil
66

77
import (
8+
"errors"
89
"fmt"
910
"io"
11+
"io/fs"
1012
"os"
1113
"path/filepath"
1214

13-
"github.com/containerd/continuity/fs"
15+
containerdfs "github.com/containerd/continuity/fs"
1416
"github.com/docker/go-units"
1517
"github.com/lima-vm/go-qcow2reader"
1618
"github.com/lima-vm/go-qcow2reader/convert"
1719
"github.com/lima-vm/go-qcow2reader/image/qcow2"
1820
"github.com/lima-vm/go-qcow2reader/image/raw"
1921
"github.com/lima-vm/lima/pkg/progressbar"
22+
"github.com/lima-vm/lima/pkg/store/filenames"
2023
"github.com/sirupsen/logrus"
2124
)
2225

26+
// CreateRawDataDisk creates an empty raw data disk.
27+
func CreateRawDataDisk(dir string, size int) error {
28+
dataDisk := filepath.Join(dir, filenames.DataDisk)
29+
if _, err := os.Stat(dataDisk); err == nil || !errors.Is(err, fs.ErrNotExist) {
30+
return err
31+
}
32+
f, err := os.Create(dataDisk)
33+
if err != nil {
34+
return err
35+
}
36+
defer f.Close()
37+
return f.Truncate(int64(size))
38+
}
39+
40+
// ResizeRawDataDisk resizes a raw data disk.
41+
func ResizeRawDataDisk(dir string, size int) error {
42+
dataDisk := filepath.Join(dir, filenames.DataDisk)
43+
return os.Truncate(dataDisk, int64(size))
44+
}
45+
2346
// ConvertToRaw converts a source disk into a raw disk.
2447
// source and dest may be same.
2548
// ConvertToRaw is a NOP if source == dest, and no resizing is needed.
@@ -109,7 +132,7 @@ func ConvertToRaw(source, dest string, size *int64, allowSourceWithBackingFile b
109132
func convertRawToRaw(source, dest string, size *int64) error {
110133
if source != dest {
111134
// continuity attempts clonefile
112-
if err := fs.CopyFile(dest, source); err != nil {
135+
if err := containerdfs.CopyFile(dest, source); err != nil {
113136
return fmt.Errorf("failed to copy %q into %q: %w", source, dest, err)
114137
}
115138
}

0 commit comments

Comments
 (0)