Содержание статьи:
Решил разобрать как собрать из исходников пакет 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
# Собираем и устанавливаем.
./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
Либо последние версии исходников можно склонировать с 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
Если нужно скомпилировать с документацией, то нужно установить дополнительные пакеты зависимостей:
apt-get install docbook-xsl xsltproc po4a
и конфигурировать без ключа --without-manual
.
# Настройка скрипта запуска 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
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Оставить ответ