VM-Guest-Agent Self-Update kaputt: CTs laufen in qemu-Fallback (config does not exist) + Gast lädt Binary vom unerreichbaren Backend statt vom Node-Agent (9101) + FreeBSD curl/wget #52

Closed
opened 2026-06-02 12:45:47 +00:00 by chinux · 0 comments
Owner

Symptom

VM-Guest-Agent-Self-Update schlägt fehl — zwei verschiedene Fehlerpfade:

CTs (108/109/112):

VM 109: ✗ Configuration file 'nodes/vbmi-prox01/qemu-server/109.conf' does not exist

FreeBSD (VM 100):

VM 100: ✗ /bin/sh: curl: not found
fetch: http://172.16.1.14:8765/vm-agent-binary/x86_64: Operation timed out
/bin/sh: wget: not found

Root Cause (alles im Node-Agent)

Ablauf: vm.self_update_allupdate_one (Node-Agent/src/vm_self_update.rs). TCP-Relay vm.self_update an den Gast; sonst qemu_fallback.

  1. CTs → qemu_fallback: Wenn latest_version leer ist oder kein Reconnect in 25 s kommt, läuft update_one in qemu_fallback, der qm::qm_agent_osinfo/qm_agent_exec nutzt → Pfad /nodes/<node>/**qemu**/<vmid>/.... Für einen LXC existiert das nicht → „qemu-server/.conf does not exist". qemu_fallback ist CT-unaware.
  2. Gast lädt vom Backend statt vom Node-Agent (#49): send_fire_and_forget übergibt als server_url die Backend-HTTP-Base (http_base, 172.16.1.14:8765). Isolierte Gäste (z. B. pfSense/FreeBSD) haben keine Route dorthin → fetch Timeout. Dabei serviert der Node-Agent Binaries selbst auf Port 9101 (vm_binaries.rs, HTTP_PORT=9101) — und den erreicht der Gast (er ist ja auf 9100 mit ihm verbunden).
  3. FreeBSD-Downloader: Self-Update-Script probiert curl/wget (gibt's auf FreeBSD-Base nicht) — nur fetch ist vorhanden.

Fix

1. Binary vom Node-Agent servieren, nicht vom Backend (#49 revidieren)

send_fire_and_forget/update_one als server_url die eigene 9101-Base des Node-Agents übergeben (die Adresse, über die der Gast den Agent ohnehin erreicht), nicht http_base (Backend). Der 9101-Cache wird ja bereits per spawn_refresh_loop vom Backend befüllt. → behebt den FreeBSD-Timeout und ist robust für alle isolierten Gäste.

2. qemu_fallback CT-aware machen

Vor dem qemu-Pfad prüfen, ob vmid ein LXC ist (proxmox::get_cts() enthält ihn / pct config erfolgreich). Wenn CT → Update via pct exec <vmid> -- sh -c "…" (Kanal 1) statt qm_agent_exec. Für LXC nie den qemu-Pfad. (Gemeinsamer is_ct(vmid)-Helper mit #51 sinnvoll — gleiche Wurzel.)

3. FreeBSD-Downloader

Im FreeBSD-Self-Update-Pfad fetch -o <ziel> <url> verwenden (curl/wget nicht voraussetzen); Reihenfolge z. B. command -v fetch && fetch … vor curl/wget.

4. latest_version prüfen

Wenn _read_vm_agent_latest_version() leer zurückgibt, läuft alles in den Fallback (siehe #28-Umfeld). Sicherstellen, dass die Version sauber ermittelt wird, damit der TCP-Pfad verifizieren kann und CTs gar nicht erst in den qemu-Fallback müssen.

Akzeptanz

  • CT-Agents (108/109/112) updaten ohne „config does not exist".
  • FreeBSD/pfSense-Agent (VM 100) lädt die Binary vom Node-Agent (9101) per fetch — kein Timeout, kein curl/wget-Fehler.
  • VM-Agent-Update (Linux) unverändert funktionsfähig.
  • cargo build grün (FreeBSD-Target mit beachten).

Bezug

Teilt die CT-/qemu-Pfad-Wurzel mit #51 (dort Paket-Update, hier Agent-Self-Update) — gemeinsamer is_ct/pct-exec-Helper.

Branch

fix/vm-agent-self-update-ct-and-binary-source

## Symptom VM-Guest-Agent-**Self-Update** schlägt fehl — zwei verschiedene Fehlerpfade: **CTs (108/109/112):** ``` VM 109: ✗ Configuration file 'nodes/vbmi-prox01/qemu-server/109.conf' does not exist ``` **FreeBSD (VM 100):** ``` VM 100: ✗ /bin/sh: curl: not found fetch: http://172.16.1.14:8765/vm-agent-binary/x86_64: Operation timed out /bin/sh: wget: not found ``` ## Root Cause (alles im Node-Agent) Ablauf: `vm.self_update_all` → `update_one` (`Node-Agent/src/vm_self_update.rs`). TCP-Relay `vm.self_update` an den Gast; sonst `qemu_fallback`. 1. **CTs → `qemu_fallback`:** Wenn `latest_version` leer ist oder kein Reconnect in 25 s kommt, läuft `update_one` in `qemu_fallback`, der `qm::qm_agent_osinfo`/`qm_agent_exec` nutzt → Pfad `/nodes/<node>/**qemu**/<vmid>/...`. Für einen LXC existiert das nicht → *„qemu-server/<id>.conf does not exist"*. `qemu_fallback` ist **CT-unaware**. 2. **Gast lädt vom Backend statt vom Node-Agent (#49):** `send_fire_and_forget` übergibt als `server_url` die **Backend**-HTTP-Base (`http_base`, 172.16.1.14:8765). Isolierte Gäste (z. B. pfSense/FreeBSD) haben **keine Route** dorthin → `fetch` Timeout. Dabei serviert der Node-Agent Binaries **selbst auf Port 9101** (`vm_binaries.rs`, `HTTP_PORT=9101`) — und den erreicht der Gast (er ist ja auf 9100 mit ihm verbunden). 3. **FreeBSD-Downloader:** Self-Update-Script probiert `curl`/`wget` (gibt's auf FreeBSD-Base nicht) — nur `fetch` ist vorhanden. ## Fix ### 1. Binary vom Node-Agent servieren, nicht vom Backend (#49 revidieren) `send_fire_and_forget`/`update_one` als `server_url` die **eigene 9101-Base des Node-Agents** übergeben (die Adresse, über die der Gast den Agent ohnehin erreicht), nicht `http_base` (Backend). Der 9101-Cache wird ja bereits per `spawn_refresh_loop` vom Backend befüllt. → behebt den FreeBSD-Timeout und ist robust für alle isolierten Gäste. ### 2. `qemu_fallback` CT-aware machen Vor dem qemu-Pfad prüfen, ob `vmid` ein LXC ist (`proxmox::get_cts()` enthält ihn / `pct config` erfolgreich). Wenn CT → Update via `pct exec <vmid> -- sh -c "…"` (Kanal 1) statt `qm_agent_exec`. Für LXC **nie** den qemu-Pfad. (Gemeinsamer `is_ct(vmid)`-Helper mit #51 sinnvoll — gleiche Wurzel.) ### 3. FreeBSD-Downloader Im FreeBSD-Self-Update-Pfad `fetch -o <ziel> <url>` verwenden (curl/wget nicht voraussetzen); Reihenfolge z. B. `command -v fetch && fetch …` vor curl/wget. ### 4. `latest_version` prüfen Wenn `_read_vm_agent_latest_version()` leer zurückgibt, läuft **alles** in den Fallback (siehe #28-Umfeld). Sicherstellen, dass die Version sauber ermittelt wird, damit der TCP-Pfad verifizieren kann und CTs gar nicht erst in den qemu-Fallback müssen. ## Akzeptanz - CT-Agents (108/109/112) updaten ohne „config does not exist". - FreeBSD/pfSense-Agent (VM 100) lädt die Binary vom Node-Agent (9101) per `fetch` — kein Timeout, kein curl/wget-Fehler. - VM-Agent-Update (Linux) unverändert funktionsfähig. - `cargo build` grün (FreeBSD-Target mit beachten). ## Bezug Teilt die CT-/qemu-Pfad-Wurzel mit #51 (dort Paket-Update, hier Agent-Self-Update) — gemeinsamer `is_ct`/pct-exec-Helper. ## Branch `fix/vm-agent-self-update-ct-and-binary-source`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#52
No description provided.