「Ubuntu 20.04でインストールされるdrbdは8.4なのか9.11なのか?」で標準のdrbd 8.4.11と、レポジトリ追加してのdrbd 9.19.1で設定する手法について記載した。
標準のdrbd 8.4.11で使って見るかと設定してみたところ、いくつか問題が発生していた。
その1: 起動時のエラーログ
drbd起動時に下記の様な「/lib/drbd/drbd: line 148: /var/lib/linstor/loop_device_mapping: No such file or directory」というログが出力されている。
root@ubuntu02:~# systemctl status drbd
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/lib/systemd/system/drbd.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2021-12-20 14:07:35 JST; 2s ago
Process: 241197 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 241197 (code=exited, status=0/SUCCESS)
Dec 20 14:07:34 ubuntu02 drbd[241197]: /lib/drbd/drbd: line 148: /var/lib/linstor/loop_device_mapping: No such file or directory
Dec 20 14:07:34 ubuntu02 drbd[241216]: [
Dec 20 14:07:34 ubuntu02 drbd[241216]: create res: alfons
Dec 20 14:07:34 ubuntu02 drbd[241216]: prepare disk: alfons
Dec 20 14:07:34 ubuntu02 drbd[241216]: adjust disk: alfons
Dec 20 14:07:34 ubuntu02 drbd[241216]: adjust net: alfons
Dec 20 14:07:34 ubuntu02 drbd[241216]: ]
Dec 20 14:07:35 ubuntu02 drbd[241258]: WARN: stdin/stdout is not a TTY; using /dev/console
Dec 20 14:07:35 ubuntu02 drbd[241197]: ...done.
Dec 20 14:07:35 ubuntu02 systemd[1]: Finished DRBD -- please disable. Unless you are NOT using a cluster manager..
root@ubuntu02:~#
まず、 /var/lib/linstor ディレクトリは標準状態では存在していない。
root@ubuntu02:~# ls -l /var/lib/linstor
ls: cannot access '/var/lib/linstor': No such file or directory
root@ubuntu02:~#
エラーの出力元の /lib/drbd/drbd の中で /var/lib/linstor/loop_device_mapping はどういう場面で登場しているかを調べる
# Set up/detach linstor loopback devices for LINSTOR file based pools
# FIXME I think setting up these loop device mappings should be done elsewhere,
# and not in the DRBD init file; possibly we need proper support in drbdadm.
handle_linstor_loopback()
{
local line dev file
# || [[ -n $line ]]: in case there is no newline at EOF
while read -r line || [[ -n $line ]] ; do
dev=${line%%:*}
file=${line#*:}
test -f "$file" && test -r "$file" && test -w "$file" || continue
# should -f be allowed?
[[ $dev = loop* ]] || [[ $dev = /dev/loop* ]] || continue
case "$1" in
# what about existing, but "wrong", mappings?
start) losetup "$dev" 2>/dev/null || losetup "$dev" "$file";;
stop) losetup "$dev" 2>/dev/null && losetup -d "$dev";;
esac
done < /var/lib/linstor/loop_device_mapping
# at least we tried.
return 0
}
/var/lib/linstor/loop_device_mapping を入力ファイルとして指定している。
どうやらdrbd起動時に /dev/loop10 = /work/testfile.iso みたいなループデバイスを作るための設定ファイルであるようだ。
ファイルが存在しないことによるログ出力なので、下記で対応した
root@ubuntu02:~# mkdir /var/lib/linstor
root@ubuntu02:~# touch /var/lib/linstor/loop_device_mapping
root@ubuntu02:~#
その2: drbdの降格に失敗する
「drbdadm primary shares」でPrimaryとして動作させたあと、他方のサーバに切り替えるため降格する「drbdadm secondary shares」を実行したところ、「0: State change failed: (-12) Device is held open by someone」というメッセージで失敗した。
root@ubuntu01:~# drbdadm secondary shares
0: State change failed: (-12) Device is held open by someone
Command 'drbdsetup-84 secondary 0' terminated with exit code 11
root@ubuntu01:~#
誰が使っているのかと「lsof /dev/drbd0」を実行してみたところ、multipathdが握っていた。
root@ubuntu01:~# lsof /dev/drbd0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
multipath 4910 root 5r BLK 147,0 0t0 890 /dev/drbd0
root@ubuntu01:~#
まずは単純にmultipathd.socketを停止させてから降格を実施してみる。
root@ubuntu01:~# systemctl stop multipathd.socket
root@ubuntu01:~# drbdadm secondary shares
root@ubuntu01:~#
問題無く降格できた。
というわけで、/dev/drbd0 をmultipathdの対象外とするための設定を作成する。
/etc/mul/etc/multipath.conf に 下記の様な形でblacklist を追加した。
defaults {
user_friendly_names yes
}
blacklist {
devnode "^drbd[0-9]"
}
「multipath -t」を実行すると、初期値などが反映された フル記載の multipathd設定が表示されるので、 blacklist セクションに drbdに関する記述が追加されていることを確認する。
この対処後は、multipathdを起動した状態であっても drbdの降格に成功するようになった。