Установка DRBD9 из исходников на Debian 11
DRBD (Distributed Replicated Block Device — распределённое реплицируемое блочное устройство) — это блочное устройство, предназначенное для построения отказоустойчивых кластерных систем на операционной системе Linux. DRBD занимается полным отражением (mirroring) по сети всех операций с блочным устройством.
Решил разобрать как собрать из исходников пакет DRBD на Debian 11 Bullseye.
В рамках рассматриваемой статьи будет рассмотрено как собрать и установить последние версии на момент написания статьи пакетов DRBD 9.2.9 + DRBD-Utils 9.28.0
, так же необходимо собрать и установить Python с ключом --enable-shared
, в противном случае компиляция модуля DRBD завершится ошибкой.
Установка Python
# Устанавливаем необходимые пакеты зависимостей.
apt-get install g++ gcc make libffi-dev libnss3-dev libssl-dev zlib1g-dev -y
# Скачиваем исходников Python и распаковываем их.
wget https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz
tar -Jxf Python-3.9.19.tar.xz
cd Python-3.9.19
ИНФОРМАЦИЯ. Официальный сайт источник — https://www.python.org/downloads/source
# Собираем и устанавливаем.
./configure --prefix=/usr --enable-optimizations --enable-shared
make && make altinstall
cd ..
Установка DRBD
# Устанавливаем необходимые пакеты зависимостей.
apt-get install g++ gcc make linux-headers-$(uname -r) git flex xsltproc coccinelle libkeyutils-dev -y
# Скачиваем последние версии исходников DRBD (9.2.9)
, DRBD-Utils (9.28.0)
и распаковываем их.
wget https://pkg.linbit.com//downloads/drbd/9/drbd-9.2.9.tar.gz
wget https://pkg.linbit.com//downloads/drbd/utils/drbd-utils-9.28.0.tar.gz
tar -zxvf drbd-9.2.9.tar.gz
tar -zxvf drbd-utils-9.28.0.tar.gz
ИНФОРМАЦИЯ. Официальный сайт с дистрибутивами — https://pkg.linbit.com//downloads/drbd
Либо последние версии исходников можно склонировать с git репозитория:
git clone --recursive https://github.com/LINBIT/drbd.git
git clone --recursive https://github.com/LINBIT/drbd-utils.git
# Компилируем и устанавливаем DRBD.
cd drbd-9.2.9
make
make install
cd ..
# Загружаем модуль DRBD в ядро.
modprobe drbd
Проверим загружен ли модуль DRBD.
cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 07B2B73308F5B02A759D097
lsmod | grep drbd
drbd 421888 0
lru_cache 16384 1 drbd
libcrc32c 16384 1 drbd
Установка утилит DRBD
Утилиты DRBD предоставляют необходимые инструменты для управления устройствами DRBD.
# Собираем и устанавливаем DRBD-Utils.
cd drbd-utils-9.28.0
./configure --prefix= --with-systemdunitdir=/etc/init.d --without-manual
make
make install
Если нужно скомпилировать с документацией, то нужно установить дополнительные пакеты зависимостей и конфигурировать без ключа
--without-manual
.
apt-get install docbook-xsl xsltproc po4a
# Настройка скрипта запуска DRBD, копирование его и файла описания сервиса в каталог системных служб и добавляем сервис DRBD в автозагрузку.
sed -i 's/^# Default-Start:.*$/# Default-Start: 2 3 4 5/' scripts/drbd
sed -i 's|/lib/drbd/scripts/drbd|/lib/drbd/drbd|g' scripts/drbd.service
cp scripts/drbd /etc/init.d/drbd
cp scripts/drbd /lib/drbd/drbd
cp scripts/drbd.service /usr/lib/systemd/system/drbd.service
update-rc.d drbd defaults
systemctl enable drbd
# Запускаем DRBD и проверяем статус запуска службы.
systemctl start drbd && 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 Tue 2024-05-21 15:49:05 MSK; 4s ago
Process: 30800 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 30800 (code=exited, status=0/SUCCESS)
CPU: 19ms
мая 21 15:49:05 c1 systemd[1]: Starting DRBD -- please disable. Unless you are NOT using a cluster manager....
мая 21 15:49:05 c1 drbd[30800]: Starting DRBD resources:
мая 21 15:49:05 c1 drbd[30807]: no resources defined!
мая 21 15:49:05 c1 drbd[30808]: no resources defined!
мая 21 15:49:05 c1 drbd[30811]: WARN: stdin/stdout is not a TTY; using /dev/consoleWARN: stdin/stdout is not a TTY; using /dev/console
мая 21 15:49:05 c1 drbd[30814]: no resources defined!
мая 21 15:49:05 c1 drbd[30800]: .
мая 21 15:49:05 c1 systemd[1]: Finished DRBD -- please disable. Unless you are NOT using a cluster manager..
Troubleshooting
Опишу некоторые моменты с которыми столкнулся в процессе сборки и установки пакета DRBD, может кому будут полезны.
Момент 1.
Сперва я собирал утилиты DRBD-Utils 9.27.0
и обратил внимание при использовании поставляемого init-скрипта drbd этой версии в выводе запущенного процесса 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 Tue 2024-05-21 12:02:24 MSK; 4s ago
Process: 37043 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 37043 (code=exited, status=0/SUCCESS)
CPU: 68ms
мая 21 12:02:24 c2 systemd[1]: Starting DRBD -- please disable. Unless you are NOT using a cluster manager....
мая 21 12:02:24 c2 drbd[37043]: Starting DRBD resources:/lib/drbd/drbd: строка 148: /var/lib/linstor/loop_device_mapping: Нет такого файла или каталога
мая 21 12:02:24 c2 drbd[37054]: no resources defined!
мая 21 12:02:24 c2 drbd[37055]: no resources defined!
мая 21 12:02:24 c2 drbd[37058]: WARN: stdin/stdout is not a TTY; using /dev/consoleWARN: stdin/stdout is not a TTY; using /dev/console
мая 21 12:02:24 c2 drbd[37043]: .
мая 21 12:02:24 c2 systemd[1]: Finished DRBD -- please disable. Unless you are NOT using a cluster manager..
Так как я не устанавливал LINSTOR
, то как следствие появляется такое сообщение. В целом на работоспособность drbd никак не влияет, но глаз мозолит.
Все дело в коде init-скрипта drbd, там не описано условие при котором файл /var/lib/linstor/loop_device_mapping
существует или нет. Исправим это путем внесения изменений в init-скрипт drbd. Переходим в каталог с исходниками drbd-utils/scripts
и создаем патч файл:
cat << EOF > drbd.patch
--- drbd 2024-05-21 11:43:41.982137800 +0300
+++ drbd 2024-05-21 13:19:47.233320728 +0300
@@ -148,10 +148,15 @@
{
local line dev file loop_mapping
- # new location
- loop_mapping=/var/lib/linstor.d/loop_device_mapping
- # fallback to old location
- [ -f "$loop_mapping" ] || loop_mapping=/var/lib/linstor/loop_device_mapping
+ if [ -f /var/lib/linstor.d/loop_device_mapping ]; then
+ loop_mapping=/var/lib/linstor.d/loop_device_mapping
+ # old location
+ elif [ -f /var/lib/linstor/loop_device_mapping ]; then
+ loop_mapping=/var/lib/linstor/loop_device_mapping
+ else
+ # at least we tried.
+ return 0
+ fi
# || [[ -n $line ]]: in case there is no newline at EOF
while read -r line || [[ -n $line ]] ; do
@@ -166,9 +171,6 @@
stop) losetup "$dev" 2>/dev/null && losetup -d "$dev";;
esac
done < "$loop_mapping"
-
- # at least we tried.
- return 0
}
run_hook()
EOF
Применяем созданный патч:
patch -i drbd.patch
Теперь можно паропатченный init-скрипт drbd поместить в каталоги /etc/init.d/
& /lib/drbd/
и проверить, выше упомянутого сообщения не будет.
Так же хочу заметить что в следующей версии DRBD-Utils 9.28.0 эти изменения в init-скрипт drbd внесены.
Момент 2.
При выполнении update-rc.d drbd defaults
получал ошибку создания символьных ссылок — update-rc.d: error: no runlevel symlinks to modify, aborting!
.
Лечится это путем удаления возможных текущих символьных ссылок drbd и создание новых:
rm /etc/rc{0..6}.d/*drbd
update-rc.d drbd defaults
Либо можно в ручную их создать:
ln -s -T /etc/init.d/drbd /etc/rc0.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc1.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc2.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc3.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc4.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc5.d/S01drbd
ln -s -T /etc/init.d/drbd /etc/rc6.d/S01drbd
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Обсуждение
Нет комментариев.