Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/driverutil/disk.go
2611 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package driverutil
5
6
import (
7
"context"
8
"errors"
9
"fmt"
10
"os"
11
"path/filepath"
12
13
"github.com/docker/go-units"
14
"github.com/lima-vm/go-qcow2reader/image"
15
16
"github.com/lima-vm/lima/v2/pkg/imgutil/proxyimgutil"
17
"github.com/lima-vm/lima/v2/pkg/iso9660util"
18
"github.com/lima-vm/lima/v2/pkg/limatype/filenames"
19
)
20
21
// EnsureDisk ensures that the diff disk exists with the specified size and format.
22
func EnsureDisk(ctx context.Context, instDir, diskSize string, diskImageFormat image.Type) error {
23
diffDisk := filepath.Join(instDir, filenames.DiffDisk)
24
if _, err := os.Stat(diffDisk); err == nil || !errors.Is(err, os.ErrNotExist) {
25
// disk is already ensured
26
return err
27
}
28
29
diskUtil := proxyimgutil.NewDiskUtil(ctx)
30
31
baseDisk := filepath.Join(instDir, filenames.BaseDisk)
32
33
diskSizeInBytes, _ := units.RAMInBytes(diskSize)
34
if diskSizeInBytes == 0 {
35
return nil
36
}
37
isBaseDiskISO, err := iso9660util.IsISO9660(baseDisk)
38
if err != nil {
39
return err
40
}
41
srcDisk := baseDisk
42
if isBaseDiskISO {
43
srcDisk = diffDisk
44
45
// Create an empty data volume for the diff disk
46
diffDiskF, err := os.Create(diffDisk)
47
if err != nil {
48
return err
49
}
50
51
if err = diffDiskF.Close(); err != nil {
52
return err
53
}
54
}
55
// Check whether to use ASIF format
56
57
if err = diskUtil.Convert(ctx, diskImageFormat, srcDisk, diffDisk, &diskSizeInBytes, false); err != nil {
58
return fmt.Errorf("failed to convert %q to a disk %q: %w", srcDisk, diffDisk, err)
59
}
60
return err
61
}
62
63