Skip to content

Commit 6e6c8b1

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>
1 parent e21b634 commit 6e6c8b1

File tree

4 files changed

+63
-3
lines changed

4 files changed

+63
-3
lines changed

go.mod

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

pkg/driver/vz/vm_darwin.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/coreos/go-semver/semver"
2323
"github.com/docker/go-units"
2424
"github.com/lima-vm/go-qcow2reader"
25+
"github.com/lima-vm/go-qcow2reader/image/asif"
2526
"github.com/lima-vm/go-qcow2reader/image/raw"
2627
"github.com/sirupsen/logrus"
2728

@@ -451,7 +452,7 @@ func validateDiskFormat(diskPath string) error {
451452
if err != nil {
452453
return fmt.Errorf("failed to detect the format of %q: %w", diskPath, err)
453454
}
454-
if t := img.Type(); t != raw.Type {
455+
if t := img.Type(); t != raw.Type && t != asif.Type {
455456
return fmt.Errorf("expected the format of %q to be %q, got %q", diskPath, raw.Type, t)
456457
}
457458
// TODO: ensure that the disk is formatted with GPT or ISO9660

0 commit comments

Comments
 (0)