12 KiB
pfi-pve (Anaheim): Proxmox VE 8 → 9 upgrade
STATUS: DONE 2026-10-04 0715 — PVE 9.2.21 / kernel 7.0.14-20, post-check passed. Open: drop the root snapshot on/after 2026-10-05 (see Log).
Requested by Prime 2026-10-04 ~0550 ("drive the ana pve upgrade to proxmox 9"; "proceed" ~0600).
Siblings: docs/runbooks/esh-pve-cluster-pve9-upgrade-plan.md (esh-nas-pve, done 2026-10-03) and
nh3-pve (done 2026-10-03, playbooks/nh3-pve-pve9-postfix.yaml). Official guide:
pve.proxmox.com/wiki/Upgrade_from_8_to_9 (re-read 2026-10-04).
The host (read live 2026-10-04 0550-0610)
| HW | Dell PowerEdge R750xs, Xeon Silver 4310, 188 GB, BIOS 1.9.2; iDRAC9 6.10.30.00 at 10.250.250.30, Enterprise licence (virtual console) |
| PVE / kernel | 8.3.5 / 6.8.12-8, up 22 days (booted ~2026-09-11) |
| Cluster | single node (no corosync.conf) |
| Root | ext4 on LVM pve/root 65.6 G (31 G free), /boot is on root; VG pve 16 G free |
| Boot | UEFI, GRUB from \EFI\proxmox\grubx64.efi on the BOSS card (sdk2), but the grub-pc (BIOS) meta package was installed — the EFI binary and /boot/grub/x86_64-efi dated from the 2023-03-30 PVE 7.4 install. Secure Boot off |
| Network | vmbr0 = eno8303 + eno8403 (tg3) + eno12399np0 + eno12409np1 (bnxt_en), STP off, only eno8303 has carrier. Mgmt IP 10.250.250.31 is DHCP on vmbr0.250 (FortiGate lease, isc-dhcp-client) |
| Storage | ZFS ospool (every guest disk but pbs-ana's), ZFS NASPool raidz2 (rebuilt 2026-09-05), local-lvm thin (pbs-ana), local (19 G of ISOs) |
| Extras | No DKMS, no NVIDIA. Dell srvadmin-hapi + srvadmin-idracadm7 11.4 (local racadm) from a hand-installed .deb; Debian ceph-common 16.2 (client only) |
| Health | PSU1 has had no input power since 2026-09-11 23:31 (and repeatedly since 2026-04-23); running on PSU2 alone. Known and accepted (pfi-pve-naspool-rebuild.md). Not a blocker; a reboot does not change it |
| Backups | vzdump 03:00 all guests except 100/109/114 OK today; CT 109 22:00 OK last night |
Guests (all onboot=1): VMs 100 pbs-ana, 101 PFI-ANA-DC (Win), 102 ana-docker, 103 SlaveBot (Win),
104 Mongo, 105 Postgres, 106 corviduo-dev, 107 pteradactyl, 110 webhost, 111 tacticalrmm;
CTs 109 ana-nas (NFS, order 1), 112 ana-filebot, 113 ana-wg, 114 ana-scale (order 1).
What a pfi-pve reboot takes down — all of Anaheim, for ~15 min each time
- NH3 and ESH lose Anaheim entirely. CT 114 ana-scale is the only site-to-site path since the 2026-09-06 headscale cutover (IPsec dormant). That includes the iDRAC and the FortiGate's LAN side.
- ana-docker: the LiteLLM gateway (every agent's model calls, including Miranda/Hermes and SVOS,
whose
base_urlis10.250.50.70:4000— Miranda is deaf for the duration), Traefik public endpoints, gitea, vaultwarden, rest-server-ana, Langfuse, Beszel/Dozzle hubs, RustDesk. - pfi-postgres + Mongo, corviduo-dev (Worldtree demo/personal/pinned), PBS-ANA, TacticalRMM/MeshCentral, AD DC.
- Not affected: the post office (nh3-docker), nh3-dev, ESH and NH3 local services, fv-ml1.
Findings and what prep did about them (playbooks/pfi-pve-pve9-prep.yaml, no downtime)
- grub-pc on a UEFI, root-on-LVM box = the wiki's "UEFI systems with root on LVM may fail to boot".
Prep installs
grub-efi-amd64(removesgrub-pc) withforce_efi_extra_removable, so the ESP binary and the removable copy are rewritten and stay in step with/boot/grubfrom now on. Kept: tar of/etc,/boot/gruband the ESP in/root/pve9-prep-20261004/; the 2023 binary also atEFI/proxmox-2023/(last resort only — an old core loading new modules can fail). - NIC names pinned by MAC (
/etc/systemd/network/10-pin-*.link+ initramfs), all four ports. The bnxtnp0/np1suffix is the kind of name a new kernel changes; a renamed eno8303 = vmbr0 without carrier. - Latest 8.4 (8.4.21, kernel 6.8.12-43),
non-free-firmware+intel-microcode. systemd-boot was never installed. - Not changed: the DHCP mgmt address. The pre-reboot check asserts a DHCP client survives the upgrade.
Sequence
- Prep (no downtime). ✅ see Log.
- Reboot test on PVE 8 (~15 min outage). Validates the new GRUB, the pins, kernel -43 and microcode while
the box is still on 8 and
/bootstill matches a bookworm GRUB, so a failure there is a smaller fix. playbooks/pfi-pve-pve9-upgrade.yaml(guests stay up): guards, LVM snapshotpve/root-pre-pve9(15 G), trixie sources (deb822proxmox.sources), reads the dist-upgrade plan and refuses if it would remove a boot/network package, then a DETACHED dist-upgrade (/root/pve9-upgrade.log).playbooks/pfi-pve-pve9-prereboot.yaml: enterprise repo off; asserts EXIT 0, dpkg clean, PVE 9, initramfs has the pins + dm-snapshot, ESP rewritten + proxmox first in BootOrder, DHCP client present,ifreload -a -sparses, pve8to9.- Reboot (~15 min outage). Post-check: all 14 guests, ana-scale/mesh, NFS, PBS datastore, LiteLLM, gitea, vaultwarden, Worldtree ×3, container counts against the pre-reboot baseline.
- Drop the LVM snapshot once 9 is confirmed (it slows writes to
/while it exists).
Break-glass if a reboot does not come back (verified reachable 2026-10-04 0603)
Nothing in Anaheim answers from NH3 while ana-scale is down, so the way in is the FortiGate's WAN SSH
(the 2026-09-06 safety net: wan1 allowaccess ping ssh, infra-ops trusthost = NH3 70.230.226.88 + ESH):
SSHPASS=$(secret get fortigate/ana-gw-infra-ops-password) sshpass -e ssh infra-ops@38.120.12.42
execute ping 10.250.250.31 # host up? (0603: FortiGate→iDRAC 0.3 ms)
execute ping 10.250.50.45 # ana-scale up?
execute ping 10.250.250.30 # iDRAC
- Host up, ana-scale not: wait for CT 114 (order 1); if it stays down, start it via the iDRAC/host once reachable.
- Host not up: restore the old NH3↔ANA IPsec path (the documented un-dormant procedure,
docs/pfi/headscale-mesh-plan.md§ CUTOVER EXECUTED): on the FortiGateconfig router static / edit 20 / set status disable(the10.100.0.0/16 → 10.250.50.45mesh route; route 8 viapfi-ana-nh3then wins), and on the NH3 UDM enablepfi-nh3-anaand disable the10.250.0.0/16 → 10.100.50.46static route. Tunnel and mesh route must never be live for the same /16 at once. Then the iDRAC (Redfish credspfi-pve/idrac-infra-ops, verified 0601) gives power, SEL, one-time boot and screen capture; Prime can use the virtual console. Undo both edges in reverse once ana-scale is back.
Rollback
- After step 3, before or after the reboot:
lvconvert --merge pve/root-pre-pve9, reboot (the merge runs at activation; from a rescue ISO via iDRAC virtual media if 9 does not boot). Covers/and/boot, not the ESP: if GRUB on the ESP is the problem, boot the rescue ISO andgrub-installfrom the merged root. - Guest storage (ospool, NASPool, local-lvm) is not touched by the host upgrade. Never
zpool upgradeospool or NASPool after the upgrade until 9 has been kept.
Log (PT)
- 0550-0610 recon (read-only); plan written. Positive controls: iDRAC Redfish login OK 0601; FortiGate WAN SSH login OK 0603; FortiGate → iDRAC + ana-scale ping OK.
- 0601-0614 prep done (
pfi-pve-pve9-prep.yaml, elway overall CHANGED, 0 failed): PVE 8.4.21, kernel 6.8.12-43 installed (grub.cfg default), intel-microcode 3.20251111.1,grub-efi-amd642.06-13+pmx7 in /grub-pcout, ESPgrubx64.efirewritten 06:08 (md5 a4a8d8d1… → d9d0a989…, BOOTX64.EFI identical),/boot/grub/x86_64-efirefreshed, BootOrder 0003 (proxmox) first, four NIC pins in the -43 and -8 initramfs. pve8to9 --full: 0 FAIL, 1 WARN (running guests), NOTICE local-lvm autoactivation (local storage, left as is). No guest touched. - 0611:51 PVE 8 reboot test issued (FortiGate-side ping watcher running, independent of ana-scale). ana-docker
stopped answering 0614:20; ana-scale + ana-nas 0617:39; host DOWN 0617:58; host UP 0620:14 (R750xs POST ~2 min);
mesh back 0621:23; ana-docker 0624:22; all 14 guests running by ~0635. Passed: booted 6.8.12-43 via the new
GRUB, NIC names held,
.31by DHCP, microcode 0xd000410, pools healthy, no failed units on the host. Services: gitea/vaultwarden 200, PBS 200, ana-nas NFS active (ana-docker/mnt/backupremounted), Worldtree demo/personal 200 0635, pinned 0636. ana-docker 44/45 Up (missing onlybuildx_buildkit_worldtree-builder0, an on-demand buildx builder with no restart policy). ⚠ LiteLLM took until 0634:51 (container up 0627:56, then ~6.5 min inprismatoolchain prep +migrate deployunder boot-storm load, load avg 11): the gateway, and with it Miranda/Hermes, was out ~20 min, not ~10. Pre-existing, not ours: pfi-pteradactylapache2fails every boot (nginx owns :80) +systemd-journal-flushfailed. - 0637 upgrade playbook: (a first run went to a mistyped
10.250.50.31and died at elway's sudo probe, nothing executed). 0638 real run: pve8to9 0 FAIL; root snapshotpve/root-pre-pve915G; trixie sources; plan read = 770 installs, 53 removals (t64 library renames + python3-distutils/future/lib2to3; isc-dhcp-client, srvadmin stay); detached dist-upgrade started 0638 (pve9-dist-upgrade.service). Targets: pve-manager 9.2.21, kernel 7.0.14-20, GRUB 2.12-9+pmx2, ZFS 2.4.4 userland (⚠ nozpool upgrade), ceph-common 19.2.6, lxcfs 7.0. sshd restarted mid-upgrade (~0640, connection reset for a few seconds), as expected. - 0647 dist-upgrade EXIT 0 (770 packages; GRUB 2.12-9+pmx2 postinst: "Installing for x86_64-efi platform …
Installation finished. No error reported."). Pre-reboot check: two of my checks were wrong for PVE 9 and were
fixed, not waived: (1) the GRUB binary carries no greppable version string, so the postinst's own report is the
proof; (2) ifupdown2 3.3 flags PVE's own
bridge-fd 0as out of range andifreload -a -sexits 1 on that warning alone. Positive control: nh3-pve and esh-nas-pve (same ifupdown2 3.3.0-1+pmx12, same line) show the same warning and run vmbr0 fine (STP off, forward_delay 0). The check now fails on any OTHER ifupdown2 output (tested both ways). Re-run: 7/7 OK. Enterprise repo setEnabled: false. Snapshot COW 40% (≈6 G) after the upgrade. - 0648:56 PVE 9 reboot issued. ana-docker stopped answering 0650:32; mesh down 0653:51; host DOWN 0654:10; host UP 0656:45; mesh back 0657:52; all 14 guests running 0704 (boot storm: host load 37, ospool HDD read-IOPS-bound with a cold ARC); dockerd on ana-docker active 0708; LiteLLM 0711:25; Worldtree ×3 0712:55; OpenWebUI healthy 0715.
- Post-check PASSED (0715): pve-manager 9.2.21, kernel 7.0.14-20, booted via GRUB 2.12; NIC names held,
.31by DHCP, vmbr0 STP off; NASPool + ospool ONLINE (⚠ ZFS 2.4.4 now — do NOTzpool upgradeuntil 9 is kept); no failed host units; chrony synced; all 5 storages active incl. the pbs-ana datastore; pve8to9 0 FAIL / 0 WARN (NOTICE: local-lvm autoactivation, local storage, left). Gateway embed (dim 1024) +gen-smallchat OK; gitea/vaultwarden 200; PBS 200; TacticalRMM 200; pfi-postgres :5432, rest-server-ana :8000 open; ana-nas NFS active; ana-docker 44/45 Up (again only the on-demandbuildx_buildkit_worldtree-builder0); nag patch re-applied. - Outage actually paid, per reboot: NH3/ESH↔Anaheim ~4 min; host ~2.5 min; the LiteLLM gateway (and with it Miranda/Hermes/SVOS) ~20-21 min each time (0614-0635, 0650-0711), because ana-docker's dockerd and LiteLLM's prisma start are slow under the 14-guest boot storm on HDD-backed ospool.
- Open: drop
pve/root-pre-pve9(lvremove -y pve/root-pre-pve9) after ~24 h of clean running, i.e. on/after 2026-10-05; sooner iflvsData% passes 80 (a full thick snapshot only invalidates itself, origin unharmed).