У нас проблемы с использованием библиотеки FreeAdhocUDF http://freeadhocudf.org с Firebird на Debian 11.
Немного основной информации:
Дебиан 11 64бит
uname -a
говорит:
Linux RMVM18 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21)
x86_64 GNU/Linux
Firebird был установлен через apt
с этими пакетами:
firebird3.0-common 3.0.7.33374.ds
firebird3.0-server 3.0.7.33374.ds
firebird3.0-server-core q3.0.7.33374.ds
firebird3.0-utils q3.0.7.33374.ds
а позже напрямую с помощью установочных пакетов с https://firebirdsql.org/en/firebird-3-0/#Linux_AMD64.
Наконец, мы попробовали версию 4 Firebird, но тоже безуспешно: https://github.com/FirebirdSQL/firebird/releases/download/v4.0.2/Firebird-4.0.2.2816-0.amd64.tar. гз
Сам Firebird отлично работает в обеих версиях. Только использование FreeAdhocUDF дает сбой.
Мы проверили зависимости библиотеки с помощью
ldd FreeAdhocUDF.so
успешно, результат был:
cd.1 (0x00007fff557da000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fae5a559000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fae5a384000)
libib_util.so => /lib/x86_64-linux-gnu/libib_util.so (0x00007fae5a37f000)
libicudataFAU.so.44 => /lib/x86_64-linux-gnu/libicudataFAU.so.44
(0x00007fae5933f000)
libicui18nFAU.so.44 => /lib/x86_64-linux-gnu/libicui18nFAU.so.44
(0x00007fae58f65000)
libicuucFAU.so.44 => /lib/x86_64-linux-gnu/libicuucFAU.so.44
(0x00007fae58c12000)
libfbclient.so.2 => /lib/x86_64-linux-gnu/libfbclient.so.2
(0x00007fae58a6e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fae5a8d3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007fae58a4c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fae58a46000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fae58879000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fae5885f000)
libtommath.so.1 => /lib/x86_64-linux-gnu/libtommath.so.1
(0x00007fae5883d000)
Настройки в firebird.conf
:
UdfAccess = Restrict
(перепробовали несколько вариантов, включая Full
)
Какой бы из описанных ниже вариантов мы ни пробовали, результат всегда был таким:
Select f_abs(-1) from rdb$database;
Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Use of UDF/BLOB-filter module at location FreeAdhocUDF is not
allowed by server configuration.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 28000
GDSCODE: 335544831
Что не так? Что еще мы можем попробовать?
Кроме того, зачем использовать UDF для F_ABS
, который, как я полагаю, получает абсолютное значение, когда в Firebird он встроен как ABS?
Извините, мы использовали не только Restrict
, а в сочетании с несколькими путями, относительными, абсолютными, и в конце мы старались Full
, чтобы точно не попасть туда.
Каково определение F_ABS
, потому что тогда оно предполагает, что определение неверно (например, не может найти нужную библиотеку).
Если бы это был только F_ABS, я бы согласился, но мы должны использовать БОЛЬШОЕ количество кода, который интенсивно использует несколько функций FreeAdhoc :-(
ОК, но если это выдает ошибку, даже когда у вас есть UdfAccess = Full
, то это может означать, что определение неверное, и библиотека не может быть загружена (хотя, если честно, то я бы ожидал ошибку "имя модуля или точка входа не удалось найти" вместо ошибки, которую вы показываете в своем вопросе). Поэтому может быть полезно иметь пример определения одной из UDF, которая не удалась.
Вопрос новичка: я попытался указать, что тем временем мы нашли решение, и я сам очень ценю темы с намеком на то, что в конце темы есть решение. Поэтому я отредактировал заголовок, добавив «РЕШЕНО», но кто-то удалил это. Почему? Я уверен, что для этого есть причины, но как я могу добиться того, чтобы сигнализировать «мы нашли решение»? Я хочу научиться делать это правильно, я пытался связаться с пользователем редактирования, но также не нашел способа, поэтому я пытаюсь выяснить это здесь...
Вы отмечаете вопрос как решенный, принимая ответ (нажимая галочку перед этим ответом). Если ни один из текущих ответов не дает решения, опубликуйте свой собственный ответ с решением и примите его после тайм-аута (вы не можете сразу принять свой собственный ответ).
Текст ошибки: «Использование модуля UDF/BLOB-фильтра в расположении FreeAdhocUDF не разрешено конфигурацией сервера». Неудачная зависимость или пропущенная библиотека дадут вам ошибку «имя модуля или точка входа не могут быть найдены».
За значением "Restict" должен следовать список каталогов, в которых библиотеки UDF разрешены (и действительно ищутся). Простое «Ограничение» бессмысленно и, скорее всего, позволяет библиотекам UDF находиться только в корневом каталоге Firebird, что является плохой идеей.
Если вы установите для UdfAccess значение «полный», вы должны указать абсолютный путь к библиотеке в запросе «DECLARE FUNCTION».
Помните, что сервер Firebird (если он настроен как SuperServer или SuperClassic) необходимо перезапустить, чтобы отразить изменения в конфигурации.
Для детального исследования вы можете использовать утилиту dltrace, чтобы увидеть, откуда пытается загрузиться библиотека.
Я согласен - проблема не в неудачных включениях. "не разрешено"... но где конфигурация, запрещающая серверу использовать UDF? Извините, не очень хорошо описал... мы не использовали Restrict
в одиночку, а использовали несколько вариантов, прямые пути, относительные, и в конце постарались Full
не подвести там. Спасибо за подсказку относительно путей DECLARE! Мы попробуем это!
@Uwe Бьюсь об заклад, вы забыли перезапустить сервер Firebird после изменения firebird.conf.
мы перезагружались каждый раз после изменения .conf или файловой структуры/имен/прав с помощью перезапуска sysctl
Проблема заключалась в следующем: мы работали с символическими ссылками повсюду (обычная стратегия), но, в конце концов, нам пришлось явно копировать FreeAdhocUDF_FB2x_amd64.so
в FreeAdhocUDF.so
. Это решило проблему.
Дополнительная информация: мы использовали каталог /UDF/
в качестве местоположения для UDF и имели UdfAccess = Restrict /UDF
в firebird.config
(Firebird 4.)
Да, ссылки не работают с ограниченными местоположениями UDF, потому что технически библиотека находится вне разрешенного каталога, который сравнивается буквально.
Место было идентичным. И - исходный файл, и символическая ссылка - где в /UDF
. КОПИЮ было разрешено связывать, а символическую ссылку - нет. В случае с несколькими специальными библиотечными файлами, такими как libicuucFAU.so.44
, можно было использовать символическую ссылку. Собственно сам скрипт установки работал так. Так что нам было совершенно непонятно, что в ЭТОМ случае это должна быть копия. Мы узнали случайно, это была своего рода последняя догадка.
Значение параметра буквально
Restrict
? Потому что в этом случае вы не указали разрешенные места для библиотек UDF, поэтому Firebird ничего не загрузит.