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
- Retry the download — a transient EIO or racing removal is often resolved on a clean second attempt
- Delete the cache entry directory and re-download so conversion and hashing happen atomically
- Run filesystem/disk health checks (smartctl, fsck) if hashing repeatedly fails with I/O errors
- 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
- Don't delete cache directories while limactl is running
- Use local storage, not network mounts, for large image caches
- Check disk health if hashing large images repeatedly fails
- Allow enough I/O headroom — hashing multi-GB raw images is read-intensive
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
- failed to close raw tmp file %q: %w
- failed to remove stale raw image %q: %w
- failed to replace original with raw image: %w
- failed to write raw digest file: %w
- failed to remove stale raw digest file %q: %w
AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01).
Data as JSON: /api/errors/a8c4e0238364723a.
Report an issue: GitHub.