本家様 https://ceph.io/
オブジェクトストレージ(Ceph Object Store), ブロックストレージ(Ceph Block Device), ファイルシステム(Ceph File System)を提供するオープンソースなSoftware-Defined Storage Platform. クラスターファイルシステムです.

オブジェクトストレージ:Hadoopやamazon S3なストレージ
ブロックストレージ: /dev/vda, /dev/vdbとか提供します, ストレージのdb先
ファイルシステム: posix準拠なファイルシステム, ACLも使えます

ここではこのうち Ceph を使ったPOSIX互換ファイルシステム CephFS を取り上げます.

Cephにはバージョン名があって下記の通りになってます ubuntuっぽい
https://docs.ceph.com/docs/master/releases/general/, https://docs.ceph.com/en/latest/releases/

Release nameInitial releaseLatestEnd of life(26.3.11時点)備考
Tentacle2025-11-1820.2.02027-11-18(estimated)IBM Storage Ceph 9
Squid2024-09-2619.2.32026-09-19(estimated)IBM Storage Ceph 8
Reef2023-08-0718.2.72025-08-01(estimated)IBM Storage Ceph 7
Quincy2022-04-1917.2.92025-01-13IBM Storage Ceph 6
Pacific2021-03-3116.2.152024-03-04IBM Storage Ceph 5
SUSE Enterprise Storage 7.1(Pacific v16.2)
Octopus2020-03-2315.2.172022-08-09SUSE Enterprise Storage 7(Octopus v15.2)
Nautilus2019-03-1914.2.222021-06-30Red Hat Ceph Storage 4
Mimic2018-06-0113.2.102020-07-22
Luminous2017-08-0112.2.132020-03-01Red Hat Ceph Storage 3

*毎年メジャーバージョンアップがある

ここでは「Tentacle」を導入します.
OS上に直接アプリをインストールする方法以外に、docker/podmnan の上で構築する方法があります。後者が推奨のようでここではこの方法で構築を進めます。
各マシンに Manager Daemon, Monitor Daemon, Metadata Server Daemon, Object Storage Daemon らが単独で、あるいは相乗りで存在します。

っで構成はこんな感じで.

ホスト名役目IPアドレス[public network]cluster networkOSストレージosd
ceph-mgrManager Daemon192.168.0.47/24Rockylinux9.7os(16GB)
ceph-mon01Manager Daemon
Monitor Daemon
192.168.0.48/24os(16GB)
/var/lib/ceph(8GB)
ceph-mon02Monitor Daemon
Metadata Server Daemon
192.168.0.49/24os(16GB)
/var/lib/ceph(8GB)
ceph-mon03Monitor Daemon
Metadata Server Daemon
192.168.0.50/24os(16GB)
/var/lib/ceph(8GB)
ceph-osd01Object Storage Daemon192.168.0.51/2410.10.10.51/24os(16GB)OSD(50GB:SSD:meta)
OSD(50GB:HDD:data)
ceph-osd02Object Storage Daemon192.168.0.52/2410.10.10.52/24os(16GB)OSD(50GB:SSD:meta)
OSD(50GB:HDD:data)
ceph-osd03Object Storage Daemon192.168.0.53/2410.10.10.53/24os(16GB)osd(50GB:SSD:meta)
OSD(50GB:HDD:data)

[OSD]
cephFSを作る際はmeta向けの高速なSSDとdata向けの大容量のHDDに分けた方がいい。ls, findがめちゃ早くなる.
data向け領域はHDDのみでも構わないが、sata SSD/nvme SSDを組み合わせた bluestore機構が使える.
SSD(sata,nvme)はエンタープライズ向けで電源喪失保護(PLP: Power Loss Protection)付きでよういすると幸せになれるみたい.

[cluster network]
Object Storage Daemon間の専用通信ネットワークです. 受け取ったデータを他のHDDへのコピー処理(レプリケーション)や障害が発生してHDDが差し替えた際にOSDノード間データ移動を表のpublic networkに影響が及ばないように裏で対処します.
あとOSDノード間の死活確認も行います。データの複製やらリカバリ処理は分散ファイルシステムなので結構な通信が発生します。それを表に出させないようにしてます. でもすっごい早い表のネットワークなら帯域的にも表だけでいいような気がしますが

[public network]
bonding構成が望ましいようで、bondingでも802.3ad. その場合は高性能なLACP対応なHUBが必要. 分散ファイルシステムなのでファイル転送速度はそのままなのでしょうが、帯域を増やせますからね.

構築に必要なリソースとか

各デーモンで要求されるスペック。そんなに高性能なCPUは不要. Hzよりもthreadsの数(coreの数)があればいいのかな.
OSDノードのmemoryはosd(hdd)の数で決まる感じ. 4GB/1HDDが最低ランクで、12slotなマシンなら48GB+OS用メモリ. ただ耐障害のためにOSDノードの台数も考慮する必要あり.
Ceph/memo

構築方針

cephの構築は cephadm コマンドによるデプロイから始まります。この際cephadmを実行したノードは自動的に Manager DaemonMonitor Daemon の機能を持つようになります
なので初回構築は ceph-mon01 で作り、あとでceph-mgrを追加して管理ノードに仕立てる流れにします.

ceph-mon01 -> ceph-mgr -> ceph-mgr(管理ノード化) -> ceph-mon02,ceph-mon03(monitorへ) -> ceph-osd01,ceph-osd02,ceph-osd03(osdへ) -> filesystem作成

各デーモンには必要な数がありまして、Manager Daemonは2つ(最低1つ)、Monitor Daemonは最低3つで奇数素. Metadata Server Daemonは2つ(最低1つ)
Object Storage Daemonは最低3つ. だから物理的に3台あれば一応は形はできる.

cephでsmb Ceph/smb
cephでnfs Ceph/nfs

構築開始. cephadmのインストールとデプロイ

rockylinux9.7において、提供されているcephリポジトリは

[root@ceph-mon01 ~]# dnf search centos-release-ceph
Last metadata expiration check: 0:00:21 ago on Thu 09 Apr 2026 12:37:38 AM JST.
=========================================================== Name Matched: centos-release-ceph ============================================================
centos-release-ceph-pacific.noarch : Ceph Pacific packages from the CentOS Storage SIG repository
centos-release-ceph-quincy.noarch : Ceph Quincy packages from the CentOS Storage SIG repository
centos-release-ceph-reef.noarch : Ceph Reef packages from the CentOS Storage SIG repository
centos-release-ceph-squid.noarch : Ceph Squid packages from the CentOS Storage SIG repository
[root@ceph-mon01 ~]#

と最新のTentacleは提供されていない. なので https://docs.ceph.com/en/latest/install/get-packages/ を参照して cephadm をダウンロードする.

[root@ceph-mon01 ~]# curl --silent --remote-name --location https://download.ceph.com/rpm-tentacle/el9/noarch/cephadm
[root@ceph-mon01 ~]# chmod +x cephadm
[root@ceph-mon01 ~]# ./cephadm version
cephadm version 20.2.1 (6a49aff47758778a5f5951e731d437c317f72fb2) tentacle (stable)
[root@ceph-mon01 ~]#

cephはpodman(or docker)のコンテナで構築されていきます.
なので各物理マシンには podman と lvm2 パッケージが必要で用意出来たら cephadm でデプロイです

[root@ceph-mon01 ~]# dnf install podman lvm2
 
[root@ceph-mon01 ~]# ./cephadm bootstrap --mon-ip 192.168.0.48 --cluster-network 10.10.10.0/24  --dashboard-password-noupdate --initial-dashboard-password adminpass --skip-monitoring-stack

[--dashboard-password-noupdate] 初回デプロイが完了するとdashboardが利用可能になるが、パスワード変更が要求される. 面倒なのでこの場でパスワードを決めた
[--initial-dashboard-password adminpass] これがdashboardのadminのパスワードとなる
[--skip-monitoring-stack] monitoringなサービス(prometheus, grafana, alertmanager, node-exporter)の構築をskip. 使わない機能もあるので.

設定が間違った、再度作り直したい場合は、まずこのデプロイされたcephの fsid を見つける. 「/etc/ceph/ceph.conf」に書かれてます.
っで

[root@ceph-mon01 ~]# cat /etc/ceph/ceph.conf
# minimal ceph.conf for 1fa24c12-3364-11f1-ac0a-bc241165abf5
[global]
        fsid = 1fa24c12-3364-11f1-ac0a-bc241165abf5
        mon_host = [v2:192.168.0.48:3300/0,v1:192.168.0.48:6789/0]
 
[root@ceph-mon01 ~]# ./cephadm rm-cluster --fsid 1fa24c12-3364-11f1-ac0a-bc241165abf5 --force
[root@ceph-mon01 ~]# rm -rf /etc/ceph /var/lib/ceph/*

これで初期化できます. もしObject Storage Daemon まで進んでいたなら追加で「--zap-osds」を加えて実行すればディスクの内容も消去されます.

[閑話]
もしcephを構築する環境がproxy環境なら「/etc/containers/containers.conf」にproxy設定を入れる

[engine]
env = [
  "HTTP_PROXY=http://proxy:3128",
  "HTTPS_PROXY=http://proxy:3128",
  "NO_PROXY=localhost,127.0.0.1,192.168.1.0/24,ceph-mgr,ceph-mon01,ceph-mon02,ceph-mon03,ceph-osd01,ceph-osd02,ceph-osd03"
]

な感じで.[閑話休題]

次にceph関連のコマンドを入れます.

[root@ceph-mon01 ~]# ./cephadm add-repo --release tentacle    --> 「/etc/yum.repos.d/ceph.repo」 ができる
[root@ceph-mon01 ~]# dnf install ceph-common

これで「ceph」コマンドが使えるようになります.
cephリポジトリの中身詳細 Ceph/repository

Manager Daemonの構築

既に ceph-mon01 にはManager Daemonのpodman コンテナが立ってます.

[root@ceph-mon01 ~]# ceph orch ps
NAME                   HOST        PORTS        STATUS        REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
crash.ceph-mon01       ceph-mon01               running (8m)     8m ago   8m    7616k        -  20.2.1   fb63cba66eea  852c9c9d3f75
mgr.ceph-mon01.dyhfce  ceph-mon01  *:9283,8765  running (9m)     8m ago   9m     509M        -  20.2.1   fb63cba66eea  8056a4503202
mon.ceph-mon01         ceph-mon01               running (9m)     8m ago   9m    29.8M    2048M  20.2.1   fb63cba66eea  b7fe602b5627
 
[root@ceph-mon01 ~]#

ここで素直にceph-mgrをcephに参加させると自動的にもれなくManager DaemonMonitor Daemon
そしてceph-mgrに何も調整されていないストレージがあるとObject Storage Daemon も付く. はぁ〜っとため息が出るので
事前に自動登録を停止させる

[root@ceph-mon01 ~]# ceph orch set-unmanaged mon
[root@ceph-mon01 ~]# ceph orch set-unmanaged mgr
[root@ceph-mon01 ~]# ceph orch apply osd --all-available-devices --unmanaged=true
[root@ceph-mon01 ~]#

その上で「dnf install podman lvm2」が入ったceph-mgrにcephの仲間になってもらう

(ceph-mgrでの事前措置)
dnf install podman lvm2 -y
----ここまで----
 
[root@ceph-mon01 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mgr
[root@ceph-mon01 ~]# ceph orch host add ceph-mgr                           # ceph-mgrの名前解決が行かない時はipも同時に付けて実行する[ceph orch host add ceph-mgr 192.168.0.47]
 
(確認)
[root@ceph-mon01 ~]# ceph orch host ls
HOST        ADDR          LABELS  STATUS
ceph-mgr    192.168.0.47
ceph-mon01  192.168.0.48  _admin
2 hosts in cluster
[root@ceph-mon01 ~]#
 
[root@ceph-mon01 ~]# ceph orch ps
NAME                   HOST        PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
crash.ceph-mgr         ceph-mgr                 running (57s)    56s ago  57s    7633k        -  20.2.1   fb63cba66eea  21c9d9cf2265
crash.ceph-mon01       ceph-mon01               running (27m)     7m ago  27m    7616k        -  20.2.1   fb63cba66eea  852c9c9d3f75
mgr.ceph-mon01.dyhfce  ceph-mon01  *:9283,8765  running (28m)     7m ago  28m     521M        -  20.2.1   fb63cba66eea  8056a4503202
mon.ceph-mon01         ceph-mon01               running (28m)     7m ago  28m    39.8M    2048M  20.2.1   fb63cba66eea  b7fe602b5627
[root@ceph-mon01 ~]#

「ceph orch host ls」でマシンの登録が完了して、「ceph orch ps」にてceph-mgrでcrashデーモンのみが動ている事が分かる. 「crashデーモン」はデフォで全てのcephマシンで動きます. 情報の自動収集, 管理画面への報告, 警告の発報の任を持ちます.

[閑話]もし、何らかの理由で参加させたceph-mgrを取りやめにするには

[root@ceph-mon01 ~]# ceph orch host drain ceph-mgr     # サービスの退避. そのホストで稼働しているデーモンらが他のノードに移ります(定義次第だけど)
[root@ceph-mon01 ~]# ceph orch ps ceph-mgr             # そのホストに残っているサービスがないか確認
[root@ceph-mon01 ~]# ceph orch host rm ceph-mgr        # 残ってないなら削除

削除ができたら ceph-mgr の /etc/ceph, /var/lib/ceph/ の中身も削除すれば完了[閑話休題]

次にceph-mgrにラベルを張ります.「ceph orch host ls」で見える「LABELS」の欄の事です
ceph-mgrとceph-mon01はManager Daemonのコンテナを持たせるので、mgrのラベルを張ります. managerでも構いません.
一応既に ceph-mon01 はManager Daemonを持ってますが、ホストの定義をしておきます

[root@ceph-mon01 ~]# ceph orch host label add ceph-mon01 mgr
[root@ceph-mon01 ~]# ceph orch host label add ceph-mgr   mgr   #剥がす際は「ceph orch host label rm ceph-mgr mgr」
(確認)
[root@ceph-mon01 ~]# ceph orch host ls
HOST        ADDR          LABELS      STATUS
ceph-mgr    192.168.0.47  mgr
ceph-mon01  192.168.0.48  _admin,mgr
2 hosts in cluster
[root@ceph-mon01 ~]#

このラベルを使ってManager Daemonを追加してみます

[root@ceph-mon01 ~]# ceph orch ls --service_name=mgr --export > mgr.yaml    # mgrの設計書を入手
[root@ceph-mon01 ~]# vi mgr.yaml
service_type: mgr
service_name: mgr
placement:
  count: 2
  label: mgr
 
[root@ceph-mon01 ~]# ceph orch apply -i mgr.yaml --dry-run
[root@ceph-mon01 ~]# ceph orch apply -i mgr.yaml

これでmgrとLABELを付けたノードの内2台でManager Daemonが動きます

[root@ceph-mon01 ~]# ceph orch ps
NAME                   HOST        PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
crash.ceph-mgr         ceph-mgr                 running (18m)    46s ago  18m    7612k        -  20.2.1   fb63cba66eea  0bd112ef9717
crash.ceph-mon01       ceph-mon01               running (57m)     5m ago  57m    7616k        -  20.2.1   fb63cba66eea  852c9c9d3f75
mgr.ceph-mgr.gslsdh    ceph-mgr    *:8443,8765  running (51s)    46s ago  51s     261M        -  20.2.1   fb63cba66eea  0510388a015a
mgr.ceph-mon01.dyhfce  ceph-mon01  *:9283,8765  running (58m)     5m ago  58m     529M        -  20.2.1   fb63cba66eea  8056a4503202
mon.ceph-mon01         ceph-mon01               running (58m)     5m ago  58m    45.4M    2048M  20.2.1   fb63cba66eea  b7fe602b5627
[root@ceph-mon01 ~]#

これでceph-mgrでもdashboardが動きます.

ceph-mgrにも管理権限を渡す

このままceph-mon01で作業してもいいのですが、ceph-mgrにも権限を移行して以後、ceph-mgrから操作することにします
先ほどの「LABELs」で「_admin」ラベルをceph-mgrにも付けます

[root@ceph-mon01 ~]# ceph orch host label add ceph-mgr _admin
[root@ceph-mon01 ~]# ceph orch host ls
HOST        ADDR          LABELS      STATUS
ceph-mgr    192.168.0.47  mgr,_admin
ceph-mon01  192.168.0.48  _admin,mgr
2 hosts in cluster
[root@ceph-mon01 ~]#

これでceph-mgrの「/etc/ceph」に「/etc/ceph/ceph.client.admin.keyring」と「/etc/ceph/ceph.conf」が用意されますが、仲間を増やすときに必要な「/etc/ceph/ceph.pub」はありません。
これは ceph-mgr ノードで「ceph cephadm get-pub-key」を実行すれば得られますが、ceph-mgrにはcephコマンドがないです。なのでceph-mon01同様にcephadmを取得してから ceph-commonを入れます

[root@ceph-mgr ~]# curl --silent --remote-name --location https://download.ceph.com/rpm-tentacle/el9/noarch/cephadm
[root@ceph-mgr ~]# chmod +x ./cephadm
[root@ceph-mgr ~]# ./cephadm add-repo --release tentacle
[root@ceph-mgr ~]# dnf install ceph-common
 
[root@ceph-mgr ~]# ceph cephadm get-pub-key > /etc/ceph/ceph.pub

ceph-mon01とceph-mgrはManager Daemonが動きますので「_admin」ラベルはそのままにします

Monitor Daemonの構築

基本的にはLABELを付与して設計書を読み込ませてmonをデプロイさせます.
まずは追加

(ceph-mon02, ceph-mon03での事前措置)
dnf install podman lvm2 -y
----ここまで----
 
[root@ceph-mgr ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon02
[root@ceph-mgr ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon03
[root@ceph-mgr ~]# ceph orch host add ceph-mon02
[root@ceph-mgr ~]# ceph orch host add ceph-mon03
 
(確認)
[root@ceph-mgr ~]# ceph orch host ls
HOST        ADDR          LABELS      STATUS
ceph-mgr    192.168.0.47  mgr,_admin
ceph-mon01  192.168.0.48  _admin,mgr
ceph-mon02  192.168.0.49
ceph-mon03  192.168.0.50
4 hosts in cluster
[root@ceph-mgr ~]#

そしてceph-mon01、ceph-mon02そしてceph-mon03 にmonのラベルを付けます

[root@ceph-mgr ~]# ceph orch host label add ceph-mon01 mon
[root@ceph-mgr ~]# ceph orch host label add ceph-mon02 mon
[root@ceph-mgr ~]# ceph orch host label add ceph-mon03 mon
 
(確認)
[root@ceph-mgr ~]# ceph orch host ls
HOST        ADDR          LABELS          STATUS
ceph-mgr    192.168.0.47  mgr,_admin
ceph-mon01  192.168.0.48  _admin,mgr,mon
ceph-mon02  192.168.0.49  mon
ceph-mon03  192.168.0.50  mon
4 hosts in cluster
[root@ceph-mgr ~]#

そしてmonの設計書を作って読み込ませます

[root@ceph-mgr ~]# ceph orch ls --service_name=mon --export > mon.yaml
[root@ceph-mgr ~]# vi mon.yaml
service_type: mon
service_name: mon
placement:
  count: 3
  label: mon
[root@ceph-mgr ~]# ceph orch apply -i mon.yaml --dry-run
[root@ceph-mgr ~]# ceph orch apply -i mon.yaml
(確認)
[root@ceph-mgr ~]# ceph orch ps
NAME                   HOST        PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
crash.ceph-mgr         ceph-mgr                 running (2h)     58s ago   2h    7612k        -  20.2.1   fb63cba66eea  0bd112ef9717
crash.ceph-mon01       ceph-mon01               running (3h)      4m ago   3h    7616k        -  20.2.1   fb63cba66eea  852c9c9d3f75
crash.ceph-mon02       ceph-mon02               running (70m)    35s ago  70m    7638k        -  20.2.1   fb63cba66eea  77d592cedcad
crash.ceph-mon03       ceph-mon03               running (69m)    35s ago  69m    7633k        -  20.2.1   fb63cba66eea  41036976dd33
mgr.ceph-mgr.gslsdh    ceph-mgr    *:8443,8765  running (2h)     58s ago   2h     496M        -  20.2.1   fb63cba66eea  0510388a015a
mgr.ceph-mon01.dyhfce  ceph-mon01  *:9283,8765  running (3h)      4m ago   3h     543M        -  20.2.1   fb63cba66eea  8056a4503202
mon.ceph-mon01         ceph-mon01               running (3h)      4m ago   3h    75.6M    2048M  20.2.1   fb63cba66eea  b7fe602b5627
mon.ceph-mon02         ceph-mon02               running (42s)    35s ago  42s    30.9M    2048M  20.2.1   fb63cba66eea  aed63561d365
mon.ceph-mon03         ceph-mon03               running (49s)    35s ago  49s    27.9M    2048M  20.2.1   fb63cba66eea  154b576b8891
[root@ceph-mgr ~]#

Object Storage Daemon の構築

まずは全OSDノードを参加させます

(ceph-osd01, ceph-osd02, ceph-osd03での事前措置)
dnf install podman lvm2 -y
----ここまで----
 
[root@ceph-mgr ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd01
[root@ceph-mgr ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd02
[root@ceph-mgr ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd03
 
[root@ceph-mgr ~]# ceph orch host add ceph-osd01
[root@ceph-mgr ~]# ceph orch host add ceph-osd02
[root@ceph-mgr ~]# ceph orch host add ceph-osd03

ここら辺が難しくなる..OSDのストレージとしてHDD/SSD/nvmeデバイスは、それ単体で使う分にはいいのですが、
HDDに対してメタデータをSSDに配置したり書き込みログをnvmeに置いたりと複数のデバイスを噛まして性能向上が図れます(bluestore形式)

コンポーネント対象役割設計書での名称
Primary DeviceHDD実際のデータ本体を保存data_devices
DB (Metadata)sata SSD or nvme SSDメタデータを保持します. メタデータが溢れたらプライマリ デバイスに置かれる
プライマリ デバイスよりも高速なデバイスで有利になる(パフォーマンス的に)
db_devices
WAL (Write-Ahead Log)nvme SSD or sata SSD先行書き込みログ. ジャーナルまたは先行書き込みログを別のデバイスに置ける. 10GBもあれが十分の様子wal_devices

OSDノードの登録には設計書(yaml)ベースで行うようで、bluestore形式を持たせるならちょっと面倒な記載が必要になります
以前はストレージ単位で登録できたのですが、最新版はどうもyamlベースでの登録となっている模様

一応既に設計書は登録されているが、中身がcephの仲間になったらどのストレージもosd(ストレージデバイス)として登録となっているので
面倒なので冒頭で「ceph orch apply osd --all-available-devices --unmanaged=true」としてその機能を無効化した

[root@ceph-mgr ~]# ceph orch ls
NAME                       PORTS  RUNNING  REFRESHED  AGE  PLACEMENT
crash                                 4/4  11s ago    13h  *
mgr                                   2/2  11s ago    13h  count:2;label:mgr
mon                                   3/3  10s ago    13h  count:3;label:mon
osd.all-available-devices               0  -          13h  <unmanaged>            <-- これ
[root@ceph-mgr ~]#

「osd.all-available-devices」の中身は「ceph orch ls --service_name=osd.all-available-devices --export」にて確認できますが、ここでは使わないので削除してます

[root@ceph-mgr ~]# ceph orch rm osd.all-available-devices --force
[root@ceph-mgr ~]# ceph orch ls
NAME   PORTS  RUNNING  REFRESHED  AGE  PLACEMENT
crash             7/7  8m ago     14h  *
mgr               2/2  8m ago     14h  count:2;label:mgr
mon               3/3  8m ago     13h  count:3;label:mon
[root@ceph-mgr ~]#

っでOSD向けの設計書ですが、OSDノードのHDD構成(11本だったり12本だったり), SSD構成(metadata向け、bluestoreのblock.db向け)、vnme(buestoreのblock.wel向け)がOSDノード毎に違っている場合もあり得る.
なのでOSDノード単位で service name を用意したいと思う
っで、ceph-osd01の場合. (っと言ってもここでは全て同じストレージ構成ですが)

[root@ceph-mgr ~]# vi osd01_custom.yaml
service_type: osd
service_id: osd01_custom
placement:
  hosts:
    - ceph-osd01
spec:
  data_devices:
    paths:
      - /dev/sdb
      - /dev/sdc
  filter_logic: AND
  objectstore: bluestore
[root@ceph-mgr ~]#
 
(テストで読み込ませる)
[root@ceph-mgr ~]# ceph orch apply -i osd01_custom.yaml --dry-run
 :
################
OSDSPEC PREVIEWS
################
+---------+--------------+------------+----------+----+-----+
|SERVICE  |NAME          |HOST        |DATA      |DB  |WAL  |
+---------+--------------+------------+----------+----+-----+
|osd      |osd01_custom  |ceph-osd01  |/dev/sdb  |-   |-    |
|osd      |osd01_custom  |ceph-osd01  |/dev/sdc  |-   |-    |
+---------+--------------+------------+----------+----+-----+
[root@ceph-mgr ~]#

この内容でokなら

[root@ceph-mgr ~]# ceph orch apply -i osd01_custom.yaml
 
(暫くすると)
[root@ceph-mgr ~]# ceph orch ls
NAME              PORTS  RUNNING  REFRESHED  AGE   PLACEMENT
crash                        7/7  10m ago    14h   *
mgr                          2/2  5m ago     14h   count:2;label:mgr
mon                          3/3  5m ago     14h   count:3;label:mon
osd.osd01_custom               2  13s ago    104s  ceph-osd01
 
[root@ceph-mgr ~]# ceph orch ps
NAME                   HOST        PORTS        STATUS          REFRESHED   AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
 :
osd.0                  ceph-osd01               running (2m)      41s ago    2m    38.7M    2714M  20.2.1   fb63cba66eea  a854a9d99526
osd.1                  ceph-osd01               running (116s)    41s ago  116s    56.2M    2714M  20.2.1   fb63cba66eea  6e005794755c
 
[root@ceph-mgr ~]# ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME            STATUS  REWEIGHT  PRI-AFF
-1         0.09760  root default
-3         0.09760      host ceph-osd01
 1    hdd  0.04880          osd.1            up   1.00000  1.00000
 0    ssd  0.04880          osd.0            up   1.00000  1.00000
 
[root@ceph-mgr ~]# ceph osd df
ID  CLASS  WEIGHT   REWEIGHT  SIZE     RAW USE  DATA     OMAP    META    AVAIL    %USE  VAR   PGS  STATUS
 1    hdd  0.04880   1.00000   50 GiB   26 MiB  112 KiB   4 KiB  26 MiB   50 GiB  0.05  1.00    0      up
 0    ssd  0.04880   1.00000   50 GiB   26 MiB  112 KiB   6 KiB  26 MiB   50 GiB  0.05  1.00    0      up
                       TOTAL  100 GiB   53 MiB  224 KiB  11 KiB  52 MiB  100 GiB  0.05
MIN/MAX VAR: 1.00/1.00  STDDEV: 0
[root@ceph-mgr ~]#

って感じで登録が行える

詳しくはこちらでCeph/osd

ファイルシステムの作成(poolの準備)

ファイルシステムを作成するには、「meta用のpool」と「data用のpool」の2つが必要です。
そのpoolの作成にはデバイス違い

と冗長性の確保方法としての

の組み合わせによるルール(CRUSH配置ルール)を作って、それでプールを作る流れになります

■meta用poolの作成
目下、「meta用のpool」は「replicated」での構築に限定されています。ファイルシステムでのlsやfindの高速化のために「SSD」で構築が望まれます.
まずはSSDを使って作るmeta用poolのルールを作ります

[root@ceph-mgr ~]# ceph osd crush rule create-replicated meta-ssd default host           ssd
                  (ceph osd crush rule create-replicated NAME     ROOT    FAILURE_DOMAIN CLASS)
                                 *NAME: 名称
                                 *ROOT: CRUSH 階層のルート
                                 *FAILURE_DOMAIN: 障害ドメイン, 切り分け. host とか rack とか.
                                 *CLASS: ストレージデバイスクラス. hdd とか ssd とか.
[root@ceph-mgr ~]# (確認) ceph osd crush rule ls   (中身) ceph osd crush rule dump meta-ssd (削除) ceph osd crush rule rm meta-ssd

作ったルールでmeta用poolを作ります

[root@ceph-mgr ~]# ceph osd pool create emfs-meta         64 64 replicated meta-ssd
 
[root@ceph-mgr ~]# ceph osd pool application enable emfs-meta cephfs

数字はPGと言われるものですが、その値の定義は非常にめんどくさい. 素直にgoogleAIとかに構成と規模を伝えて教えてもらった数字を当てた方がいい.

■data用poolの作成
こちらは「replicated」あるいは「erasure-coded」のいずれかが使えますが、ここでは2つとも作成して「replicated」由来のpoolをデフォルト、「erasure-coded」由来のpoolを追加って形にします。
ファイルシステムを作る際は、どうも「replicated」で用意される必要あるようで、仮に登録して、実際には「erasure-coded」由来のpoolを使うようにします

hddをベースにした「replicated」ルールを追加
[root@ceph-mgr ~]# ceph osd crush rule create-replicated data-hdd default host           hdd
                  (ceph osd crush rule create-replicated NAME     ROOT    FAILURE_DOMAIN CLASS)
                                 *NAME: 名称
                                 *ROOT: CRUSH 階層のルート
                                 *FAILURE_DOMAIN: 障害ドメイン, 切り分け. host とか rack とか.
                                 *CLASS: ストレージデバイスクラス. hdd とか ssd とか.
[root@ceph-mgr ~]# (確認) ceph osd crush rule ls   (中身) ceph osd crush rule dump data-hdd (削除) ceph osd crush rule rm data-hdd

hddをターゲットとした「erasure-coded」ルールを作ります. kの値とmの値が非常に重要でOSDノードの台数がkとmの値の合計と同じとかがいいかな.
mの値はcephファイルシステムの運用でOSDノードが停止しても大丈夫な数って思えばいいかも.

[root@ceph-mgr ~]# ceph osd erasure-code-profile set k2-m1-profile k=2 m=1 crush-failure-domain=host crush-device-class=hdd
                  (ceph osd erasure-code-profile set NAME          k   m   FAILURE_DOMAIN            CLASS)
                                 *NAME: 名称
                                 *k:    データの分割数
                                 *m:    パリティーの数
                                 *FAILURE_DOMAIN: 障害ドメイン, 切り分け. host とか rack とか.
                                 *CLASS: ストレージデバイスクラス. hdd とか ssd とか.
[root@ceph-mgr ~]# (確認)ceph osd erasure-code-profile ls   (中身) ceph osd erasure-code-profile get k2-m1-profile (削除) ceph osd erasure-code-profile rm k2-m1-profile

っでpoolを作ります

[root@ceph-mgr ~]# ceph osd pool create emfs-data-default 64 64 replicated data-hdd
[root@ceph-mgr ~]# ceph osd pool application enable emfs-data-default cephfs
 
[root@ceph-mgr ~]# ceph osd pool create emfs-data-ec      32 32 erasure k2-m1-profile
[root@ceph-mgr ~]# ceph osd pool application enable emfs-data-ec cephfs
 
[root@ceph-mgr ~]# ceph osd pool set emfs-data-ec allow_ec_overwrites true
[root@ceph-mgr ~]# ceph osd pool set emfs-data-ec bulk true

.mgr プールの rule 変更

OSDを3つ以上登録するとceph側で .mgr というpoolが自動的に用意されます。

このpoolは「replicated_rule」を使っていて、これは全デバイスを使うと定義されています。SSDのみHDDのみと定義されたpoolと整合性が取れないので
.mgr poolは「replicated_rule」ではなく、SSDあるいはHDD由来のpoolを使うように変更します。これをしないとリバランスに失敗してHDDの使用量偏在が起こります.

[root@ceph-mgr ~]# ceph osd pool get .mgr crush_rule
crush_rule: replicated_rule
 
[root@ceph-mgr ~]# ceph osd pool set .mgr crush_rule data-hdd 
 
[root@ceph-mgr ~]# ceph osd pool get .mgr crush_rule
crush_rule: data-hdd
[root@ceph-mgr ~]#

ファイルシステムの作成

いよいよ最終段階. 作ったpoolでファイルシステムを用意します

っがその前に metadata server を用意します。
いつものようにノードにラベルを張って

(ラベルを張って)
[root@ceph-mgr ~]# ceph orch host label add ceph-mon02 mds
[root@ceph-mgr ~]# ceph orch host label add ceph-mon03 mds
[root@ceph-mgr ~]# ceph orch host ls
HOST        ADDR          LABELS          STATUS
ceph-mgr    192.168.0.47  mgr,_admin
ceph-mon01  192.168.0.48  _admin,mgr,mon
ceph-mon02  192.168.0.49  mon,mds
ceph-mon03  192.168.0.50  mon,mds
 :
7 hosts in cluster
[root@ceph-mgr ~]#

設計書を用意します

[root@ceph-mgr ~]# vi mds.yaml
service_type: mds
service_id: emfs           <-- 作成するファイルシステム名を記載します
placement:
  count: 2
  label: mds
 
[root@ceph-mgr ~]# ceph orch apply -i mds.yaml --dry-run
 :
####################
SERVICESPEC PREVIEWS
####################
+---------+----------+-----------------------+-------------+
|SERVICE  |NAME      |ADD_TO                 |REMOVE_FROM  |
+---------+----------+-----------------------+-------------+
|mds      |mds.emfs  |ceph-mon03 ceph-mon02  |             |
+---------+----------+-----------------------+-------------+
################
 :
[root@ceph-mgr ~]# ceph orch apply -i mds.yaml 
 
[root@ceph-mgr ~]# ceph orch ps --daemon_type=mds
NAME                        HOST        PORTS  STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
mds.emfs.ceph-mon02.fqwudw  ceph-mon02         running (20s)    18s ago  20s    20.5M        -  20.2.1   fb63cba66eea  a553b27762e1
mds.emfs.ceph-mon03.vhwkrp  ceph-mon03         running (22s)    18s ago  22s    17.3M        -  20.2.1   fb63cba66eea  a7c970d525ab
[root@ceph-mgr ~]#

metadata serverが準備出来てファイルシステムを用意します

[root@ceph-mgr ~]# ceph osd lspools
1 .mgr
2 emfs-meta
3 emfs-data-default
4 emfs-data-ec
[root@ceph-mgr ~]#
[root@ceph-mgr ~]# ceph fs new emfs emfs-meta emfs-data-default    # まずは replicatedなpoolのみで emfs ファイルシステムを作り
[root@ceph-mgr ~]# ceph osd pool set emfs-data-default bulk true
[root@ceph-mgr ~]# ceph fs ls
name: emfs, metadata pool: emfs-meta, data pools: [emfs-data-default ]
[root@ceph-mgr ~]#
 
(次に ec のpoolを追加)
[root@ceph-mgr ~]# ceph fs add_data_pool emfs emfs-data-ec
[root@ceph-mgr ~]# ceph fs ls
name: emfs, metadata pool: emfs-meta, data pools: [emfs-data-default emfs-data-ec ]      <--- 2つのdata poolが見えます
[root@ceph-mgr ~]#

っでceph -sで様子をみると

[root@ceph-mgr ~]# ceph -s
  cluster:
    id:     9ce2eb0a-355d-11f1-a713-bc241165abf5
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-mon01,ceph-mon03,ceph-mon02 (age 17h) [leader: ceph-mon01]
    mgr: ceph-mon01.oedwwx(active, since 17h), standbys: ceph-mgr.nwgopq
    mds: 1/1 daemons up, 1 standby
    osd: 6 osds: 6 up (since 78m), 6 in (since 78m)
 
  data:
    volumes: 1/1 healthy
    pools:   4 pools, 209 pgs
    objects: 24 objects, 579 KiB
    usage:   285 MiB used, 300 GiB / 300 GiB avail
    pgs:     209 active+clean
 
[root@ceph-mgr ~]#

これで一応ファイルシステムは構築完了
あとは作ったファイルシステムに subvolumegroup/subvolume を設けてその地点をexportさせる.
subvolumegroup/subvolume の場所で「replicated」なpoolか「erasure code」なpoolかを選べます。これが一番大事かな.

subvolumegroup/subvolume

こうして提供される emfs であるが、その配下に /emfs/people とか mkdir で作るのはもったいない.
cephでは、subvolumegroup/subvolume で作ったサブフォルダに対しては、個別にクォータ(容量制限),スナップショット,パフォーマンス制御(ec or replicated)を設けられる.
subvolumegroupとsubvolumeの2つのフォルダ特性を持たせられる。

項目subvolumegroupsubvolumemkdir (通常のディレクトリ)
役割グルーピング実データ領域単なる整理(フォルダ)
中身subvolumeを持つファイル・フォルダを持つファイルやディレクトリを持つ
クォータグループ単位で可能個別に可能一応可能だが管理しにくい
スナップショット基本しないできる基本できない(単体では不可)
利用単位管理者目線ユーザ/アプリ目線ユーザー目線(軽い用途)
LVMに例えるとVolumeGroupLogicalVolume単なるmkdir
分けるものproject,data,backupユーザ領域,プロジェクト領域,長期データ一時データ,日付ディレクトリ,軽い整理

例えば下記のようなフォルダ構成なら

/emfs
 ├ people    ← subvolumegroup
 │   ├ userA (subvolume)
 │   │   ├ documents  (mkdir)
 │   │   ├ download   (mkdir)
 │   │   └ picture    (mkdir)
 │   └ userB (subvolume)
 ├ project   ← subvolumegroup
 │   ├ group1 (subvolume)
 │   └ group2 (subvolume)
 │
 └ data      ← subvolumegroup
     ├ group1 (subvolume)
     │    └ MMYYDD (mkdir)
     └ group2 (subvolume)

作り方:

ceph fs subvolumegroup create emfs people     --pool_layout emfs-data-ec         # 「--pool_layout」で 使用するpoolが適用できます
ceph fs subvolumegroup create emfs project    --pool_layout emfs-data-ec         # 容量効率が高いECを当てたり
ceph fs subvolumegroup create emfs data       --pool_layout emfs-data-default    # 速度が速い replicated を当てたりします
 
[people配下]
ceph fs subvolume create emfs userA --group_name people --pool_layout emfs-data-default  # 親のpoolとは違うpoolを割り当てられる
ceph fs subvolume create emfs userB --group_name people
 
[project配下]
ceph fs subvolume create emfs group1 --group_name project
ceph fs subvolume create emfs group2 --group_name project
 
[data配下]
ceph fs subvolume create emfs group1 --group_name data
ceph fs subvolume create emfs group2 --group_name data

とにかく管理面からも運用的には/emfsの配下には subvolumegrop でフォルダを作るのが大事

ceph client

作ったcephストレージをmountしてみます.
まずはcephのプログラムを入れます. レポジトリから始めます.

[root@ceph-client ~]# cat <<_EOF_> /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph $basearch
baseurl=https://download.ceph.com/rpm-tentacle/el9/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.gpg
 
[Ceph-noarch]
name=Ceph noarch
baseurl=https://download.ceph.com/rpm-tentacle/el9/noarch
enabled=1
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.gpg
_EOF_
[root@ceph-client ~]# dnf install epel-release -y
[root@ceph-client ~]# dnf install ceph-common -y

その後にマウントする部分のキーリングを管理ノードで作ります

[root@ceph-mgr ~]# ceph fs subvolumegroup getpath emfs people
/volumes/people
[root@ceph-mgr ~]# ceph fs authorize emfs client.r9-people /volumes/people rwp   <-- 読み書きのみなら「rw」でいいがクオータを含めるなら「rwp」とします
あるいは
[root@ceph-mgr ~]# ceph auth get-or-create client.r9-people \
    mon 'allow r fsname=emfs' \
    osd 'allow rw pool=emfs-data-default' \
    mds 'allow rwp fsname=emfs path=/volumes/people, allow rw fsname=emfs path=/'
[root@ceph-mgr ~]#

「osd 'allow rw pool=emfs-data-default'」でpoolが選べます. mdsで2つのallowがあるが、クオータ対応が/volumes/people以下なので
作ったキーリングは「ceph auth ls」で確認できます

[root@ceph-mgr ~]# ceph auth ls
 :
client.r9-people
        key: AQDerNtpS1gVAxAAWPWX8Ak7SJOogG2bboDFgA==
        caps: [mds] allow rwp fsname=emfs path=/volumes/people, allow rw fsname=emfs path=/
        caps: [mon] allow r fsname=emfs
        caps: [osd] allow rw pool=emfs-data-default
 :
[root@ceph-mgr ~]# (削除) ceph auth del client.r9-people

このキーリングのkey部分を client の「/etc/ceph/ceph.client.r9-people.keyring」に貼り付けます

[root@ceph-client ~]# cat <<EOF > /etc/ceph/ceph.client.r9-people.keyring
[client.r9-people]
    key = AQDerNtpS1gVAxAAWPWX8Ak7SJOogG2bboDFgA==
EOF
[root@ceph-client ~]#

そしてmountに最低限必要な ceph.conf を用意します

[root@ceph-client ~]# ssh root@ceph-mgr "ceph config generate-minimal-conf" | tee /etc/ceph/ceph.conf

っでmountを試みます

[root@ceph-client ~]# mount -t ceph ceph-mon01:/volumes/people /mnt -o name=r9-people,fs=emfs
 
or
[root@ceph-client ~]# mount -t ceph :/volumes/people /mnt -o name=r9-people,fs=emfs
 
[root@ad ~]# df -Tht ceph
Filesystem                   Type  Size  Used Avail Use% Mounted on
192.168.0.48:/volumes/people ceph  300G  288M  300G   1% /mnt
[root@ad ~]#

先ほどのフォルダ構成でmountを行う場合は subvolume 単位でmount pointを作る必要があります。
なのでまずはsubvolumeでのceph側パスを確認します

[root@ceph-mgr ~]# ceph fs subvolume getpath emfs userA --group_name people
/volumes/people/userA/9e24b578-926f-4018-948e-e9ad8bdf5c70
 
[root@ceph-mgr ~]# ceph fs subvolume getpath emfs userB --group_name people
/volumes/people/userB/f46ced07-39fb-4bd3-a352-0e9d9c231c51
 
[root@ceph-mgr ~]#

そうなると/etc/fstabとかでは

ceph-mon01:/volumes/people/userA/9e24b578-926f-4018-948e-e9ad8bdf5c70 /home/userA ceph defaults,name=r9-people,fs=emfs
ceph-mon01:/volumes/people/userB/f46ced07-39fb-4bd3-a352-0e9d9c231c51 /home/userB ceph defaults,name=r9-people,fs=emfs

と記載します

autofsでmountなら

[direct map]
[root@ceph-client ~]# cat /etc/auto.master
/- /etc/auto.home --timeout=60
 
[root@ceph-client ~]# cat /etc/auto.home
/home       -fstype=ceph,name=r9-people,fs=emfs  ceph-mon01:/volumes/people
/home/userA -fstype=ceph,name=r9-people,fs=emfs  ceph-mon01:/volumes/people/userA/9e24b578-926f-4018-948e-e9ad8bdf5c70
/home/userB -fstype=ceph,name=r9-people,fs=emfs  ceph-mon01:/volumes/people/userB/f46ced07-39fb-4bd3-a352-0e9d9c231c51
[root@ceph-client ~]#

そして

[root@ceph-client ~]# systemctl enable autofs --now

cephのshutdown/startup

shutdown 手順
全てのcephクライアントからcephマウントを外す
 
(ceph fs set emfs max_mds 1)
ceph fs set emfs down true
ceph fs set emfs joinable false
ceph fs fail emfs
 
ceph osd set noout
ceph osd set norebalance
ceph osd set nobackfill
ceph osd set norecover
ceph osd set noautoscale

ceph fs set emfs max_mds 1 # 複数でmdsが動いているなら. ceph -sで「mds: 1/1 daemons up, 1 standby」ならこれは不要
ceph fs set emfs down true # mdsを正常にシャットダウン状態にする
ceph fs set emfs joinable false # mdsの自動起動の停止
ceph fs fail emfs # 現在のMDSを確実に落とす
厳密には「まずルール(joinable false)を決めてから、動作(down true)を止める」 という手順は、予期せぬ自動昇格を防ぐ意味で非常に安全なアプローチなのですが、
まぁ最終的には同じ
ceph fs set emfs joinable false (まず「新しいMDSは参加させない」というルールを敷く)
ceph fs set emfs down true (稼働中のMDSを正常終了プロセスに移行させる)
ceph fs fail emfs (念のため、完全に停止したことを確定させる)

start-up 手順
monを起動して、クォーラムを成立させる
mgrを起動
osdを起動
 
ceph osd stat で全てのosd(hdd/ssd)の起動を確認して、「up」になっているかを確認
ceph -s でHEALTH_OK でありフラグの警告のみであることを確認. active+clean になるのを待つ
 
---
もし「active+recovering+degraded」でずっと止まっているなら
先行して
ceph osd unset norecover
ceph osd unset nobackfill
を実施します。これですてのpgsが「active+clean」なにのを確認する
----
 
 
ceph osd unset noout
ceph osd unset norebalance
ceph osd unset nobackfill
ceph osd unset norecover
ceph osd unset noautoscale
 
ceph fs set emfs joinable true
ceph fs set emfs down false
 
mdsがactiveであることを確認
ceph mountを実行して完了
最新の60件
2026-04-22 2026-04-21 2026-04-20 2026-04-17 2026-04-16
  • Ceph
2026-04-12 2026-04-08 2026-04-06 2026-04-05 2026-04-04 2026-04-02 2026-03-26 2026-03-23 2026-03-21 2026-03-19 2026-03-15 2026-03-14 2026-03-13 2026-03-07 2026-03-06 2026-03-04 2026-03-02 2026-02-26 2026-02-24 2026-02-21 2026-02-18 2026-02-17 2026-02-16 2026-02-11 2026-02-09 2026-02-07 2026-02-06 2026-02-03 2026-02-02 2026-01-31 2026-01-26 2026-01-24

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2026-04-16 (木) 01:55:04