abiosoft/colima · error

default storage pool recovery failure

Error message

default storage pool recovery failure

What it means

Post-recovery verification: colima lists storage pools filtered by name and compares the output to the expected pool name; a mismatch means 'incus admin recover' reported success but the default pool is still absent from incus's database. Recovery is treated as failed even though no low-level command errored.

Source

Thrown at environment/container/incus/incus.go:472

	log.Println("Running 'incus admin recover' ...")
	log.Println()
	log.Println(fmt.Sprintf("Found %d storage pool source(s):", len(disks)))
	for _, disk := range disks {
		log.Println("  " + poolDisksDir + "/" + disk)
	}
	log.Println()

	if err := c.guest.RunInteractive("sudo", "incus", "admin", "recover"); err != nil {
		return fmt.Errorf("error recovering storage pool: %w", err)
	}

	out, err := c.guest.RunOutput("sudo", "incus", "storage", "list", "name="+poolName, "-c", "n", "--format", "compact,noheader")
	if err != nil {
		return err
	}

	if out != poolName {
		return fmt.Errorf("default storage pool recovery failure")
	}

	return nil
}

func (c *incusRuntime) wipeDisk(size int) error {
	// prepare by deleting relevant files/directories
	deleteScript := strings.NewReplacer(
		"{disk_file}", poolDiskFile,
		"{meta_dir}", poolMetaDir,
	).Replace("sudo rm -rf {disk_file} {meta_dir}")

	if err := c.guest.RunQuiet("sh", "-c", deleteScript); err != nil {
		return fmt.Errorf("error preparing storage pools directory: %w", err)
	}

	// create new storage pool
	var diskSize = fmt.Sprintf("%dGiB", size)

View on GitHub (pinned to c3a5f9184d)

Solutions

  1. Check actual pools: 'colima ssh -- sudo incus storage list'
  2. If the pool exists under a different name, decide to keep or delete it, then retry start
  3. Discard and recreate: answer 'no' at the retry prompt so colima wipes the disk
  4. Report version-specific formatting differences to colima if pool exists yet detection fails
Defensive patterns

Strategy: validation

Validate before calling

// compare normalized output to survive formatting drift
out, err := c.guest.RunOutput("sudo", "incus", "storage", "list", "name="+poolName, "-c", "n", "--format", "compact,noheader")
if err != nil {
    return err
}
if strings.TrimSpace(out) != poolName {
    return fmt.Errorf("default storage pool recovery failure")
}

Try / catch

out, err := c.guest.RunOutput("sudo", "incus", "storage", "list", ...)
if err != nil {
    return err
}
if strings.TrimSpace(out) != poolName {
    // verify with an unfiltered listing before declaring failure
    full, _ := c.guest.RunOutput("sudo", "incus", "storage", "list", "--format", "json")
    return fmt.Errorf("default storage pool recovery failure (pools now: %s)", full)
}

Prevention

When it happens

Trigger: Output of 'incus storage list name=<pool> -c n --format compact,noheader' != poolName: pool created under a different name, output formatting changed (extra whitespace/headers) across incus versions, or recovery silently skipped the pool.

Common situations: Guest incus version formats 'compact,noheader' differently than colima expects, pool recovered under a renamed entry, partially migrated old disk layout.

Related errors


AI-assisted analysis of abiosoft/colima@c3a5f9184d (2026-08-15). Data as JSON: /api/errors/f1bf6ef76b8b07db. Report an issue: GitHub.