Skip to content

Commit 122b6de

Browse files
committed
pkg/driver/vz: Support ASIF as diffdisk
Depends on lima-vm/go-qcow2reader#61 How to setup ASIF as diffdisk: 1. Create an instance for test, then stop it. ```console $ limactl start template:ubuntu --name=asif-test --tty=false --log-level=fatal; limactl stop asif-test --log-level=fatal ``` 2. Convert `diffdisk` with ASIF image. (original will be renamed to `diffdisk.raw`) ```console $ hack/convert-diffdisk-to-asif.sh asif-test + instance=asif-test ++ limactl list asif-test --format '{{.Dir}}' + instance_dir=/Users/norio/.lima/asif-test ++ head -c 4 /Users/norio/.lima/asif-test/diffdisk + head4bytes= + case "${head4bytes}" in ++ limactl list asif-test --format '{{.Status}}' + instance_state=Stopped + [[ Stopped == \S\t\o\p\p\e\d ]] + diskutil image create blank --fs none --format ASIF --size 100GiB /Users/norio/.lima/asif-test/diffdisk.asif /Users/norio/.lima/asif-test/diffdisk.asif created ++ diskutil image attach -n /Users/norio/.lima/asif-test/diffdisk.asif + attached_device=/dev/disk5 + dd if=/Users/norio/.lima/asif-test/diffdisk of=/dev/disk5 status=progress conv=sparse 107152496640 bytes (107 GB, 100 GiB) transferred 115.003s, 932 MB/s 209715200+0 records in 209715200+0 records out 107374182400 bytes transferred in 115.228413 secs (931837727 bytes/sec) + hdiutil detach /dev/disk5 "disk5" ejected. + mv /Users/norio/.lima/asif-test/diffdisk /Users/norio/.lima/asif-test/diffdisk.raw + mv /Users/norio/.lima/asif-test/diffdisk.asif /Users/norio/.lima/asif-test/diffdisk + echo 'Converted diffdisk to ASIF format successfully' Converted diffdisk to ASIF format successfully ``` 3. Start the instance ```console $ limactl start asif-test ``` Signed-off-by: Norio Nomura <norio.nomura@gmail.com> Apply reviews - hack/convert-diffdisk-to-asif.sh: Add description of script. - pkg/driver/vz: Refine error text on detecting unexpected image type. Signed-off-by: Norio Nomura <norio.nomura@gmail.com>
1 parent 3b39636 commit 122b6de

File tree

4 files changed

+70
-4
lines changed

4 files changed

+70
-4
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,5 @@ require (
147147
sigs.k8s.io/randfill v1.0.0 // indirect
148148
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
149149
)
150+
151+
replace github.com/lima-vm/go-qcow2reader => github.com/norio-nomura/go-qcow2reader v0.6.1-0.20251110085027-73026bc16b7b

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,6 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
162162
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
163163
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
164164
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
165-
github.com/lima-vm/go-qcow2reader v0.6.0 h1:dNstUGQxEUPbmiiVnu/cek2x7scrHe2VJy5JseLLflo=
166-
github.com/lima-vm/go-qcow2reader v0.6.0/go.mod h1:ay45SlGOzU+2Vc21g5/lmQgPn7Hmf0JpPhm8cuOK1FI=
167165
github.com/lima-vm/sshocker v0.3.8 h1:nnIaqi1G1hvWihm++53YBXeI8/x7CQNzhEswPC0M2E0=
168166
github.com/lima-vm/sshocker v0.3.8/go.mod h1:sO9dTE0i+I0BHHVpyoKZWkPFtHtTkrqcfCkQguRMsx8=
169167
github.com/linuxkit/virtsock v0.0.0-20220523201153-1a23e78aa7a2 h1:DZMFueDbfz6PNc1GwDRA8+6lBx1TB9UnxDQliCqR73Y=
@@ -209,6 +207,8 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
209207
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
210208
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
211209
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
210+
github.com/norio-nomura/go-qcow2reader v0.6.1-0.20251110085027-73026bc16b7b h1:oP4ZY9Geumc+PmknrDpdXJc3V4XFVLHVuv3/sUhIlB4=
211+
github.com/norio-nomura/go-qcow2reader v0.6.1-0.20251110085027-73026bc16b7b/go.mod h1:ay45SlGOzU+2Vc21g5/lmQgPn7Hmf0JpPhm8cuOK1FI=
212212
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
213213
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
214214
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=

hack/convert-diffdisk-to-asif.sh

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/bin/bash
2+
3+
# SPDX-FileCopyrightText: Copyright The Lima Authors
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
# This script converts the diffdisk of a Lima instance to ASIF format.
7+
# It requires that the instance is stopped before conversion.
8+
# Usage: hack/convert-diffdisk-to-asif.sh [instance-name]
9+
10+
set -eux -o pipefail
11+
12+
instance="${1:-asif-test}"
13+
14+
# Get instance dir
15+
instance_dir=$(limactl list "${instance}" --format "{{.Dir}}") || {
16+
echo "Failed to get instance dir for ${instance}"
17+
exit 1
18+
}
19+
20+
# Check diffdisk type
21+
head4bytes="$(head -c 4 "${instance_dir}/diffdisk")"
22+
case "${head4bytes}" in
23+
shdw)
24+
echo "diffdisk is already in ASIF format"
25+
exit 1
26+
;;
27+
QFI*)
28+
echo "diffdisk is in QCOW2 format"
29+
exit 1
30+
;;
31+
*) ;;
32+
esac
33+
34+
# Check instance state
35+
instance_state="$(limactl list "${instance}" --format "{{.Status}}")" || {
36+
echo "Failed to get instance state for ${instance}"
37+
exit 1
38+
}
39+
[[ ${instance_state} == "Stopped" ]] || {
40+
echo "Instance ${instance} must be stopped"
41+
exit 1
42+
}
43+
44+
# Create ASIF image
45+
diskutil image create blank --fs none --format ASIF --size 100GiB "${instance_dir}/diffdisk.asif"
46+
47+
# Attach ASIF image (`hdiutil attach` does not support attaching ASIF)
48+
attached_device=$(diskutil image attach -n "${instance_dir}/diffdisk.asif")
49+
50+
# Write `diffdisk` content to attached device using `dd` with `conv=sparse` option (`diskutil` does not support sparse)
51+
dd if="${instance_dir}/diffdisk" of="${attached_device}" status=progress conv=sparse
52+
53+
# Detach the device (`diskutil unmountDisk` does not detach the device)
54+
hdiutil detach "${attached_device}"
55+
56+
# Replace `diffdisk` with `diffdisk.asif`
57+
mv "${instance_dir}/diffdisk" "${instance_dir}/diffdisk.raw"
58+
mv "${instance_dir}/diffdisk.asif" "${instance_dir}/diffdisk"
59+
60+
echo "Converted diffdisk to ASIF format successfully"

pkg/driver/vz/vm_darwin.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os"
1515
"path/filepath"
1616
"runtime"
17+
"slices"
1718
"strconv"
1819
"sync"
1920
"syscall"
@@ -22,6 +23,8 @@ import (
2223
"github.com/coreos/go-semver/semver"
2324
"github.com/docker/go-units"
2425
"github.com/lima-vm/go-qcow2reader"
26+
"github.com/lima-vm/go-qcow2reader/image"
27+
"github.com/lima-vm/go-qcow2reader/image/asif"
2528
"github.com/lima-vm/go-qcow2reader/image/raw"
2629
"github.com/sirupsen/logrus"
2730

@@ -451,8 +454,9 @@ func validateDiskFormat(diskPath string) error {
451454
if err != nil {
452455
return fmt.Errorf("failed to detect the format of %q: %w", diskPath, err)
453456
}
454-
if t := img.Type(); t != raw.Type {
455-
return fmt.Errorf("expected the format of %q to be %q, got %q", diskPath, raw.Type, t)
457+
supportedDiskTypes := []image.Type{raw.Type, asif.Type}
458+
if t := img.Type(); !slices.Contains(supportedDiskTypes, t) {
459+
return fmt.Errorf("expected the format of %q to be one of %v, got %q", diskPath, supportedDiskTypes, t)
456460
}
457461
// TODO: ensure that the disk is formatted with GPT or ISO9660
458462
return nil

0 commit comments

Comments
 (0)