lima-vm/lima · error

failed to convert extra disk %#q to raw: %w

Error message

failed to convert extra disk %#q to raw: %w

What it means

krunkit/libkrun requires raw disk images, so Cmdline converts each additional disk's data disk to raw format using diskUtil.Convert. If the conversion fails (unsupported image format, truncated/corrupt file, insufficient disk space for the raw copy), the error is wrapped as `failed to convert extra disk %#q to raw: %w`.

Source

Thrown at pkg/driver/krunkit/krunkit_darwin_arm64.go:77

	// Add additional disks
	if len(inst.Config.AdditionalDisks) > 0 {
		ctx := context.Background()
		diskUtil := proxyimgutil.NewDiskUtil(ctx)
		for _, d := range inst.Config.AdditionalDisks {
			disk, derr := store.InspectDisk(d.Name, d.FSType)
			if derr != nil {
				return nil, fmt.Errorf("failed to load disk %#q: %w", d.Name, derr)
			}
			if disk.Instance != "" {
				return nil, fmt.Errorf("failed to run attach disk %#q, in use by instance %#q", disk.Name, disk.Instance)
			}
			if lerr := disk.Lock(inst.Dir); lerr != nil {
				return nil, fmt.Errorf("failed to lock disk %#q: %w", d.Name, lerr)
			}
			extraDiskPath := filepath.Join(disk.Dir, filenames.DataDisk)
			logrus.Infof("Mounting disk %#q on %#q", disk.Name, disk.MountPoint)
			if cerr := diskUtil.Convert(ctx, raw.Type, extraDiskPath, extraDiskPath, nil, true); cerr != nil {
				return nil, fmt.Errorf("failed to convert extra disk %#q to raw: %w", extraDiskPath, cerr)
			}
			args = append(args, "--device", fmt.Sprintf("virtio-blk,path=%s,format=raw", extraDiskPath))
		}
	}

	// Network commands
	networkArgs, err := buildNetworkArgs(inst)
	if err != nil {
		return nil, fmt.Errorf("failed to build network arguments: %w", err)
	}

	// File sharing commands
	if *inst.Config.MountType == limatype.VIRTIOFS {
		for _, mount := range inst.Config.Mounts {
			if _, err := os.Stat(mount.Location); errors.Is(err, os.ErrNotExist) {
				if err := os.MkdirAll(mount.Location, 0o750); err != nil {
					return nil, err
				}

View on GitHub (pinned to dd909d0973)

Solutions

  1. Read the wrapped `%w` error to identify the root cause (format vs I/O).
  2. Free space on the host volume holding ~/.lima/disks and retry `limactl start`.
  3. Recreate the disk: `limactl disk delete <name>` then `limactl disk create <name> --size <size>`, and re-copy data.
  4. Verify the data file under ~/.lima/disks/<name>/ with an image tool; if corrupt, restore from backup.

Example fix

# before: start fails converting disk "data"
$ df -h ~/.lima/disks          # check space
$ limactl disk delete data && limactl disk create data --size 50G
# after
$ limactl start myinstance
Defensive patterns

Strategy: validation

Validate before calling

// Shell: verify image and free space before start
df -h "$HOME/.lima/disks" | awk 'NR==2 {exit ($5+0 > 90 ? 1 : 0)}' || { echo "low disk space"; exit 1; }
file "$HOME/.lima/disks/<name>/datalt" # confirm a readable image

Try / catch

if err := inst.Start(ctx); err != nil {
    if strings.Contains(err.Error(), "failed to convert extra disk") {
        // recreate disk and reattach
        exec.Command("limactl", "disk", "delete", diskName).Run()
        exec.Command("limactl", "disk", "create", diskName, "--size", "50G").Run()
        return inst.Start(ctx)
    }
    return err
}

Prevention

When it happens

Trigger: Starting an instance with additionalDisks whose backing data file is in a non-raw format that cannot be converted (e.g. corrupt qcow2), or conversion failing due to no space in ~/.lima/disks/<name> since raw conversion writes in place with `true` (in-place flag) — any underlying Convert error surfaces here.

Common situations: Disk created by a different tool/version leaving an incompatible image; disk file partially deleted or zero-length; host disk full during conversion; interrupting a previous conversion left the image in a broken state.

Related errors


AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01). Data as JSON: /api/errors/56c4e958f5b009f3. Report an issue: GitHub.