Skip to content

Commit bb68030

Browse files
authored
Merge branch 'lima-vm:master' into doc-update
2 parents e7ce9fa + 3fea800 commit bb68030

File tree

7 files changed

+94
-2
lines changed

7 files changed

+94
-2
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jobs:
110110
- - -
111111
Release manager: [ADD YOUR NAME HERE] (@[ADD YOUR GITHUB ID HERE])
112112
EOF
113-
- uses: actions/attest-build-provenance@c074443f1aee8d4aeeae555aebba3282517141b2 # v2.2.3
113+
- uses: actions/attest-build-provenance@db473fddc028af60658334401dc6fa3ffd8669fd # v2.3.0
114114
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
115115
with:
116116
subject-path: _artifacts/*

cmd/limactl/disk.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ import (
99
"fmt"
1010
"io/fs"
1111
"os"
12+
"path/filepath"
1213
"text/tabwriter"
1314

15+
contfs "github.com/containerd/continuity/fs"
1416
"github.com/docker/go-units"
17+
"github.com/lima-vm/go-qcow2reader"
1518
"github.com/lima-vm/lima/pkg/nativeimgutil"
1619
"github.com/lima-vm/lima/pkg/qemu"
1720
"github.com/lima-vm/lima/pkg/store"
21+
"github.com/lima-vm/lima/pkg/store/filenames"
1822
"github.com/sirupsen/logrus"
1923
"github.com/spf13/cobra"
2024
)
@@ -44,6 +48,7 @@ func newDiskCommand() *cobra.Command {
4448
newDiskDeleteCommand(),
4549
newDiskUnlockCommand(),
4650
newDiskResizeCommand(),
51+
newDiskImportCommand(),
4752
)
4853
return diskCommand
4954
}
@@ -418,3 +423,64 @@ func diskResizeAction(cmd *cobra.Command, args []string) error {
418423
func diskBashComplete(cmd *cobra.Command, _ []string, _ string) ([]string, cobra.ShellCompDirective) {
419424
return bashCompleteDiskNames(cmd)
420425
}
426+
427+
func newDiskImportCommand() *cobra.Command {
428+
diskImportCommand := &cobra.Command{
429+
Use: "import DISK FILE",
430+
Example: `
431+
Import a disk:
432+
$ limactl disk import DISK DISKPATH
433+
`,
434+
Short: "Import an existing disk to Lima",
435+
Args: WrapArgsError(cobra.ExactArgs(2)),
436+
RunE: diskImportAction,
437+
ValidArgsFunction: diskBashComplete,
438+
}
439+
return diskImportCommand
440+
}
441+
442+
func diskImportAction(_ *cobra.Command, args []string) error {
443+
diskName := args[0]
444+
fName := args[1]
445+
446+
diskDir, err := store.DiskDir(diskName)
447+
if err != nil {
448+
return err
449+
}
450+
451+
if _, err := os.Stat(diskDir); !errors.Is(err, fs.ErrNotExist) {
452+
return fmt.Errorf("disk %q already exists (%q)", diskName, diskDir)
453+
}
454+
455+
f, err := os.Open(fName)
456+
if err != nil {
457+
return err
458+
}
459+
defer f.Close()
460+
461+
img, err := qcow2reader.Open(f)
462+
if err != nil {
463+
return err
464+
}
465+
466+
diskSize := img.Size()
467+
format := img.Type()
468+
469+
switch format {
470+
case "qcow2", "raw":
471+
default:
472+
return fmt.Errorf(`disk format %q not supported, use "qcow2" or "raw" instead`, format)
473+
}
474+
475+
if err := os.MkdirAll(diskDir, 0o755); err != nil {
476+
return err
477+
}
478+
479+
if err := contfs.CopyFile(filepath.Join(diskDir, filenames.DataDisk), fName); err != nil {
480+
return nil
481+
}
482+
483+
logrus.Infof("Imported %s with size %s", diskName, units.BytesSize(float64(diskSize)))
484+
485+
return nil
486+
}

pkg/version/versionutil/versionutil.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ import (
1111

1212
// Parse parses a Lima version string by removing the leading "v" character and
1313
// stripping everything from the first "-" forward (which are `git describe` artifacts and
14-
// not semver pre-release markers). So "v0.19.1-16-gf3dc6ed.m" will be parsed as "0.19.1".
14+
// not semver pre-release markers) or cutting ".m" suffix from exact version.
15+
// So "v0.19.1-16-gf3dc6ed.m" will be parsed as "0.19.1".
1516
func Parse(version string) (*semver.Version, error) {
1617
version = strings.TrimPrefix(version, "v")
1718
version, _, _ = strings.Cut(version, "-")
19+
version = strings.TrimSuffix(version, ".m")
1820
return semver.NewVersion(version)
1921
}
2022

pkg/version/versionutil/versionutil_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,17 @@ func TestGreaterEqual(t *testing.T) {
2727
assert.Equal(t, GreaterEqual("0.2.0", "0.1.0"), true)
2828
assert.Equal(t, GreaterEqual("abacab", "0.1.0"), true)
2929
}
30+
31+
func TestParse(t *testing.T) {
32+
v1, err1 := Parse("v0.19.1-16-gf3dc6ed.m")
33+
assert.NilError(t, err1)
34+
assert.Equal(t, v1.Major, int64(0))
35+
assert.Equal(t, v1.Minor, int64(19))
36+
assert.Equal(t, v1.Patch, int64(1))
37+
38+
v2, err2 := Parse("v0.19.1.m")
39+
assert.NilError(t, err2)
40+
assert.Equal(t, v2.Major, int64(0))
41+
assert.Equal(t, v2.Minor, int64(19))
42+
assert.Equal(t, v2.Patch, int64(1))
43+
}

templates/_images/fedora-41.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ images:
77
arch: aarch64
88
digest: sha256:085883b42c7e3b980e366a1fe006cd0ff15877f7e6e984426f3c6c67c7cc2faa
99

10+
- location: https://dl.fedoraproject.org/pub/alt/risc-v/release/41/Cloud/riscv64/images/Fedora-Cloud-Base-Generic-41.20250224-1026a2d0e311.riscv64.qcow2
11+
arch: riscv64
12+
digest: sha256:6a8272a858d7f1498f49ce362b34f0b9b959885f63285158947e045abfeece40
13+
1014
# 9p is broken in Linux v6.9, v6.10, and v6.11 (used by Fedora 41).
1115
# The issue was fixed in Linux v6.12-rc5 (https://github.com/torvalds/linux/commit/be2ca38).
1216
mountTypesUnsupported: [9p]

templates/_images/fedora-42.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ images:
77
arch: aarch64
88
digest: sha256:e10658419a8d50231037dc781c3155aa94180a8c7a74e5cac2a6b09eaa9342b7
99

10+
- location: https://dl.fedoraproject.org/pub/alt/risc-v/release/42/Cloud/riscv64/images/Fedora-Cloud-Base-Generic-42.20250414-8635a3a5bfcd.riscv64.qcow2
11+
arch: riscv64
12+
digest: sha256:537c67710f4f1c9112fecaafafc293b649acd1d35b46619b97b5a5a0132241b0
1013

1114
# # NOTE: Intel Mac requires setting vmType to qemu
1215
# # https://github.com/lima-vm/lima/issues/3334

templates/experimental/debian-sid.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ images:
99
- location: https://cloud.debian.org/images/cloud/sid/daily/latest/debian-sid-genericcloud-arm64-daily.qcow2
1010
arch: aarch64
1111

12+
- location: https://cloud.debian.org/images/cloud/sid/daily/latest/debian-sid-genericcloud-riscv64-daily.qcow2
13+
arch: riscv64
14+
1215
mountTypesUnsupported: [9p]

0 commit comments

Comments
 (0)