lima-vm/lima · error

failed to calculate digest of raw image: %w

Error message

failed to calculate digest of raw image: %w

What it means

Once the raw image is in place, its digest is computed with calculateFileDigest using the original digest's algorithm (or canonical sha256). If opening the raw file or hashing its stream fails, this error wraps the cause. The digest is later persisted as imgconv/raw.digest for cache validation.

Source

Thrown at pkg/downloader/downloader.go:509

	}
	if err := rawTmpF.Close(); err != nil {
		return "", "", fmt.Errorf("failed to close raw tmp file %q: %w", rawPathTmp, err)
	}

	if err := os.Remove(rawImgConvPath); err != nil && !errors.Is(err, os.ErrNotExist) {
		return "", "", fmt.Errorf("failed to remove stale raw image %q: %w", rawImgConvPath, err)
	}
	if err := os.Rename(rawPathTmp, rawImgConvPath); err != nil {
		return "", "", fmt.Errorf("failed to replace original with raw image: %w", err)
	}

	algo := digest.Canonical
	if originalDigest != "" {
		algo = originalDigest.Algorithm()
	}
	rawDigest, err := calculateFileDigest(rawImgConvPath, algo)
	if err != nil {
		return "", "", fmt.Errorf("failed to calculate digest of raw image: %w", err)
	}

	rawDigestPath := filepath.Join(imgConvPath, "raw.digest")
	rawDigestPathTmp := rawDigestPath + ".tmp"
	defer os.Remove(rawDigestPathTmp)
	if err := os.WriteFile(rawDigestPathTmp, []byte(rawDigest.String()), 0o644); err != nil {
		return "", "", fmt.Errorf("failed to write raw digest file: %w", err)
	}
	if err := os.Remove(rawDigestPath); err != nil && !errors.Is(err, os.ErrNotExist) {
		return "", "", fmt.Errorf("failed to remove stale raw digest file %q: %w", rawDigestPath, err)
	}
	if err := os.Rename(rawDigestPathTmp, rawDigestPath); err != nil {
		return "", "", fmt.Errorf("failed to rename raw digest file: %w", err)
	}

	return rawImgConvPath, rawDigest, nil
}

View on GitHub (pinned to dd909d0973)

Solutions

  1. Retry the download — a transient EIO or racing removal is often resolved on a clean second attempt
  2. Delete the cache entry directory and re-download so conversion and hashing happen atomically
  3. Run filesystem/disk health checks (smartctl, fsck) if hashing repeatedly fails with I/O errors
  4. Move the cache to reliable local storage instead of a network filesystem
Defensive patterns

Strategy: retry

Try / catch

if err != nil && strings.Contains(err.Error(), "failed to calculate digest of raw image") {
    // clear entry and retry
    os.RemoveAll(shadDir)
    return downloadOnce()
}

Prevention

When it happens

Trigger: calculateFileDigest(rawImgConvPath, algo) fails: os.Open returns ENOENT (raw file removed by a racing process) or the algo.FromReader read fails with EIO while hashing a multi-GB image.

Common situations: Concurrent cache deletion removes raw between rename and hashing; failing disk sector hit during a long read of a large image; cache on a network mount that dropped mid-read.

Related errors


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