Ubuntu Weekly Recipe

第895回MicroCephで作る⁠ご家庭向け高可用性分散ストレージ

Cephとは、オープンソースの分散ストレージシステムです。複数のサーバーを束ねることで、高可用性を実現します。Cephの特徴のひとつが、クライアントが計算によってデータの配置場所を決定する点です。中央管理サーバーを介さずにデータを管理できるため、容量のスケールがしやすくなっています。

Cephはその拡張性と柔軟性により、大規模なデータの保存が求められる現場でよく使われています。例えばクラウド基盤のバックエンドストレージや、S3互換のオブジェクトストレージなどは、Cephが選択される代表的な例でしょう。

MicroCephとは

Cephは非常に便利な分散ストレージですが、分散システム特有の面倒くささもあります。そのため小規模な環境で使おうとすると、利便性よりも構築や運用にかかるコストが上回ってしまうこともありがちです。

そこでお勧めしたいのが、MicroCephです。MicroCephとは、Canonicalが開発しているCephのオーケストレーションツールです。Snapパッケージで提供されており、シンプルなCephクラスターを簡単にデプロイできます。

「小規模環境ならRAIDで十分では?」と思われるかもしれません。たしかにRAIDであれば、シングルノードでストレージの冗長性を確保できます。ですがRAIDを組むには、物理的なストレージ搭載数という問題が出てきます。たとえば近年人気のミニPCをサーバーに流用しようとすると、3.5インチHDDを搭載できなかったり、M.2 SSDのスロット数に限りがあったりといった制約に突き当たります。またRAIDの場合、サーバーそのものが単一障害点となってしまいます。このような場合も、ミニPCを複数台用意してCephクラスターを構築すれば、高可用性と容量を両立したストレージサーバーを安価に構築できるというわけです。

今回はMicroCephを使い、家庭内に小規模なCephクラスターを構築する方法を紹介します。

MicroCephの動作環境

MicroCephの動作環境としては、2コアのCPUと4GiBのメモリが要求されます。セットアップ時にはインターネット接続も必要です。またCephには、ループファイルやパーティションではなく、物理的なストレージをまるごと割り当てることが推奨されています。そのためOSをインストールするSSDとは別に、Ceph用に2台目のSSDを搭載しておきましょう。なおCeph自体が冗長性を提供するため、RAIDは不要です。

Cephクラスターを構築するには、最低3台のノードが必要です[1]。今回は以下を満たすノードを3台用意しました(なお物理マシンを用意できなかったため、ProxmoxVE上のVMを使って動作確認をしています⁠⁠。またノード間通信のため、いくつかのTCPポートを開放する必要があります。今回は自宅LAN内ということもあり、ファイアウォールは無効化していますが、もしファイアウォールを使用する場合は、ドキュメントを参考に、ポートを開放してください。

  • 2コア以上のCPU
  • 4GiB以上のメモリ
  • 12GiBのディスクスペース(システム領域)
  • Cephに割り当てるSSD
  • インターネット接続(パッケージインストール用)

MicroCephクラスターのセットアップ

OSは最新のLTSが推奨されているため、すべてのノードにUbuntu 24.04をインストールしました。便宜上、それぞれのノードを「ceph1」⁠ceph2」⁠ceph3」と呼称します。

すべてのノードで、以下のコマンドを実行し、microcephパッケージをインストールしてください。また意図しないアップデートによるトラブルを回避するためにも、バージョンをホールドすることが推奨されています[2]

$ sudo snap install microceph
$ sudo snap refresh --hold microceph

ceph1ノードで、以下のコマンドを実行してください。クラスターの初期化を行います。

$ sudo microceph cluster bootstrap

続いてceph2ノードとceph3ノードをクラスターに参加させるためのトークンを発行します。ceph1ノードで以下のコマンドを実行してください。

$ sudo microceph cluster add ceph2
$ sudo microceph cluster add ceph3

するとトークン文字列が表示されますので、それぞれ控えておいてください。なおこのトークン文字列は、シークレット、フィンガープリント、Join先のアドレスを含んだJSONをbase64エンコードしたものになります。

ceph2およびceph3ノードで、それぞれ以下のコマンドを実行してください。トークンはノードごとに違うため、取り違えないよう注意しましょう。

$ sudo microceph cluster join そのノード用のトークン

これで3台のノードによるCephクラスターができました。

ストレージの追加

できたばかりのCephクラスターには、まだストレージがありません。各ノードに搭載されているCeph用のSSDを、クラスターから利用できるようにしましょう。

まずノードに搭載されている、未フォーマットのストレージを調べましょう。以下のコマンドを実行してください。ストレージの名前や容量と、デバイスファイルのパスが表示されますので、このパスを控えておきましょう。

$ sudo microceph disk list

Available unpartitioned disks on this system:
+---------------+----------+------+------------------------------------------------------+
|     MODEL     | CAPACITY | TYPE |                         PATH                         |
+---------------+----------+------+------------------------------------------------------+
| QEMU HARDDISK | 64.00GiB | scsi | /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 |
+---------------+----------+------+------------------------------------------------------+

続いて以下のコマンドで、ストレージをCephに追加します。これをceph1/2/3すべてのノードで行ってください。

$ sudo microceph disk add /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1

追加が完了したら、⁠microceph disk list」をもう一度実行してみましょう。以下のように、各ノードで追加された3台のストレージがconfiguredとして見えていればOKです。

$ sudo microceph disk list
Disks configured in MicroCeph:
+-----+----------+------------------------------------------------------+
| OSD | LOCATION |                         PATH                         |
+-----+----------+------------------------------------------------------+
| 1   | ceph3    | /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 |
+-----+----------+------------------------------------------------------+
| 2   | ceph1    | /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 |
+-----+----------+------------------------------------------------------+
| 3   | ceph2    | /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 |
+-----+----------+------------------------------------------------------+

「microceph.ceph df」コマンドを実行すると、現在のストレージとPool(後述)の詳細が確認できます。今回は64GBのストレージを3ノードぶん束ねたため、合計で192GBのストレージが見えています[3]。現時点でPoolは作成していないため、Ceph Managerデーモンが内部で利用する「.mgr」Poolのみが確認できました。

$ sudo microceph.ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL    USED  RAW USED  %RAW USED
TOTAL  192 GiB  192 GiB  83 MiB    83 MiB       0.04
 
--- POOLS ---
POOL  ID  PGS   STORED  OBJECTS     USED  %USED  MAX AVAIL
.mgr   1    1  577 KiB        2  1.7 MiB      0     61 GiB

ファイルシステムの作成

それではCephをLinuxからマウントして利用できるよう、ファイルシステムを作成していきましょう。

Cephでは物理的なストレージを束ねた上に、⁠データをどのように扱うか」を決めた、論理的なグループを作成します。これをPoolと呼びます。CephFSとしてファイルシステムアクセスするためには、メタデータとデータ本体を保存するため、それぞれ独立したPoolを用意します。以下のコマンドを実行して、⁠cephfs_meta」「cephfs_data」というPoolを作成してください[4]

$ sudo microceph.ceph osd pool create cephfs_meta
$ sudo microceph.ceph osd pool create cephfs_data

Poolを作成しただけでは、まだファイルシステムとして使うことはできません。続いて以下のコマンドを実行して、紐づけを行います。

$ sudo microceph.ceph fs new cephfs cephfs_meta cephfs_data

これで「cephfs」というファイルシステムが作成されました。⁠microceph.ceph fs ls」を実行すると、⁠cephfs」というファイルシステムは、メタデータPoolに「cephfs_meta⁠⁠、データPoolに「cephfs_data」が使われていることが改めて確認できます。

$ sudo microceph.ceph fs ls
name: cephfs, metadata pool: cephfs_meta, data pools: [cephfs_data ]

「microceph.ceph fs get cephfs」コマンドで、ファイルシステムのより詳細な情報を確認できます。

$ sudo microceph.ceph fs get  cephfs
Filesystem 'cephfs' (1)
fs_name cephfs
epoch   6
flags   12 joinable allow_snaps allow_multimds_snaps
created 2026-01-09T01:36:52.754379+0000
modified        2026-01-09T01:36:54.101978+0000
tableserver     0
root    0
session_timeout 60
session_autoclose       300
max_file_size   1099511627776
max_xattr_size  65536
required_client_features        {}
last_failure    0
last_failure_osd_epoch  0
compat  compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,7=mds uses inline data,8=no anchor table,9=file layout v2,10=snaprealm v2,11=minor log segments,12=quiesce subvolumes}
max_mds 1
in      0
up      {0=24117}
failed
damaged
stopped
data_pools      [3]
metadata_pool   2
inline_data     disabled
balancer
bal_rank_mask   -1
standby_count_wanted    1
qdb_cluster     leader: 24117 members: 24117
[mds.ceph3{0:24117} state up:active seq 549 addr [v2:192.168.1.93:6800/4274409479,v1:192.168.1.93:6801/4274409479] compat {c=[1],r=[1],i=[1fff]}]

CephをバックエンドにしたSambaを構築する

ここまでの手順で、Ceph上にファイルシステムが作成できました。応用例として、このファイルシステムを別サーバーからマウントし、そのディレクトリをSambaで共有してみましょう。もちろんCephをインストールしたサーバーのいずれかに、Sambaを直接インストールしてもかまいません。ただしバックエンドとなるストレージサーバーと、前段に位置するサーバーは分離するほうが運用しやすく、定番です。そのため本記事では、別サーバーを用意してSambaをインストールすることにします。

まずCephを利用するため、クラスター上にユーザーを作成します。以下のコマンドを実行してください。

$ sudo microceph.ceph auth get-or-create client.samba mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_meta'

「auth」は、Cephの認証システムを操作するサブコマンドです。⁠get-or-create」はその名の通り、指定されたユーザーを作成するか、既に存在すれば情報を表示するオプションです。ここではユーザー名として「client.samba」を指定しています。それ以降は、クラスターの各サービスに対する権限を指定しています。⁠mon 'allow r'」は、クラスターのマップを読む権限、⁠mds 'allow rw'」はフォルダの作成といったメタデータの読み書き権限、⁠osd 'allow rw pool=〜'」はデータプールに対する実際の読み書き権限です。対象を絞るため、具体的なPool名も指定しています。

コマンドを実行すると、以下のようにキーが出力されます。これを控えておいてください。

[client.samba]
        key = AQCCXWBpqad...(略)

以降はSambaサーバー側での作業になります。同じネットワーク上に、Ubuntu 24.04のサーバーをもう1台用意してください。まずはCephをマウントできるよう、ceph-commonパッケージをインストールします。

$ apt install ceph-common

認証情報を設定ファイルに保存しておきましょう。⁠/etc/ceph/ceph.client.samba.keyring」というファイルを作成し、先ほど控えたキーを書き込みます。他のユーザーに読まれないよう、パーミッッションは600に変更しておくとよいでしょう。

$ cat << EOF | sudo tee /etc/ceph/ceph.client.samba.keyring
[client.samba]
        key = AQCCXWBpqad...(略)
EOF

$ sudo chmod 600 /etc/ceph/ceph.client.samba.keyring

Cephのホスト情報も設定ファイルに記述しておくと便利です。⁠/etc/ceph/ceph.conf」というファイルを作成し、[global]セクションに「mon_host = ceph1のIPアドレス,ceph2のIPアドレス,ceph3のIPアドレス」と記述します。⁠192.168.1.9{1..3}」は筆者の例ですので、実際のIPアドレスに書き換えてください。

$ cat << EOF | sudo tee /etc/ceph/ceph.conf
[global]
    mon_host = 192.168.1.91,192.168.1.92,192.168.1.93
EOF

それではCephFSをマウントします。まずはマウントポイントとして「/mnt/ceph」を作成します。

$ sudo mkdir /mnt/ceph

「/etc/fstab」に自動マウントの設定を記述しましょう。ここまで解説した通りにceph.confとkeyringの設定ができていれば、⁠:/ /mnt/ceph ceph name=samba,_netdev,defaults 0 0」と書くだけでOKです。

ここで見なれないマウントオプション「_netdev」が登場しました。これはシステムがネットワークに接続できそうな場合のみ、そのストレージをマウントするためのオプションです。なぜならネットワークストレージは、ネットワーク接続に障害があると、システム起動時にエラーとなってしまうためです[5]

$ sudo cat << EOF | sudo tee -a /etc/fstab
:/ /mnt/ceph ceph name=samba,_netdev,defaults 0 0
EOF

fstabを書き換えているため、一度「systemctl daemon-reload」してから「mount -a」でマウントします。

$ sudo systemctl daemon-reload
$ sudo mount -a

正しくマウントできているか、dfコマンドで確認しておきましょう。

$ df -h /mnt/ceph/
Filesystem                                               Size  Used Avail Use% Mounted on
192.168.1.91:6789,192.168.1.92:6789,192.168.1.93:6789:/   61G     0   61G   0% /mnt/ceph

あとは通常通り、Sambaをインストールして共有設定してあげればよいでしょう。例えば「/mnt/ceph/samba」を作成して、自分用に共有するのであれば、⁠smb.conf」の末尾に以下ように記述するだけです。

[CephStorage]
   path = /mnt/ceph/samba
   browseable = yes
   read only = no
   guest ok = no
   force user = mizuno
図1 別のUbuntuデスクトップから、CephバックエンドのSambaを利用している例

MicroCephを使えば、手軽にCephクラスターを構築し、その動作を試すことができます。本記事で紹介したSambaのバックエンドなど、個人レベルや中小規模の社内システムでも、色々と活用できる場面もあるのではないでしょうか。⁠なんだか面倒くさそう」と、これまでCephを敬遠していた方も、是非一度試してみてください。

おすすめ記事

記事・ニュース一覧