Некоторые настройки FlameRobin на Debian

Одним из нативных инструментов администрирования firebird с GUI-шным интерфейсом на линуксе является FlameRobin. Из репозитариев он ставится так

$ sudo apt install flamerobin


Если и сервер firebird ставится из репозиториев, то подключения из flamerobin к базам осуществляется без проблем. Однако, когда я установил Firebird 3.0.2 из архива при помощи инсталлятора, то при попытке коннекта получил ошибку

*** IBPP::SQLException ***
Context: Database::Connect
Message: isc_attach_database failed

SQL Message : -923
Connection not established

Engine Code : 335544421
Engine Message :
connection rejected by remote interface



Попытки поиска проблемы выявили следующее.

FlameRobin статически слинкован с симлинком libfbclient.so.2, который в вашей системе наверняка ссылается на клиентские библиотеки от другой версии firebird. Чтобы увидеть это наглядно, делаем следующее:

$ ldd /usr/bin/flamerobin

...
libfbclient.so.2 => /usr/lib/i386-linux-gnu/libfbclient.so.2 (0xb655b000)
...

Видим, что flamerobin, слинкованный с libfbclient.so.2, при коннекте к базе использует симлинк /usr/lib/i386-linux-gnu/libfbclient.so.2. Теперь смотрим, куда "смотрит" этот симлинк (для удобства просмотра  или протоколирования можно вывести содержимое консоли в лог-файл - добавьте к командной строке содержимое квадратных скобок)


$ cd /usr/lib/i386-linux-gnu
$ ls -lH | tee [-a ~/temp/<ваше название лог-файла>.txt]

lrwxrwxrwx 1 root root       20 Dec 13  2014 libfbclient.so.2 -> libfbclient.so.2.5.3
-rw-r--r-- 1 root root   853660 Dec 13  2014 libfbclient.so.2.5.3
lrwxrwxrwx 1 root root       19 Dec 13  2014 libfbembed.so.2.5 -> libfbembed.so.2.5.3
-rw-r--r-- 1 root root  5584332 Dec 13  2014 libfbembed.so.2.5.3

Увы, симлинк libfbclient.so.2 ссылается на /usr/lib/i386-linux-gnu/libfbclient.so.2.5.3, а не на /opt/firebird/lib/libfbclient.so.3.0.2

По умолчанию, поставленные из репов программы, сначала ищут симлинки в папке /usr/lib/i386-linux-gnu, а затем в /usr/lib, если не будут найдены в предыдущей (если у вас не 32-разрядный линукс, то папка /i386-linux-gnu может называться по-другому).

Смотрим содержимое папки /usr/lib
$ cd /usr/lib
$ ls -lH | tee
...
lrwxrwxrwx 1 root root 32 Mar 26 14:43 libfbclient.so -> /opt/firebird/lib/libfbclient.so
lrwxrwxrwx 1 root root 34 Mar 26 14:43 libfbclient.so.2 -> /opt/firebird/lib/libfbclient.so.2
lrwxrwxrwx 1 root root 38 Mar 26 14:43 libfbclient.so.3.0.2 -> /opt/firebird/lib/libfbclient.so.3.0.2
...

Таким образом, инсталлятор из архива "правильно" поставил симлинки на свои библиотеки, но не учел, что в подпапке /i386-linux-gnu есть симлинки с такими же именами разработчики Flamerobin поместят симлинки с таким же именами  и жестко привяжут к ним свою софтину. А потому симлинк /usr/lib/i386-linux-gnu/libfbclient.so.2 (который ссылается на libfbclient.so.2.5.3) будет "виден" программами раньше, чем симлинк /usr/lib/libfbclient.so.2 (который ссылается /opt/firebird/lib/libfbclient.so.2, а тот в свою очередь ссылается на /opt/firebird/lib/libfbclient.so.3.0.2).

Таким образом, чтобы FlameRobin при коннекте к базе "цеплял" библиотеку "нужной" нам версии сервера firebird, можно выбрать один из двух вариантов:

1. удалить "неправильные" симлинки из /usr/lib/i386-linux-gnu (тогда симлинки будут браться из usr/lib)

$ sudo unlink /usr/lib/i386-linux-gnu/libfbclient.so.2
$ sudo unlink /usr/lib/i386-linux-gnu/libfbembed.so.2.5


2. удалить и пересоздать симлинки в /usr/lib/i386-linux-gnu с новыми ссылками
$ sudo unlink /usr/lib/i386-linux-gnu/libfbclient.so.2
$ sudo ln -s /opt/firebird/lib/libfbclient.so.3.0.2 /usr/lib/i386-linux-gnu/libfbclient.so.2 

Первый вариант проще, второй надежнее ;)

Я выбрал второй вариант - создал новый симлинк в /usr/lib/i386-linux-gnu. Смотрим, что получилось
$ cd /usr/lib/i386-linux-gnu
$ ls -lH | tee
...
lrwxrwxrwx 1 root root 38 Apr 1 02:32 libfbclient.so.2 -> /opt/firebird/lib/libfbclient.so.3.0.2
-rw-r--r-- 1 root root 853660 Dec 13 2014 libfbclient.so.2.5.3
lrwxrwxrwx 1 root root 19 Dec 13 2014 libfbembed.so.2.5 -> libfbembed.so.2.5.3
-rw-r--r-- 1 root root 5584332 Dec 13 2014 libfbembed.so.2.5.3
...

Таким образом, теперь libfbclient.so.2 ссылается на "правильную" версию клиентской библы /opt/firebird/lib/libfbclient.so.3.0.2

Запускаем FlameRobin


Вуаля...

Update: все вернется к исходному статусу, как только будет запущена команда обновления пакетов из репозитариев
$ sudo apt update

и придется повторять все сначала...


Популярные сообщения из этого блога

Как я устанавливал Firebird 3 на Debian 8

Как я ставил транковый fpc и lazarus на Debian 7.6 x32

Мемориальные заметки для Lazarus