dev:firebird:fb50_with_fb30_on_ubuntu

This is an old revision of the document!


Firebird 3 и Firebird 5 на одной Ubuntu-машине

Теперь картина полная. У тебя Firebird 3.0.10 запускается через /lib/systemd/system/firebird-superserver.service, причём путь /opt/firebird жёстко прописан в ExecStart. Значит, можно аккуратно перевести его в /opt/firebird3, а Firebird 5 развернуть отдельно в /opt/firebird5. Официальная документация подтверждает, что Firebird допускает несколько серверов на одной машине, а содержимое Linux-kit можно извлекать из buildroot.tar.gz. (Home)

Я бы делал так.

sudo systemctl stop firebird-superserver.service
sudo systemctl disable firebird-superserver.service

Проверить:

sudo ss -lntp | grep 3050

Ничего не должно быть.

sudo mv /opt/firebird /opt/firebird3

Проверить:

ls -ld /opt/firebird3
cd /home/denis/Downloads/0_dist/firebird
mkdir -p /tmp/fb5dist
 
tar xzf Firebird-5.0.4.1812-0-linux-x64.tar.gz -C /tmp/fb5dist

Найти внутренний архив:

find /tmp/fb5dist -name buildroot.tar.gz

У тебя должен появиться путь примерно такой:

/tmp/fb5dist/Firebird-5.0.4.1812-0-linux-x64/buildroot.tar.gz

Проверить содержимое:

tar tzf /tmp/fb5dist/Firebird-5.0.4.1812-0-linux-x64/buildroot.tar.gz | head -30

Внутри должно быть дерево /opt/firebird. Документация Firebird прямо указывает, что необходимые файлы находятся в /opt/firebird внутри buildroot.tar.gz. (Home)

sudo mkdir -p /tmp/fb5root
 
sudo tar xzf \
/tmp/fb5dist/Firebird-5.0.4.1812-0-linux-x64/buildroot.tar.gz \
-C /tmp/fb5root

Теперь:

ls /tmp/fb5root/opt/firebird

Перемещаем:

sudo mv /tmp/fb5root/opt/firebird /opt/firebird5

Проверяем:

ls -ld /opt/firebird3 /opt/firebird5

Firebird 5.0.4.1812 — официальный актуальный Linux x64 build ветки 5.0. (Home)

Это здесь принципиально. Стандартный install.sh рассчитан на системную установку в /opt/firebird и выполняет дополнительные системные изменения. Нам они не нужны, потому что мы сознательно делаем параллельные экземпляры. Официальная документация рекомендует install.sh для обычной установки, но отдельно подтверждает возможность ручного filesystem-copy deployment. (Home)

/opt/firebird5/bin/isql -z

Ожидается примерно:

ISQL Version: LI-V5.0.4...

Проверь зависимости:

ldd /opt/firebird5/bin/firebird | grep "not found"
ldd /opt/firebird5/bin/isql | grep "not found"

Если вывода нет — хорошо.

sudo nano /etc/systemd/system/firebird3.service

Содержимое:

[Unit]
Description=Firebird 3 Database Server
After=network.target
Conflicts=firebird5.service
 
[Service]
User=firebird
Group=firebird
Type=forking
Environment=FIREBIRD=/opt/firebird3
ExecStart=/opt/firebird3/bin/fbguard -daemon -forever
StandardError=journal
 
[Install]
WantedBy=multi-user.target
sudo nano /etc/systemd/system/firebird5.service

Содержимое:

[Unit]
Description=Firebird 5 Database Server
After=network.target
Conflicts=firebird3.service
 
[Service]
User=firebird
Group=firebird
Type=forking
Environment=FIREBIRD=/opt/firebird5
ExecStart=/opt/firebird5/bin/fbguard -daemon -forever
StandardError=journal
 
[Install]
WantedBy=multi-user.target

Здесь важно Conflicts=: systemd не позволит обоим сервисам работать одновременно.

sudo systemctl daemon-reload
sudo systemctl start firebird3

Проверяем:

systemctl status firebird3 --no-pager
sudo ss -lntp | grep 3050

И подключаемся именно клиентом FB3:

/opt/firebird3/bin/isql -z

Если нужна база:

/opt/firebird3/bin/isql \
  -user SYSDBA \
  -password masterkey \
  localhost:/путь/к/базе.fdb
sudo systemctl stop firebird3
sudo systemctl start firebird5

Проверить:

systemctl status firebird5 --no-pager
sudo ss -lntp | grep 3050

И:

/opt/firebird5/bin/isql -z

На Firebird 3:

sudo systemctl stop firebird5
sudo systemctl start firebird3

На Firebird 5:

sudo systemctl stop firebird3
sudo systemctl start firebird5

Из-за Conflicts= можно даже писать просто:

sudo systemctl start firebird5

если сейчас работает firebird3: systemd должен остановить конфликтующий сервис. Но я бы для ясности использовал явные stop/start.

Если пока основной FB3:

sudo systemctl enable firebird3
sudo systemctl disable firebird5

Проверить:

systemctl is-enabled firebird3
systemctl is-enabled firebird5

Должно быть:

enabled
disabled

Если позже захочешь основной FB5:

sudo systemctl disable firebird3
sudo systemctl enable firebird5

Не удаляй пока:

/lib/systemd/system/firebird-superserver.service

Просто оставь:

sudo systemctl disable firebird-superserver.service

Потому что он всё ещё содержит:

ExecStart=/opt/firebird/bin/fbguard ...

а /opt/firebird теперь уже нет.

Проверить всё:

systemctl is-enabled firebird-superserver.service
systemctl is-enabled firebird3.service
systemctl is-enabled firebird5.service

Поскольку мы не запускаем install.sh, нужно отдельно проверить, что находится в FB5:

ls -l /opt/firebird5/security5.fdb
ls -l /opt/firebird5/SYSDBA.password

И права:

ls -ld /opt/firebird5
ls -l /opt/firebird5/security5.fdb

Не копируй туда:

/opt/firebird3/security3.fdb

У FB3 и FB5 должны быть отдельные security databases.

Всегда явно:

/opt/firebird3/bin/isql
/opt/firebird3/bin/gbak
/opt/firebird3/bin/gfix

или:

/opt/firebird5/bin/isql
/opt/firebird5/bin/gbak
/opt/firebird5/bin/gfix

Это особенно важно при конвертации базы FB3 → FB5.

Итог будет такой:

/opt/firebird3
    Firebird 3.0.10
    security3.fdb
    firebird.conf

/opt/firebird5
    Firebird 5.0.4
    security5.fdb
    firebird.conf

/etc/systemd/system/firebird3.service
/etc/systemd/system/firebird5.service

Оба используют 3050, но работает только один.

Перед тем как запускать FB5, я бы теперь сделал один контрольный шаг: после того как распакуешь buildroot.tar.gz в /opt/firebird5, покажи вывод

ls -la /opt/firebird5
ls -la /opt/firebird5/bin | head
ls -l /opt/firebird5/security5.fdb /opt/firebird5/SYSDBA.password 2>&1

Именно здесь может потребоваться дополнительная инициализация security5.fdb/пароля, потому что мы сознательно обходим install.sh. Всё остальное — перенос FB3 и создание двух systemd-unit — уже можно делать по инструкции выше.


Проблема понятна: сервис запускается от пользователя firebird, а файл /opt/firebird5/fb_guard ему недоступен для записи.

У тебя в FB3 этот файл как раз имел права:

-rw-rw---- 1 firebird firebird ... fb_guard

А в FB5 после ручной распаковки права остались, скорее всего, root:root.

Сделай так:

sudo touch /opt/firebird5/fb_guard
sudo chown firebird:firebird /opt/firebird5/fb_guard
sudo chmod 660 /opt/firebird5/fb_guard

Проверь:

ls -l /opt/firebird5/fb_guard

Должно быть примерно:

-rw-rw---- 1 firebird firebird ... /opt/firebird5/fb_guard

После этого попробуй снова:

sudo systemctl start firebird5

И проверь:

systemctl status firebird5 --no-pager

Ещё сразу советую проверить права на файлы, в которые Firebird 5 тоже должен уметь писать:

sudo chown firebird:firebird /opt/firebird5/security5.fdb
sudo chown firebird:firebird /opt/firebird5/firebird.log 2>/dev/null || true

Если firebird.log ещё не существует:

sudo touch /opt/firebird5/firebird.log
sudo chown firebird:firebird /opt/firebird5/firebird.log
sudo chmod 660 /opt/firebird5/firebird.log

И проверь каталог:

ls -ld /opt/firebird5

Если сам каталог root:root с 755 — это нормально. Но файлы, которые сервер должен изменять, должны быть доступны пользователю firebird.

После запуска посмотри:

sudo ss -lntp | grep 3050

и:

ps aux | grep -E 'firebird|fbguard' | grep -v grep

Если после исправления fb_guard появится уже другая ошибка, пришли новый вывод:

systemctl status firebird5 --no-pager
tail -50 /opt/firebird5/firebird.log

С высокой вероятностью следующий возможный вопрос будет уже про security5.fdb или пароль SYSDBA.


Это выглядит нормально: security5.fdb существует и принадлежит firebird:firebird. Отсутствие /opt/firebird5/SYSDBA.password само по себе не проблема — этот файл обычно создаётся установщиком, а мы install.sh сознательно не запускали.

Теперь задача — проверить, какой пароль у SYSDBA в этой security5.fdb.

Сначала попробуй стандартный:

/opt/firebird5/bin/isql \
  -user SYSDBA \
  -password masterkey \
  localhost:employee

Если алиаса employee нет, можно просто запустить isql и подключиться к конкретной FB5-базе, когда она будет создана/восстановлена.

Если masterkey не подходит, проще всего задать новый пароль через gsec или SQL, но для Firebird 5 предпочтительнее SQL-подход через ALTER USER, если удастся войти под текущим SYSDBA.

Сейчас главное — убедиться, что сам FB5 уже запускается после исправления fb_guard:

sudo systemctl start firebird5
systemctl status firebird5 --no-pager
sudo ss -lntp | grep 3050

Если сервер стартовал, покажи вывод:

systemctl status firebird5 --no-pager
tail -50 /opt/firebird5/firebird.log

и я подскажу следующий шаг именно для пароля SYSDBA.

Ещё один момент: права на security5.fdb сейчас 644:

-rw-r--r--

Это не критично для запуска, но лучше сделать так же, как у FB3:

sudo chmod 660 /opt/firebird5/security5.fdb

И для fb_guard:

sudo chmod 660 /opt/firebird5/fb_guard

То есть рабочие файлы сервера будут доступны владельцу и группе, но не всем остальным.


У тебя как раз ожидаемая ситуация для ручной распаковки FB5 без install.sh: security5.fdb есть, но в ней ещё не создан SYSDBA. Сообщение Firebird прямо об этом и говорит. В README для security database рекомендуемый путь такой: остановить сервер, открыть базу локально через embedded-доступ, создать SYSDBA, затем снова запустить сервер. (GitHub)

Сделай так.

Сначала останови FB5:

sudo systemctl stop firebird5

Теперь запусти isql локально, без localhost, чтобы использовалось embedded-подключение:

cd /opt/firebird5
 
sudo -u firebird env FIREBIRD=/opt/firebird5 \
  /opt/firebird5/bin/isql -user SYSDBA employee

Если алиас employee существует, попадёшь в SQL>.

Там создай SYSDBA:

CREATE USER SYSDBA PASSWORD 'СЮДА_СВОЙ_СЛОЖНЫЙ_ПАРОЛЬ';

Например временно для теста:

CREATE USER SYSDBA PASSWORD 'TestFb5_2026!';

Затем:

EXIT;

После этого запускай сервер:

sudo systemctl start firebird5

И проверяй уже по сети:

/opt/firebird5/bin/isql \
  -user SYSDBA \
  -password 'TestFb5_2026!' \
  localhost:employee

Если всё прошло нормально, увидишь что-то вроде:

Database: localhost:employee, User: SYSDBA
SQL>

Официальная документация Firebird 5 подтверждает, что после нормальной установки SYSDBA должен существовать в security5.fdb, а управление пользователями в Firebird 3+ выполняется SQL-командами CREATE USER / ALTER USER. (Home)

Если команда

sudo -u firebird env FIREBIRD=/opt/firebird5 \
  /opt/firebird5/bin/isql -user SYSDBA employee

не подключится, покажи вывод:

grep -n -i employee /opt/firebird5/databases.conf

и:

ls -l /opt/firebird5/examples/empbuild/employee.fdb

Тогда дам вариант инициализации security5.fdb без алиаса employee.


Да, тут причина уже другая: embedded-подключение к алиасу employee дошло до базы, но сам пользователь Linux firebird не имеет права на запись в файл employee.fdb или каталог, где он лежит. Именно поэтому CREATE USER не выполнился — ты фактически не был подключён к базе. Для инициализации security5.fdb Firebird действительно рекомендует остановить сервер, открыть employee в embedded-режиме как SYSDBA, а затем выполнить CREATE USER SYSDBA …. (GitHub)

Сначала выйди из isql:

EXIT;

Потом найди, куда у тебя указывает алиас employee:

grep -n -A3 -B3 '^employee' /opt/firebird5/databases.conf

И проверь права на сам файл, например если там:

employee = /opt/firebird5/examples/empbuild/employee.fdb

то:

ls -l /opt/firebird5/examples/empbuild/employee.fdb
ls -ld /opt/firebird5/examples/empbuild

Самый простой способ для этой разовой инициализации — дать firebird владение sample-базой:

sudo chown firebird:firebird /opt/firebird5/examples/empbuild/employee.fdb
sudo chmod 660 /opt/firebird5/examples/empbuild/employee.fdb

И на всякий случай каталог должен позволять проход:

sudo chmod 755 /opt/firebird5/examples/empbuild

Убедись, что FB5 остановлен:

sudo systemctl stop firebird5

Теперь снова:

sudo -u firebird env FIREBIRD=/opt/firebird5 \
  /opt/firebird5/bin/isql -user SYSDBA employee

На этот раз ожидаем:

Database: employee, User: SYSDBA
SQL>

Тогда:

CREATE USER SYSDBA PASSWORD 'masterkey';
EXIT;

После этого запускаем FB5:

sudo systemctl start firebird5

И уже проверяем нормальную сетевую аутентификацию:

/opt/firebird5/bin/isql \
  -user SYSDBA \
  -password masterkey \
  localhost:employee

Если всё в порядке, увидишь:

Database: localhost:employee, User: SYSDBA
SQL>

Важный момент: в embedded-режиме пароль на этапе первоначальной инициализации не нужен; главное — подключиться как SYSDBA. Firebird в таком режиме не делает обычную сетевую аутентификацию, но для CREATE USER имя пользователя должно быть SYSDBA. (Home)

Если после chown снова будет no permission for read-write access, пришли только вывод этих двух команд:

grep -n -A3 -B3 '^employee' /opt/firebird5/databases.conf
namei -l /opt/firebird5/examples/empbuild/employee.fdb

namei -l сразу покажет права на каждый каталог по пути, и станет видно, где именно блокируется доступ.


Да. Я бы сделал два отдельных скрипта и заодно чуть поправил исходный: последний 16384 лучше передавать как -page_size 16384. Это штатный параметр gbak при восстановлении. (Home)

Для Firebird 3:

#!/bin/sh
 
fname=$(basename "$1")
name="${fname%.*}"
 
/opt/firebird3/bin/gbak \
  -create \
  -FIX_FSS_METADATA WIN1251 \
  -verbose \
  -page_size 16384 \
  "$1" \
  "$name.fdb" \
  -user SYSDBA \
  -password masterkey
 
sudo chown firebird:firebird "$name.fdb"

Для Firebird 5:

#!/bin/sh
 
fname=$(basename "$1")
name="${fname%.*}"
 
/opt/firebird5/bin/gbak \
  -create \
  -FIX_FSS_METADATA WIN1251 \
  -verbose \
  -page_size 16384 \
  "$1" \
  "$name.fdb" \
  -user SYSDBA \
  -password masterkey
 
sudo chown firebird:firebird "$name.fdb"

Сохрани, например, как:

~/bin/restore_fb3.sh
~/bin/restore_fb5.sh

и дай права:

chmod +x ~/bin/restore_fb3.sh
chmod +x ~/bin/restore_fb5.sh

Использование одинаковое:

restore_fb3.sh mybase.fbk

или:

restore_fb5.sh mybase.fbk

На выходе получишь:

mybase.fdb

Я также добавил кавычки вокруг $1 и $name.fdb, чтобы скрипт не ломался, если в пути или имени файла есть пробелы.

Есть ещё важный момент именно для твоей схемы с двумя Firebird: этот вариант создаёт базу локально через gbak конкретной версии, но если оба сервера переключаются на одном порту, я бы сделал скрипты ещё безопаснее — чтобы restore_fb3.sh перед восстановлением проверял, что действительно запущен Firebird 3, а restore_fb5.sh — что Firebird 5. Тогда случайно восстановить FB3-бэкап не той версией будет сложнее.


Для Firebird 5 и алиаса shadwes:

/opt/firebird5/bin/isql -user SYSDBA -password masterkey localhost:shadwes

Если сервер находится на другом компьютере:

/opt/firebird5/bin/isql -user SYSDBA -password masterkey 192.168.2.181/3050:shadwes

После успешного подключения получишь:

Database: localhost:shadwes, User: SYSDBA
SQL>

Проверить, что подключился именно к серверу Firebird 5:

SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION')
FROM RDB$DATABASE;

Должно вернуть версию вида 5.0.4.

  • dev/firebird/fb50_with_fb30_on_ubuntu.1788620828.txt.gz
  • Last modified: 2026/09/05 18:07
  • by denis