Ceph Reef to Squid
Manual cluster, distro packages via Ubuntu Cloud Archive, no cephadm — the
deployment style the official docs have quietly abandoned. Almost everything
written about this upgrade assumes cephadm; this is the other path. The
estate's Ceph had walked this path before — jewel to luminous, by hand,
in 2017.
Versions in play:
- from: Reef (
https://download.ceph.com/debian-reef) - to: Squid
19.2.3-0ubuntu0.24.04.2~cloud0(UCA, Ubuntu 24.04)
The one usable reference found online was the Proxmox wiki: https://pve.proxmox.com/wiki/Ceph_Reef_to_Squid. Cluster runs CephFS, hence the MDS dance at the end.
These are reconstructed notes, not a transcript. Read before pasting.
Preparation
Stop OSDs from being marked out while hosts restart:
ceph osd set noout
Purge leftovers from the cephadm era (I never cephadm'ed this cluster, but the package was present):
apt purge cephadm
If OSD-only hosts still have MDS packages installed, remove ceph-mds there
only.
Comment out non-distro ceph sources — one sed, no mercy:
sed -i -E '/^[[:space:]]*#/!{/^[[:space:]]*$/!s/^([[:space:]]*)/\1# /}' /etc/apt/sources.list.d/ceph.*
Backup. Dated directory, full copies — cheap insurance, you will not need it right up until you do:
dir='20260831'; mkdir "${dir}"
cp -r -p /var/lib/ceph "${dir}"/
cp -r -p /etc "${dir}"/
Install:
apt update
NEEDRESTARTMODE=l apt-get -y install ceph ceph-fuse
(NEEDRESTART_MODE=l keeps needrestart from interrupting with interactive
service-restart prompts.)
Bug 1: apt offers Ceph 17
After commenting the upstream sources, apt still wanted to install an ancient Ceph 17. Two leftovers:
# stale source file
rm -f /etc/apt/sources.list.d/ceph.sources
# OpenStack-Ansible-style pin file pinning src:ceph
sed -i '/src:ceph/,+2d' /etc/apt/preferences.d/openstack_hosts_pin.pref
Verify before trusting:
apt update
apt-cache policy ceph-base
Bug 2: radosgw dpkg error
Errors were encountered while processing:
/tmp/apt-dpkg-install-*/10-radosgw_19.2.3-*_amd64.deb
Fix:
apt-get -o Dpkg::Options::="--force-overwrite" -f install ceph radosgw ceph-osd
Monitors, then managers
systemctl restart ceph-mon.target
ceph mon dump | grep min_mon_release
Expect min_mon_release 19 (squid).
systemctl restart ceph-mgr.target
Bug 3: Module 'xmltodict' is not installed on one node
One mgr node failed after restart, the others were fine:
ceph-mgr[...]: ERROR:root:Module 'xmltodict' is not installed.
Dashboard module wants it. Dashboard is not used on this cluster, so:
apt-get remove ceph-mgr-dashboard
If you actually use the dashboard, this is the wrong fix for you — find a way to feed the module its python package instead.
Confirm the monmap:
ceph mon dump | grep min_mon_release
# min_mon_release 19 (squid)
OSDs
ceph osd require-osd-release squid
systemctl restart ceph-osd.target
ceph status
MDS: the standby-replay dance
With CephFS, the sequence from the release notes applies:
Disable standby replay first:
ceph fs get cephfs | grep -o allow_standby_replay
ceph fs set cephfs allow_standby_replay false
Collapse ranks to 1:
ceph fs get cephfs | grep max_mds
# max_mds 2
ceph fs set cephfs max_mds 1
Take all standby MDS daemons offline, restart the active one, then bring the standbys back:
systemctl stop ceph-mds.target
ceph status
systemctl restart ceph-mds.target
systemctl start ceph-mds.target
Restore the rank count (and your original allow_standby_replay value):
ceph fs set cephfs max_mds 2
# ceph fs set cephfs allow_standby_replay <original>
Finish
Release the OSDs:
ceph osd unset noout
Do not forget this one — a cluster left in noout will happily run degraded
forever without telling you.
ceph status
# HEALTH_OK
This saved you a night? I do this for a living: info@wirt.ee.