@@ -16,10 +16,14 @@ import (
16
16
"text/template"
17
17
"time"
18
18
19
+ "github.com/docker/go-units"
20
+ "github.com/lima-vm/go-qcow2reader"
19
21
"github.com/lima-vm/lima/pkg/driver"
20
22
"github.com/lima-vm/lima/pkg/driverutil"
21
23
"github.com/lima-vm/lima/pkg/executil"
24
+ "github.com/lima-vm/lima/pkg/nativeimgutil"
22
25
"github.com/lima-vm/lima/pkg/osutil"
26
+ "github.com/lima-vm/lima/pkg/qemu/imgutil"
23
27
"github.com/lima-vm/lima/pkg/usrlocalsharelima"
24
28
"github.com/mattn/go-isatty"
25
29
@@ -107,6 +111,12 @@ func Prepare(ctx context.Context, inst *store.Instance) (*Prepared, error) {
107
111
if err := limaDriver .CreateDisk (ctx ); err != nil {
108
112
return nil , err
109
113
}
114
+
115
+ // Ensure diffDisk size matches the store
116
+ if err := prepareDiffDisk (inst ); err != nil {
117
+ return nil , err
118
+ }
119
+
110
120
nerdctlArchiveCache , err := ensureNerdctlArchiveCache (ctx , inst .Config , created )
111
121
if err != nil {
112
122
return nil , err
@@ -377,3 +387,55 @@ func ShowMessage(inst *store.Instance) error {
377
387
}
378
388
return scanner .Err ()
379
389
}
390
+
391
+ // prepareDiffDisk checks the disk size difference between inst.Disk and yaml.Disk.
392
+ // If there is no diffDisk, return nil (the instance has not been initialized or started yet).
393
+ func prepareDiffDisk (inst * store.Instance ) error {
394
+ diffDisk := filepath .Join (inst .Dir , filenames .DiffDisk )
395
+
396
+ // Handle the instance initialization
397
+ _ , err := os .Stat (diffDisk )
398
+ if err != nil {
399
+ if os .IsNotExist (err ) {
400
+ return nil
401
+ }
402
+ return err
403
+ }
404
+
405
+ f , err := os .Open (diffDisk )
406
+ if err != nil {
407
+ return err
408
+ }
409
+ defer f .Close ()
410
+
411
+ img , err := qcow2reader .Open (f )
412
+ if err != nil {
413
+ return err
414
+ }
415
+
416
+ diskSize := img .Size ()
417
+ format := string (img .Type ())
418
+
419
+ if inst .Disk == diskSize {
420
+ return nil
421
+ }
422
+
423
+ logrus .Infof ("Resize instance %s's disk from %s to %s" , inst .Name , units .BytesSize (float64 (diskSize )), units .BytesSize (float64 (inst .Disk )))
424
+
425
+ if inst .Disk < diskSize {
426
+ inst .Disk = diskSize
427
+ return errors .New ("diffDisk: Shrinking is currently unavailable" )
428
+ }
429
+
430
+ if format == "raw" {
431
+ err = nativeimgutil .ResizeRawDisk (diffDisk , int (inst .Disk ))
432
+ } else {
433
+ err = imgutil .ResizeDisk (diffDisk , format , int (inst .Disk ))
434
+ }
435
+
436
+ if err != nil {
437
+ return err
438
+ }
439
+
440
+ return nil
441
+ }
0 commit comments