Ubuntu 20.04 で DRBD 9 を動かそうとしてハマった話

DRBD9クラスタを組もうとしたらハマってしまったメモ。

## はじめに:ざっくりDRBDとは
複数のサーバ間でブロックデバイスをミラーリングする分散ストレージシステム。
コア機能はカーネルモジュールとして実装されている。
単体ではあまり使われず、Pacemaker等のクラスタ管理ソフトウェアと組み合わせて使うのが一般的。
DRBD 8.4 → 9.0 で大幅な機能追加が行われた。

## 何が起きたか
[公式ドキュメント](https://linbit.com/drbd-user-guide/drbd-guide-9_0-en/#s-install-pkgs-ubuntu_linux)に従ってDRBD9のパッケージを入れたのにDRBD9の機能が使えない。

環境:
Ubuntu 20.04 on Vagrant (Box: bento/ubuntu-20.04 (virtualbox, 202107.28.0))

やったこと:

```sh
# DRBD9インストール
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt update
sudo apt install drbd-utils drbd-dkms

# resource作成
cat << EOS | tee /etc/drbd.d/r01.res
resource r01 {
 protocol C;
 meta-disk internal;
 device /dev/drbd1;
 syncer {
  verify-alg sha1;
 }
 on node1 {
  disk   /dev/vg01/lvdrbd;
  address  192.168.222.91:7789;
 }
 on node2 {
  disk   /dev/vg01/lvdrbd;
  address  192.168.222.92:7789;
 }
 on node3 {
  disk   /dev/vg01/lvdrbd;
  address  192.168.222.93:7789;
 }
}
EOS

# カーネルモジュールをロード
sudo modprobe drbd

# resourceのメタデータを作成
sudo drbdadm create-md r01
#> initializing activity log
#> initializing bitmap (32 KB) to all zero
#> Writing meta data...
#> New drbd meta data block successfully created.
#> success

# resource up
sudo drbdadm up r01
#> /etc/drbd.d/r01.res:1: in resource r01:
#>         There are multiple host sections for the peer node.
```

リソース起動時に設定ファイルがおかしいと怒られた。

## 解決に至るまで
3ノード以上での構成はDRBD9からサポートされた機能で、DRBD8.4以前では2ノードまでの構成でしかリソースを作成できない。
また、試しに2ノード構成の設定に書き換えてみるとエラーは発生しなかった。つまり何らかの理由で8.4系のDRBDが内部で動いていることになる。

ということでバージョンを確認してみる。

```sh
drbdadm --version
#> DRBDADM_BUILDTAG=GIT-hash:\ 856c13e97e974f8e0dec77dd3738372d4c234d2e\ build\ by\ buildd@lgw01-amd64-029\,\ 2021-11-19\ 09:10:27
#> DRBDADM_API_VERSION=1
#> DRBD_KERNEL_VERSION_CODE=0x08040b
#> DRBDADM_VERSION_CODE=0x091301
#> DRBDADM_VERSION=9.19.1
```

drbdadmはok

```sh
cat /proc/drbd
#> version: 8.4.11 (api:1/proto:86-101)
#> srcversion: FC3433D849E3B88C1E7B55C
#> 
#>  1: cs:StandAlone ro:Secondary/Unknown ds:Inconsistent/DUnknown   r----s
#>     ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1044412
```

動作中のDRBDカーネルモジュールがどういうわけか8.4になっている。
ので、今度はカーネルモジュールの依存関係やら提供元パッケージを調べてみる。

```sh
modprobe -D drbd
#> builtin crc32c_intel
#> builtin crc32c_generic
#> insmod /lib/modules/5.4.0-80-generic/kernel/lib/libcrc32c.ko
#> insmod /lib/modules/5.4.0-80-generic/kernel/lib/lru_cache.ko
#> insmod /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko

dpkg -S /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko
#> linux-modules-extra-5.4.0-80-generic: /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko
```

パッと見た感じ`linux-modules-extra-*`に付いているDRBDモジュール(恐らくOS標準付属の)が呼ばれているようである。
カーネルモジュールは`drbd-dkms`パッケージに含まれるはずなので何かおかしい。

試しに`drbd-dkms`パッケージを再インストールしてみると...

```sh
sudo apt install --reinstall drbd-dkms
#> ~出力略~
#> Unpacking drbd-dkms (9.1.5-1ppa1~focal1) over (9.1.5-1ppa1~focal1) ...
#> Setting up drbd-dkms (9.1.5-1ppa1~focal1) ...
#> Loading new drbd-9.1.5-1ppa1~focal1 DKMS files...
#> Building for 5.4.0-80-generic
#> Module build for kernel 5.4.0-80-generic was skipped since the
#> kernel headers for this kernel does not seem to be installed.
```

> Module build for kernel 5.4.0-80-generic was skipped since the
kernel headers for this kernel does not seem to be installed.

「カーネルヘッダ入ってないからモジュールのビルドはスキップしたで✋」ということらしい。
言われたとおりカーネルヘッダのパッケージをインストールしてみる。

```
sudo apt install linux-headers-$(uname -r)
```

インストール中のログ↓を見る限りdrbdのモジュールのビルドも走っている様子

```plaintext
~
Building module:
cleaning build area...
make -j4 KERNELRELEASE=5.4.0-80-generic -C src/drbd KDIR=/lib/modules/5.4.0-80-generic/build........
cleaning build area...

DKMS: build completed.

drbd.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.4.0-80-generic/updates/dkms/
~
```

ビルドはできたようだが、この時点ではまだ8.4のモジュールが動いたままなので一旦取り外す。

```sh
sudo drbdadm down r01
sudo modprobe -r drbd
```

モジュールを再読み込み。

```sh
sudo modprobe drbd
cat /proc/drbd
#> version: 9.1.5 (api:2/proto:110-121)
#> GIT-hash: f41bc23cec1e919932ce35947f1b4e67d9e6db74 build by root@node1, 2022-01-05 15:56:18
#> Transports (api:17):
```

これで、無事DRBD9のカーネルモジュールで動くようになった

## 感想
カーネルモジュール周りのいい勉強になりました。
ログはちゃんと見よう。