Skip to main content
RunBook Academy

CephCXIII · Multiple OSD FailureMultiple OSD Failure

When a PG has no surviving copy

Advanced⏱ ~18 mincephceph-objectstore-toolcephadm

What you'll learn

  • Distinguish down from incomplete from unfound
  • Identify which OSDs the PG needs
  • Extract a PG from a dead OSD store
  • Sequence the destructive options correctly

Prerequisites

None — start here.

Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18

Not yet marked complete on this device.

Why this matters in production

A PG marked down usually still has its objects somewhere, and the commands that make the warning go away are the ones that make that untrue.

What down means

ceph pg dump_stuck inactive
ceph health detail | grep -E 'PG_AVAILABILITY|PG_DAMAGED'
StateCauseData
downan OSD holding required history is unavailableprobably intact
incompletethe surviving copies cannot form a complete historypossibly intact
unfound objectscopies are known to have existed and cannot be locatedintact only if a down OSD returns
staleno OSD has reported on this PG recentlyunknown
ceph pg 3.1f query | python3 -c '
import sys,json
d = json.load(sys.stdin)
print("state:", d.get("state"))
for s in d.get("recovery_state", []):
    print("-", s.get("name"))
    for k in ("probing_osds","down_osds_we_would_probe",
              "peering_blocked_by","blocked"):
        if s.get(k):
            print("   %-26s %s" % (k, s[k]))'
down_osds_we_would_probe  [23, 41]

The order of attempts

AttemptCostReversible
Return one of the probed OSDsnoneyes
Move the disk to another chassis and start the OSD therehardware timeyes
Export the PG from the dead store and import it elsewhereexpert timeyes
ceph osd lostmay create unfound objectsno
ceph pg mark_unfound_lostdiscards the named objectsno
ceph osd force-create-pgdiscards the entire PGno

Extracting a PG from a dead store

cephadm unit --name osd.23 stop
cephadm shell --name osd.23 -- ceph-objectstore-tool \
  --data-path /var/lib/ceph/osd/ceph-23 --op list-pgs
cephadm shell --name osd.23 -- ceph-objectstore-tool \
  --data-path /var/lib/ceph/osd/ceph-23 \
  --pgid 3.1f --op export --file /var/lib/ceph/osd/ceph-23/3.1f.export
# import into an OSD that does not already hold this PG, while it is stopped
cephadm unit --name osd.77 stop
cephadm shell --name osd.77 -- ceph-objectstore-tool \
  --data-path /var/lib/ceph/osd/ceph-77 --op import --file /mnt/rescue/3.1f.export
cephadm unit --name osd.77 start
The export is a read of the local store. It does not require the cluster
to accept the OSD, only that the device is readable and the OSD process
is stopped.

The last resorts

ceph osd lost 23 --yes-i-really-mean-it
ceph pg 3.1f list_unfound | head
ceph osd force-create-pg 3.1f --yes-i-really-mean-it

Quiz

Knowledge check · 4 questions

  1. Q1. What does `down_osds_we_would_probe` in a PG query tell you?

  2. Q2. A PG can be marked down even though every one of its objects is intact on a surviving OSD.

  3. Q3. Recover a PG with no available copy.

    Three OSDs across three hosts failed together. PG 3.1f is down and its query lists osd.23 and osd.41 under down_osds_we_would_probe. Both hosts failed on a power event; the disks are believed intact.

  4. Q4. What does `ceph osd force-create-pg` do to the data in that PG?

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

Production discipline

Read down_osds_we_would_probe before anything else — it converts a lost PG into a named hardware task. Confirm in writing that every probed OSD is physically unrecoverable before ceph osd lost or force-create-pg, since both return the cluster to HEALTH_OK with no record of what was discarded.

Cross-course references

  • Kubernetes: a consensus store refuses to elect rather than serve an unprovable log
  • Linux: a filesystem that will not mount is often intact and missing only its journal context