From cf2d2d31b7633f88b4d21c6ea5fa844a2c476a95 Mon Sep 17 00:00:00 2001 From: ansible Date: Tue, 7 Apr 2026 16:07:24 +0000 Subject: [PATCH] Always clean stale taps before creating new ones deleteTap before createTap in all four call sites: snapshot restore, cold boot, agent start, snapshot create. Prevents "Device or resource busy" from leftover taps. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/agent-manager.ts | 1 + src/snapshot.ts | 1 + src/vm.ts | 2 ++ 3 files changed, 4 insertions(+) diff --git a/src/agent-manager.ts b/src/agent-manager.ts index c938890..0593d44 100644 --- a/src/agent-manager.ts +++ b/src/agent-manager.ts @@ -268,6 +268,7 @@ export async function startAgent( // Setup network ensureBridge(); ensureNat(); + deleteTap(tapDevice); // clean stale tap from previous run createTap(tapDevice); // Boot VM diff --git a/src/snapshot.ts b/src/snapshot.ts index 2069a2d..b1d751b 100644 --- a/src/snapshot.ts +++ b/src/snapshot.ts @@ -63,6 +63,7 @@ export async function createSnapshot() { log("Setting up network..."); ensureBridge(); ensureNat(); + deleteTap(snap.tapDevice); // clean stale tap from previous run createTap(snap.tapDevice); let proc: ChildProcess | null = null; diff --git a/src/vm.ts b/src/vm.ts index b917197..1946a22 100644 --- a/src/vm.ts +++ b/src/vm.ts @@ -78,6 +78,7 @@ export class VMInstance { log(verbose, `VM ${id}: restoring from snapshot...`); ensureBridge(); ensureNat(); + deleteTap(snap.tapDevice); // clean stale tap from previous run createTap(snap.tapDevice); // Spawn firecracker and load snapshot @@ -155,6 +156,7 @@ export class VMInstance { log(verbose, `VM ${id}: creating tap ${tapDevice}...`); ensureBridge(); ensureNat(); + deleteTap(tapDevice); // clean stale tap from previous run createTap(tapDevice); log(verbose, `VM ${id}: booting...`);