Cephでブロックデバイス（RBD）を作る

# はじめに

分散ストレージのオープンソフトウェアの[Ceph](https://docs.ceph.com/en/quincy/)には、以下の3つのインターフェイスが用意されています。

※それぞれどのようなものかは筆者のざっくりとした認識で書いており間違っているかもしれません。

* (1) RADOS（Reliable Autonomic Distributed Object Store）
    * オブジェクトストレージ。AWSでいうS3、AzureだとBlob Storageのようなもの
* (2) RBD（RADOS Block Device）
    * デバイス。パソコンの内蔵ハードディスクや外付けハードディスクのようなもの(``/dev/sda``として認識されるような感じ)
* (3) CephFS(Ceph File System)
    * ネットワーク経由で他のマシンと共有可能なファイルシステム。Samba(CIFS)、NFSのようなもの

またストレージの拡張や、データを冗長化して障害に耐えられる機能も備えています。変幻自在で何とも興味深いCeph！
（ちょっと興奮してしまいましたが...、話はインターフェイスに戻ります。）上記3つのインターフェイスで、(3)のCephFSについては[こちらの記事](https://qiita.com/showchan33/items/b5845bd634f0e69f832e)で試して動作確認できました。

今回は(2)のRBDが使えるか試してみたので、その手順をご紹介します。

# 前提条件
下記の記事（筆者記事になりますが）などを参考にCephをセットアップして、OSDが追加できていることが前提となります。

https://qiita.com/showchan33/items/b5845bd634f0e69f832e

# 手順

## RBDおよびイメージの作成

[BASIC BLOCK DEVICE COMMANDS](https://docs.ceph.com/en/quincy/rbd/rados-rbd-cmds/)の手順を参考に作っていきます。

イメージ作成用のpoolをまずは作成します。本例では``rbd-pool``という名前にしています。
```
$ sudo ceph osd pool create rbd-pool
pool 'rbd-pool' created
```
念のため、poolが作られたことを確認します。
```
$ sudo ceph osd lspools
3 rbd-pool
```
poolをRBDとして使うための初期化を行います。
```
$ sudo rbd pool init rbd-pool
```
RBDのイメージを作成します。以下の例ではイメージのサイズを1GiBにしています。
```
$ sudo rbd create --size 1024 rbd-pool/rbd1
```
イメージが出来ていることを確認します。
```
$ sudo rbd ls rbd-pool
rbd1
```
より詳細な情報は以下のように見れます。
```
$ sudo rbd info rbd-pool/rbd1
rbd image 'rbd1':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 121b341b48e3a
	block_name_prefix: rbd_data.121b341b48e3a
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features:
	flags:
	create_timestamp: Sun Feb  5 16:47:04 2023
	access_timestamp: Sun Feb  5 16:47:04 2023
	modify_timestamp: Sun Feb  5 16:47:04 2023
```

## RBDにアクセス可能なユーザの作成

次のようなコマンドで、RBDにアクセス可能なユーザを作成します。本例では``rbduser``という名前で作っています。
keyが標準出力され、``/etc/ceph/ceph.client.rbduser.keyring``にも同時にその内容を保存しています。
```
$ sudo ceph auth get-or-create client.rbduser \
mon 'profile rbd' \
osd 'profile rbd pool=rbd-pool' \
mgr 'profile rbd pool=rbd-pool' \
| sudo tee /etc/ceph/ceph.client.rbduser.keyring
(出力結果)
[client.rbduser]
	key = AQDk...
```

作成したユーザは次のように確認可能です。
```
$ sudo ceph auth list
...
client.rbduser
	key: AQDk...
	caps: [mgr] profile rbd pool=rbd-pool
	caps: [mon] profile rbd
	caps: [osd] profile rbd pool=rbd-pool
...
```

## RBDMAPの実行

[RBDMAPのEXAMPLES](https://docs.ceph.com/en/quincy/man/8/rbdmap/#examples)の内容を参考にして、作成したイメージをデバイスとして認識させるためのコマンドを以下のように実行します。
引数として、前の手順で作成したユーザの認証情報が必要です。
```
$ sudo rbd map rbd-pool/rbd1 \
--id rbduser \
--keyring /etc/ceph/ceph.client.rbduser.keyring
(出力結果)
/dev/rbd0
```

出力結果が``/dev/rbd0``となりました。確かにrbd0のデバイスが作られています！
```
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
...
rbd0        252:0    0     1G  0 disk
...
```

## マウントしてみる

作成したデバイス``/dev/rbd0``は、普通のHDDと同じような感覚でマウントできます。実際にやってみましょう。

まずはマウントするためのファイルシステムを作ります。本例ではXFSにしています。
```
$ sudo mkfs.xfs /dev/rbd0
(出力結果)
meta-data=/dev/rbd0              isize=512    agcount=8, agsize=32768 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=16     swidth=16 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=16 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
```

FSを作った後は、以下のようにマウントできます。
```
$ mkdir /path/to/dir
$ sudo mount /dev/rbd0 /path/to/dir -v
mount: /dev/rbd0 mounted on /path/to/dir.
```
マウントできたかの確認。
```
$ df -h
...
/dev/rbd0           1014M   40M  975M   4% /path/to/dir
...
```

# おわりに
Cephを試して間もなく大した知識もノウハウもないですが、非常に興味深い印象です！