Proxmox VEXXII · Operating as a Business ServiceBusiness of the platform
Change classification and approval
What you'll learn
- Classify a Proxmox change by blast radius, reversibility and detectability rather than by intuition
- Place a change into standard, normal or emergency and know what each entitles it to
- Name the Proxmox operations that cannot be reversed, and treat them accordingly
- Write a change record an approver can act on, including a backout that has been tested
Prerequisites
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
Change management has a poor reputation among engineers, mostly deserved. It is frequently a form that adds three days to a ten-minute task and is approved by somebody who could not evaluate it.
That is a criticism of bad change management, and the answer is not to abandon it. The overwhelming majority of self-inflicted Proxmox outages were approved changes — approved because the record said “add a firewall rule” and nobody asked which chain, on which level, and whether the person running it would still be able to reach the node afterwards.
The purpose of classification is to route each change to the amount of scrutiny it actually needs. Get the classification right and most changes get almost none, which is what makes the process survivable.
Classify by three properties, not by intuition
“Risky” is not a property of a change. These three are, and they can each be answered in a sentence.
Blast radius — how far can this reach if it goes wrong?
| Radius | Examples on a Proxmox cluster |
|---|---|
| One guest | Resize a disk, change a guest firewall rule, add a NIC, snapshot |
| One node | Kernel update, NIC driver change, node firewall rule, local storage change |
| All guests on one node | Anything requiring a node reboot; a network change on the node |
| The whole cluster | corosync.conf, datacenter.cfg, shared storage definitions, HA rules, cluster firewall, pveum roles, certificate changes |
| The data | Ceph pool parameters, ZFS pool geometry, storage removal, retention policy |
The line that catches people is between the third and fourth rows. A change
made on one node to a file inside /etc/pve is a cluster-wide change,
because /etc/pve is replicated. Editing the datacenter firewall on pve-01
applies it to pve-03 before you have finished reading it back.
Reversibility — can you undo it, and how fast?
| Class | Meaning | Example |
|---|---|---|
| Trivially reversible | One command, seconds, no data implication | Guest firewall rule, qm set --description |
| Reversible with disruption | Undo requires a restart or migration | Kernel pin and reboot, machine-version change |
| Reversible with effort | Restore from backup, rebuild | Node reinstall, storage reconfiguration |
| Irreversible | No path back at all | See the list below |
Detectability — how quickly will you know it went wrong?
| Class | Meaning | Example |
|---|---|---|
| Immediate | Fails visibly within seconds | A guest that will not start |
| Same session | Visible during verification | A migration that fails |
| Delayed | Surfaces hours or days later | A backup job that now silently skips a guest |
| Latent | Surfaces only under failure | A corosync change that works fine until a link drops; a min_size change that only matters when an OSD dies |
The changes that cannot be undone
Every platform has a list. This is Proxmox’s, and it is worth knowing by heart because these are the ones where “we can always roll it back” is false.
| Operation | Why there is no way back |
|---|---|
volblocksize on a zvol | Set at creation only. Changing it means creating a new zvol and copying the data |
| Removing a vdev from a RAIDZ pool | Not supported. The pool must be destroyed and rebuilt |
Reducing a Ceph pool’s size | The extra replicas are deleted immediately. Raising it back rebuilds from what remains, which is now fewer copies than you had |
pvecm delnode on a node you want back | The node must be reinstalled; rejoining a previously removed node with its old identity is not supported |
Destroying a guest with --purge | Removes the configuration, the disks, and the backup job and replication references |
| Removing a storage that still holds content | The definition goes; whether the data goes depends on the backend, and you will find out afterwards |
| Reducing a filesystem inside a guest without shrinking the disk first | Ordering error, not a Proxmox one, and it is the classic route to an unbootable guest |
Deleting a pveum role that ACLs reference | The ACL entries are dropped, not preserved. Recreating the role does not restore them |
| Pruning a PBS backup group | Snapshots are gone. Retention protects you only until somebody runs a prune with different parameters |
The three classes, and what each entitles you to
| Class | Definition | Approval | Scheduling |
|---|---|---|---|
| Standard | Pre-approved, repeatedly executed, documented procedure, well-understood outcome | None per instance — the procedure was approved once | Any time |
| Normal | Everything else that is planned | Approval before scheduling | In an agreed window |
| Emergency | Required to restore service or remediate an active threat | Retrospective, with a named authoriser at the time | Immediately |
What qualifies as standard on a Proxmox cluster
A change is standard when it satisfies all of: blast radius of one guest or smaller, trivially reversible, immediate detectability, and a written procedure that has been executed successfully at least a handful of times.
Realistic standard changes:
- Create a guest from an approved template
- Extend a guest disk (extending, never shrinking)
- Add or remove a guest firewall rule from an approved rule set
- Take or delete a guest snapshot
- Start, stop or reboot a guest inside its own maintenance window
- Live-migrate a guest between nodes on shared storage
- Add a guest to an existing backup job
The point of the standard class is that these should be fast. If your process makes creating a VM from a template take two days, engineers will route around the process, and then you will have no change record for anything.
Normal changes, with their real classification
| Change | Blast radius | Reversibility | Detectability | Handling |
|---|---|---|---|---|
| Node kernel or microcode update | All guests on the node | Reversible — kernel pin to the previous version | Immediate at boot, delayed for driver regressions | Rolling, one node, verify before the next |
| Add a node to the cluster | Cluster | Reversible with effort | Immediate | Normal, in a window |
| Add or change a storage definition | Cluster | Reversible | Delayed — failures show at the next backup or migration | Normal, verify by exercising it |
| Change datacenter firewall rules | Cluster | Reversible, if you still have access | Immediate, possibly to your own session | Normal, with console access confirmed first |
Change corosync.conf | Cluster, and quorum | Reversible with effort | Latent | High-risk normal, tested by inducing failure |
| PVE minor version upgrade | Rolling, per node | Reversible with effort | Mixed | Normal, one node first, soak, then the rest |
| PVE major version upgrade | Cluster | Reversible only by restore | Mixed | High-risk normal — own window, own plan |
| Ceph release upgrade | The data | Effectively irreversible once OSDs are converted | Delayed | High-risk normal |
Change Ceph pool size or min_size | The data | Reducing size is irreversible | Latent | High-risk normal, and reducing needs an explicit data-loss review |
Certificate replacement on pveproxy | Cluster access | Reversible | Immediate | Normal, but hold a shell open |
What the approver actually needs
Most change records answer “what are you doing”. An approver cannot evaluate risk from that. Six questions, and a record that answers them can be approved in two minutes.
| Question | What a bad answer looks like | What a usable answer looks like |
|---|---|---|
| What changes, exactly? | “Update the firewall” | “Add one rule to the datacenter security group mgmt-in, permitting TCP 8006 from 192.0.2.0/24. No other rule modified” |
| On which hosts? | “The cluster” | “Datacenter level, therefore all 5 nodes simultaneously” |
| Who is affected if it goes wrong? | “Nobody, it is low risk” | “All GUI and API access from outside the management network. Guests unaffected. 3 automation systems use the API from that range” |
| How will you know within 5 minutes? | “We will check it works” | “From an external host: curl the API on each node, expect 200. From inside: confirm the 3 automation systems still poll successfully” |
| How do you undo it, and has that been run? | “Revert the change” | “pvesh delete the rule, tested in the lab cluster on 2026-08-05. Console open on all 5 nodes throughout” |
| What if the backout fails? | (usually blank) | “Console access to each node; the firewall can be disabled locally with pve-firewall stop, which is node-local and does not need the cluster” |
The fifth and sixth questions are the ones that separate a real record from a ceremonial one, and the sixth is nearly always blank. It is also the one that matters most, because the incidents that become long incidents are the ones where the backout did not work.
set -euo pipefail
CHANGE=CHG-2026-0412
OUT="/root/change-evidence/$CHANGE"
mkdir -p "$OUT"
# Cluster state before.
pvecm status > "$OUT/pvecm-status.txt"
pvesm status > "$OUT/pvesm-status.txt"
ha-manager status > "$OUT/ha-status.txt"
pveversion -v > "$OUT/pveversion.txt"
# Guest inventory and run state.
qm list > "$OUT/qm-list.txt"
pct list > "$OUT/pct-list.txt"
# The cluster configuration itself. This is the artefact a backout needs.
tar czf "$OUT/etc-pve.tar.gz" -C /etc pve
# Storage-specific state, where applicable.
ceph -s > "$OUT/ceph-status.txt" 2>/dev/null || true
zpool status > "$OUT/zpool-status.txt" 2>/dev/null || true
# Copy it OFF the cluster before making the change.
echo "evidence in $OUT - copy it off-cluster now"Post-implementation review, in five minutes
Not a ceremony. Five questions, written into the change record when it is closed, and reviewed in bulk once a quarter:
- Did it do what it was supposed to? Yes, partially, no.
- Did the verification actually verify? Would it have caught a failure, or was it “it looked fine”?
- Was the classification right? In hindsight, was the blast radius larger than assessed?
- Did anything unexpected happen? Including things that turned out harmless.
- Should this become a standard change? After the third or fourth uneventful execution of the same normal change, promoting it is what keeps the process from becoming overhead.
Question 5 is the one that makes the whole system sustainable. A change process that only ever adds scrutiny becomes a tax; one that promotes proven procedures into the standard class gets faster over time, and that is what keeps engineers using it.
Common mistakes
- Classifying by how hard the change feels, rather than by blast radius, reversibility and detectability.
- Forgetting that
/etc/pveis cluster-wide. A change made on one node is a change made everywhere. - Never assessing detectability, so latent failures are approved as low-risk.
- A backout plan that has never been executed.
- No answer to “what if the backout fails”.
- Making an access-affecting change without a console already open.
- Rolling changes with no soak, so the first backup on the new version runs after every node is committed.
- Emergency drift, and treating the resulting rate as a discipline problem.
- Never promoting proven changes to standard, so the process becomes a tax and gets bypassed.
Key takeaways
- Classify on blast radius, reversibility and detectability. Latent detectability is the property that is never assessed and matters most.
- Anything written into
/etc/pvehas cluster-wide blast radius regardless of which node you typed it on. - Know the irreversible list. For those changes the backout is a restore, and the restore must have been tested.
- Standard changes must be genuinely fast, or the process gets bypassed.
- The approver needs six answers, and the two usually missing are “has the backout been run” and “what if it fails”.
- Soak a rolling change for at least one full backup cycle.
- A high emergency rate is a process-design signal, not a discipline problem.
Knowledge check
Knowledge check · 5 questions
Q1. An engineer proposes adding a rule to the datacenter-level firewall on one node of a five-node cluster. What is the blast radius?
Q2. Which of these Proxmox operations are effectively irreversible? Select all that apply.
Q3. A change whose failure mode only appears during a subsequent failure has to be tested by inducing that failure, because verifying it immediately afterwards cannot distinguish success from the failure mode.
Q4. A cluster reports that 40% of its changes over the last quarter went through the emergency path. What does this most likely indicate?
Q5. Why should a rolling cluster upgrade soak on the first node for at least one full backup cycle before proceeding?
Passing score: 75%. Answers are checked in this browser.