lima-vm/lima · error

failed to delete disk %#q: %w

Error message

failed to delete disk %#q: %w

What it means

The final removal of the disk (deleteDisk: removing the disk directory and its contents) failed after all in-use checks passed. The store-level deletion error is wrapped with the disk name. Typical causes are filesystem-level problems rather than Lima logic.

Source

Thrown at cmd/limactl/disk.go:287

			}
			var refInstances []string
			for _, inst := range instances {
				for _, d := range inst.AdditionalDisks {
					if d.Name == diskName {
						refInstances = append(refInstances, inst.Name)
					}
				}
			}
			if len(refInstances) > 0 {
				logrus.Warnf("Skipping deleting disk %#q, disk is referenced by one or more non-running instances: %#q",
					diskName, refInstances)
				logrus.Warnf("To delete anyway, run %#q", forceDeleteCommand(diskName))
				continue
			}
		}

		if err := deleteDisk(disk); err != nil {
			return fmt.Errorf("failed to delete disk %#q: %w", diskName, err)
		}
		logrus.Infof("Deleted %#q (%#q)", diskName, disk.Dir)
	}
	return nil
}

func deleteDisk(disk *store.Disk) error {
	if err := os.RemoveAll(disk.Dir); err != nil {
		return fmt.Errorf("failed to remove %#q: %w", disk.Dir, err)
	}
	return nil
}

func forceDeleteCommand(diskName string) string {
	return fmt.Sprintf("limactl disk delete --force %v", diskName)
}

func newDiskUnlockCommand() *cobra.Command {

View on GitHub (pinned to dd909d0973)

Solutions

  1. Ensure no VM is running that used this disk (limactl list; stop instances)
  2. Fix ownership: sudo chown -R $(whoami) ~/.lima/disks/<name>, then retry
  3. Read the wrapped %w error; if permission denied, adjust permissions, if EBUSY, kill the holding process
  4. As a last resort remove ~/.lima/disks/<name> manually after confirming no process uses it

Example fix

// before
$ limactl disk delete data
// failed to delete disk "data": remove ...: permission denied
// after
$ sudo chown -R $(whoami) ~/.lima/disks/data
$ limactl disk delete data
Defensive patterns

Strategy: try-catch

Validate before calling

const { accessSync, constants } = require('fs')
try { accessSync(diskDirPath(name), constants.W_OK) } catch { throw new Error('no write permission on disk dir; fix chown first') }

Type guard

function isDeleteErr(err: unknown): boolean {
  return err instanceof Error && /failed to delete disk/.test(err.message)
}

Try / catch

try {
  await deleteDisk(name)
} catch (err) {
  if (isDeleteErr(err)) {
    console.error('Check for VM processes holding files and dir permissions:', err.cause ?? err)
  } else throw err
}

Prevention

When it happens

Trigger: `limactl disk delete <name>` where deleteDisk fails on os.RemoveAll of the disk dir — permission denied, files locked by a running VM process, or a partially missing directory.

Common situations: A VM process still holding files open in the disk dir; disk dir owned by root after a sudo run; disk on a network mount with stale handles.

Related errors


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