Scope. This article deploys Ceph Tentacle 20.2.4 on a single Ubuntu 24.04 LTS server with two data disks using cephadm. It produces a working cluster with one monitor, one manager, two OSDs, and a replicated test pool. It does not cover multi-node clusters, CephFS, RadosGW, or OpenStack integration.
What This Procedure Produces
At the end of this guide, you will have a single-node Ceph cluster running Tentacle 20.2.4 with two OSDs, replication set to two copies, and a validated HEALTH_OK status. The cluster is suitable for development, training, and integration testing. It is not a production topology — a production cluster needs at least three nodes for meaningful fault tolerance.
The procedure takes approximately one hour. Most of that time is waiting for containers to pull and services to start.
If you are planning a production cluster, the article on how to size a Ceph cluster covers the disk count, replication factor, and capacity arithmetic before you reach this step.
Prerequisites
The server needs Ubuntu 24.04 LTS installed on a separate system disk. The two data disks must be entirely free — no partitions, no filesystem, no LVM. Cephadm refuses any disk that carries residual metadata.
Verify the disk layout before anything else:
lsblk
The output must show the system disk with its mounted partitions (/, /boot, /boot/efi) and the two data disks with no mount points and no child partitions. If the data disks show partitions, they must be cleaned before proceeding.
Cephadm deploys all Ceph daemons as containers. It needs either Podman or Docker. On Ubuntu 24.04, Podman is available from the default repositories and does not require a daemon — it is the simpler choice:
apt update apt install -y podman podman --version
Why Three Tools to Clean a Disk
Cephadm inspects each candidate disk through ceph orch device ls. If it finds any trace of a previous filesystem, partition table, or LVM metadata, it marks the disk as unavailable. The disk appears in the list with Available: No, and no error message explains why.
Three cleaning tools exist because there are three layers of residual state:
wipefs -afremoves filesystem signatures — the magic bytes that identify ext4, XFS, or any other filesystem. Without this, cephadm sees a formatted disk.sgdisk --zap-allremoves the GPT and MBR partition tables. Without this, cephadm sees a partitioned disk.dd if=/dev/zero of=/dev/sdX bs=1M count=100zeroes the first 100 MB of the disk, clearing any LVM headers or RAID superblocks that the first two tools do not reach.
Run all three on each data disk, then inform the kernel:
wipefs -af /dev/sda sgdisk --zap-all /dev/sda dd if=/dev/zero of=/dev/sda bs=1M count=100 oflag=direct,dsync partprobe /dev/sda udevadm settle
Repeat for the second disk. Then verify that both disks are empty:
lsblk /dev/sda /dev/sdb blkid /dev/sda /dev/sdb
lsblk must show no child partitions. blkid must return empty — no output at all. If either command shows residual data, run the three tools again.
Chrony: Why Time Synchronization Is Not Optional
Ceph monitors rely on synchronized clocks to detect quorum failures. When the clock skew between a monitor and the rest of the cluster exceeds 0.05 seconds, Ceph raises HEALTH_WARN with clock skew detected. On a single-node cluster, this means the monitor’s clock drifts from the NTP reference.
apt install -y chrony systemctl enable --now chrony chronyc sources
The output must show at least one source with a * prefix, meaning it is selected as the synchronization reference. If all sources show ?, the server has no reachable NTP source and the Ceph cluster will warn continuously.
Installing cephadm
Cephadm is a standalone Python script that bootstraps the cluster and manages its lifecycle. On Ubuntu 24.04, it is available as a package:
apt install -y cephadm ceph-common which cephadm ceph --version
The ceph-common package provides the ceph command-line client. Without it, every command must be prefixed with cephadm shell --, which starts a container for each invocation.
Bootstrapping the Cluster
The bootstrap command creates the first monitor, the first manager, and the cluster configuration. It needs the IP address that the monitor will bind to — this must be a routable address on the server, not 127.0.0.1:
cephadm bootstrap --mon-ip 10.0.0.31 --single-host-defaults
Replace 10.0.0.31 with your server’s actual IP on the Ceph public network. The --single-host-defaults flag adjusts several parameters for a single-node deployment, including reducing the default monitor count to one.
Bootstrap takes five to ten minutes. It pulls the Ceph container image (approximately 1.5 GB), generates the cluster FSID, creates the monitor and manager, and writes the configuration to /etc/ceph/.
After bootstrap completes, run:
ceph -s
The output will show HEALTH_WARN. This is expected, not an error. The default pool replication size is three (osd_pool_default_size=3), and the cluster has zero OSDs. Ceph warns that it cannot satisfy the replication policy. This warning disappears after you deploy the OSDs and configure the replication factor.
Deploying the OSDs
First, confirm that cephadm sees the cleaned disks:
ceph orch device ls
Both data disks must appear with Available: Yes. If a disk shows Available: No, return to the disk cleaning section — a residual signature is still present.
Deploy an OSD on each disk:
ceph orch daemon add osd *:data:/dev/sda ceph orch daemon add osd *:data:/dev/sdb
The * matches any host in the cluster — on a single-node deployment, this is unambiguous. Each OSD takes one to two minutes to deploy. Monitor progress with:
ceph osd tree
When both OSDs appear with status up, the deployment is complete. The HEALTH_WARN may persist until the replication factor is configured.
Configuring Replication
With two OSDs, the cluster can replicate data across two disks. Set the default replication factor:
ceph config set global osd_pool_default_size 2 ceph config set global osd_pool_default_min_size 1
The size=2 setting means every object is stored on both disks. The min_size=1 setting means the cluster continues to serve I/O even if one OSD is down.
This is a trade-off. With min_size=1, the cluster remains available during a single disk failure. But during that window, new writes go to only one OSD. If the second OSD also fails before the first recovers, those writes are lost. On a two-OSD single-node cluster, this is an acceptable lab trade-off. On a production cluster, min_size should never be lower than size - 1 with at least three nodes.
Creating a Pool and Validating
Create a test pool with 32 placement groups:
ceph osd pool create test-pool 32 ceph osd pool set test-pool size 2 ceph osd pool set test-pool min_size 1
Then verify the cluster state:
ceph -s
The output must show HEALTH_OK, two OSDs up and in, and all placement groups in active+clean state. If any PGs show inactive or degraded, wait two minutes — Ceph may still be peering.
Verify the capacity:
ceph df
The raw storage should show the total capacity of both disks. The available capacity in the pool should be approximately half the raw total, since every object is stored twice.
Verify the OSD distribution:
ceph osd tree ceph osd df
Both OSDs must show approximately equal PG counts. An imbalance of more than two PGs between two identical disks indicates a CRUSH map issue.
Finally, test a write and a read:
rados -p test-pool put test-object /etc/hostname rados -p test-pool get test-object /tmp/test-output cat /tmp/test-output
The output must match the content of /etc/hostname. If it does, the cluster is operational.
After Deployment: What to Watch
Three things require attention after the initial deployment.
The CVEs of August 2026. Ceph Tentacle 20.2.4, released on 19 August 2026, fixes four security vulnerabilities including an authentication bypass in CephX and a privilege escalation in RadosGW. If your bootstrap pulled an earlier image, upgrade the cluster through ceph orch upgrade start --ceph-version 20.2.4. Verify the running version with ceph version.
The OSD latency. Run ceph osd perf periodically. The apply and commit latency should stay below 100 milliseconds. A sudden increase indicates a disk problem or a saturated I/O path.
The disk utilization. Ceph recommends keeping utilization below 75 percent of raw capacity. Beyond that threshold, recovery from a disk failure may not complete before the remaining disk fills up. On a two-OSD cluster with 3.6 TB raw, this means no more than 2.7 TB of raw usage, which translates to approximately 1.35 TB of usable data at replication factor two.
When the lab cluster is ready for its next step — serving block storage to OpenStack — the article on Ceph as an OpenStack storage backend covers the pools, users, keyrings, and integration traps that follow this procedure.
For managed Ceph deployments in production, from sizing to day-two operations, our unified storage practice covers the full lifecycle.
What This Article Does Not Cover
This article deploys a single-node Ceph cluster for lab use. It does not cover multi-node clusters, CRUSH rules, failure domains, or erasure coding. It does not cover CephFS for shared filesystems or RadosGW for S3-compatible object storage. It does not cover the migration from Squid to Tentacle. And it does not cover production hardening — firewall rules, dedicated networks for cluster traffic, and monitor redundancy are all required for a cluster that serves real workloads.
References
Ceph Foundation. Tentacle v20.2.4 Release Notes — CVE-2025-30156, CVE-2026-39944, CVE-2026-50152, CVE-2026-54330. ceph.io, August 2026.
Ceph Foundation. cephadm Documentation — Deploying a New Ceph Cluster. docs.ceph.com, 2026.
EC INTELLIGENCE. Formation Ceph — Procédure d’Installation Ceph, Configuration 2 OSDs. 2025.