Skip to main content
RunBook Academy

Proxmox VEVIII · CephCeph lifecycle

Upgrading Ceph: Squid to Tentacle

Expert⏱ ~28 mincephapt

What you'll learn

  • Explain why the MON, MGR, OSD, MDS restart order is not negotiable
  • Run the upgrade one node at a time with the correct verification between steps
  • Describe what `noout` prevents and what it does not
  • State honestly what rollback is available at each stage, and where it stops

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

Not yet marked complete on this device.

Ceph major upgrades are unusual among Proxmox maintenance tasks in two ways. They are online — the cluster keeps serving I/O throughout, and no guest needs to be shut down. And they are irreversible — there is no supported downgrade at any stage, and after one specific command there is not even an unsupported one.

Those two facts together produce the characteristic mistake. Because nothing has to be shut down, the upgrade feels low-risk, so it gets scheduled loosely and run quickly. Because it cannot be undone, a mistake made quickly is a mistake you now operate around.

pveceph install defaults to --version tentacle in PVE 9.2, so Tentacle is what a new cluster gets and Squid is the explicit choice. Existing Squid clusters keep running Squid until somebody upgrades them, which is what this lesson covers.

Before you start

The Proxmox wiki states the entry conditions, and they are conditions rather than recommendations:

  • Every node on Proxmox VE 9.1 or newer, with pve-manager at 9.1.4 or newer.
  • Ceph on Squid, at 19.2.3-pve3 or newer.
  • “The cluster must be healthy and working!”
Read-only / Safethe pre-flight, run on every node
pveversion -v | head -3
ceph -s
ceph versions
ceph health detail
Read-only / Safe
$ ceph versions
{
  "mon": { "ceph version 19.2.3 (squid) stable": 3 },
  "mgr": { "ceph version 19.2.3 (squid) stable": 3 },
  "osd": { "ceph version 19.2.3 (squid) stable": 12 },
  "mds": { "ceph version 19.2.3 (squid) stable": 2 },
  "overall": { "ceph version 19.2.3 (squid) stable": 20 }
}

Illustrative output

Set noout, and know exactly what it buys

Cluster-wide riskstop the cluster reacting to planned restarts
ceph osd set noout
ceph -s | grep -A2 'health:'

The distinction between down and out is the whole point of the flag, and it is worth being precise about:

down means the monitors have stopped hearing from an OSD. It happens the moment you restart the daemon, noout or not. Placement groups on it become degraded and are served from their other copies.

out means the OSD is removed from the CRUSH data placement calculation, so every placement group it held is re-created elsewhere. That is a full rebalance — potentially terabytes of movement across the cluster network.

Without noout, the trigger is time: mon_osd_down_out_interval defaults to “10 minutes”. An OSD restart that completes in ninety seconds never reaches it. An OSD restart on a node that hangs on a firmware prompt, or a node that reboots into a broken initramfs, does — and now you are debugging a boot problem while the cluster moves several terabytes it did not need to move.

noout costs nothing and removes that entire class of outcome. It also means that if a disk genuinely dies mid-upgrade, Ceph will not self-heal, so leaving the flag set after the window is its own hazard — which is why unsetting it is a step in the procedure rather than an afterthought.

The upgrade, in order

1. Repository

PVE 9 is Debian 13 (Trixie) and uses deb822 .sources files. Older .list files still work if a node has them.

Configuration changepoint the Ceph repository at Tentacle, on every node
if [ -f /etc/apt/sources.list.d/ceph.sources ]; then
cp /etc/apt/sources.list.d/ceph.sources /root/ceph.sources.bak
sed -i 's/squid/tentacle/' /etc/apt/sources.list.d/ceph.sources
elif [ -f /etc/apt/sources.list.d/ceph.list ]; then
cp /etc/apt/sources.list.d/ceph.list /root/ceph.list.bak
sed -i 's/squid/tentacle/' /etc/apt/sources.list.d/ceph.list
fi

grep -r tentacle /etc/apt/sources.list.d/

The resulting deb822 stanza is:

Types: deb
URIs: https://enterprise.proxmox.com/debian/ceph-tentacle
Suites: trixie
Components: enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

or, in the legacy format:

deb https://enterprise.proxmox.com/debian/ceph-tentacle trixie enterprise

Substitute no-subscription for enterprise in both the URI component and the Components: line if that is the repository you are entitled to.

2. Install the packages, everywhere

Service impact possibleon every node
apt update
apt full-upgrade

3. Monitors, one node at a time

Service impact possiblerestart monitors and confirm the release before moving on
systemctl restart ceph-mon.target

sleep 15
ceph -s | grep -E 'mon:|quorum'
ceph mon dump | grep min_mon_release

The wiki names the expected result: min_mon_release 20 (tentacle). That value advances only once every monitor has been restarted, so it is the clean signal that this stage is complete.

4. Managers

Service impact possiblerestart managers
systemctl restart ceph-mgr.target

sleep 10
ceph -s | grep -A1 'mgr:'

5. OSDs, one node at a time, with a wait between nodes

This is the long stage and the one where haste costs you.

Service impact possiblerestart every OSD on one node, then wait for clean
systemctl restart ceph-osd.target

# wait until no PG is in a recovering or degraded state before the next node
while ceph pg stat | grep -qE 'degraded|undersized|peering|recovering|backfill'; do
sleep 10
done

ceph -s
ceph pg dump_stuck unclean
Read-only / Safe
$ ceph pg stat
417 pgs: 417 active+clean; 4.1 TiB data, 12 TiB used, 21 TiB / 33 TiB avail

Illustrative output

The waiting is not superstition. Each node’s OSDs coming back triggers peering and a short recovery of writes that happened while they were down. Restarting the next node during that recovery stacks two degraded windows, and on a size 3 pool the second one can take placement groups to one copy.

6. Metadata servers, if you run CephFS

MDS upgrades have their own choreography because standby-replay daemons follow the active one’s journal, and a version mismatch there is not tolerated. The wiki procedure is:

  1. Disable standby-replay and reduce the filesystem to a single rank.
  2. Stop the standby MDS daemons: systemctl stop ceph-mds.target.
  3. Restart the active MDS: systemctl restart ceph-mds.target.
  4. Start the standbys again: systemctl start ceph-mds.target.
  5. Restore the original max_mds and standby-replay settings.

CephFS is briefly single-ranked through this, which for a Proxmox cluster using CephFS to hold ISOs and backups is unremarkable and for a CephFS serving an application is a capacity reduction to plan for.

7. The point of no return

Cluster-wide riskenable Tentacle-only features
ceph versions
ceph -s

ceph osd require-osd-release tentacle

This command tells the cluster it may use on-disk and on-wire features that older OSDs do not implement. It is the last step for a reason: an OSD that has not been upgraded, or one you later restore from an old node image, will be refused.

Everything before it is reversible in principle — you could reinstall Squid packages on a node and restart its daemons, and the cluster would tolerate the mixed versions because it is designed to during an upgrade window. Everything after it is not.

8. Clear the flag

Cluster-wide riskre-enable automatic recovery
ceph osd unset noout
ceph -s
ceph osd stat

Verifying the upgrade actually finished

Read-only / Safethe closing checks
ceph versions
ceph -s
ceph mon dump | grep min_mon_release
ceph osd dump | grep require_osd_release
ceph osd stat

The one that catches the common miss is ceph versions. A node that was powered off during the window, or an OSD whose systemctl restart was issued while the unit was masked, will still be on Squid — and it will work, because mixed versions are tolerated, right up until require-osd-release is set and it is refused on its next restart.

Check ceph versions before step 7, not after.

Common mistakes

  • Starting on HEALTH_WARN. Every OSD restart drops replication by one; starting from degraded can take a pool below min_size.
  • Not setting noout. A node that takes longer than ten minutes to come back triggers a full rebalance you did not need.
  • Leaving noout set afterwards. The cluster stops self-healing from real disk failures, silently.
  • Restarting two monitors at once. With three monitors that is quorum loss, and the cluster stops serving I/O.
  • Moving to the next OSD node before active+clean. Two overlapping degraded windows on a size 3 pool can reach one copy.
  • Running require-osd-release before checking ceph versions. A missed node becomes an OSD that can never rejoin.
  • Accepting apt full-upgrade without reading the package list. It upgrades PVE and the kernel too.
  • Writing “roll back if issues” in the change record. After step 7 there is no rollback, and the change record should say so.

Key takeaways

  • Entry conditions are conditions: PVE 9.1+, pve-manager 9.1.4+, Ceph 19.2.3-pve3+, and a healthy cluster.
  • noout prevents out, not down. It stops a slow restart from triggering a full rebalance, and it must be cleared afterwards.
  • Order is MON → MGR → OSD → MDS, because the monitors own the cluster maps that everything else reads.
  • Install packages everywhere first; nothing changes until a restart.
  • Wait for active+clean between OSD nodes. min_mon_release 20 (tentacle) confirms the monitor stage.
  • ceph osd require-osd-release tentacle is the point of no return. Verify ceph versions first.
  • There is no supported downgrade at any stage, and none at all after step 7. Plan a stopping point instead of a rollback.

Knowledge check

Knowledge check · 4 questions

  1. Q1. During the OSD stage you restart ceph-osd.target on node 3. A firmware prompt holds the node at the console for 25 minutes. noout was never set. What has happened by the time you notice?

  2. Q2. Why must the monitors be restarted onto the new version before the OSDs, rather than the other way around?

  3. Q3. Which of these are true about rollback during a Squid to Tentacle upgrade? Select all that apply.

  4. Q4. Leaving the noout flag set after the upgrade completes is harmless, since it only prevents unnecessary rebalancing.

Passing score: 75%. Answers are checked in this browser.