Переход с платформы 1С:Предприятие 8.2 на 8.3 в среде FreeBSD часто сопровождается специфической проблемой: база данных становится доступной только для одного пользователя. При попытке второго подключения система либо выдает ошибку, либо просто не пускает в базу. Ситуация осложняется тем, что официального дистрибутива 1С под FreeBSD не существует, и работа организуется через механизм Linux Binary Compatibility (Linuxator).
В этой статье мы подробно разберем, почему возникает ограничение «одного пользователя» и как настроить систему для полноценной многопользовательской работы. Рассмотрим ситуацию как для файлового варианта работы через Samba, так и для клиент-серверного варианта.
Если ваша база данных является файловой и расположена в общей папке на сервере FreeBSD, основной причиной проблемы чаще всего выступает некорректная обработка блокировок протоколом SMB. Платформа 1С 8.3 использует более строгие механизмы управления файловыми блокировками (LDB-файлы) по сравнению с версией 8.2.
Проанализируем конфигурационный файл Samba smb.conf. Для корректной работы 1С 8.3 нам необходимо убедиться, что параметры блокировок позволяют совместный доступ нескольким процессам. Рассмотрим пример оптимальной настройки секции для базы данных:
[1c_base]
path = /home/1c/db
public = yes
writable = yes
locking = yes
strict locking = no
oplocks = no
level2 oplocks = no
fake oplocks = no
veto files = /.*/
Разберем подробнее, что делают эти параметры. Отключение oplocks и level2 oplocks критически важно для 1С, так как кэширование файлов на стороне клиента при многопользовательской работе в 1С 8.3 часто приводит к повреждению индексов или невозможности открыть файл 1Cv8.1cd вторым пользователем. Параметр strict locking = no позволяет серверу Samba более гибко обрабатывать запросы на блокировку диапазонов байт, что необходимо для механизма управления транзакциями 1С.
Если используется серверный вариант (1С:Сервер), то проблема одного пользователя часто связана с тем, что рабочий процесс rphost не может выделить достаточно памяти для новых соединений или не может запустить дополнительные рабочие процессы. В FreeBSD лимиты разделяемой памяти по умолчанию очень малы для нужд 1С 8.3.
Выясним текущие настройки лимитов и увеличим их. Для этого нам необходимо отредактировать файл /boot/loader.conf. Выполним настройку следующих параметров:
kern.ipc.shmmax=2147483648
kern.ipc.shmall=524288
kern.ipc.semmsl=250
kern.ipc.semmni=128
После внесения изменений сервер необходимо перезагрузить. Параметр kern.ipc.shmmax определяет максимальный размер сегмента разделяемой памяти (в данном примере — 2 ГБ), что позволяет процессам 1С эффективно обмениваться данными при большом количестве подключений. Если этот лимит исчерпан, 1С не сможет инициализировать менеджер соединений для второго пользователя.
Поскольку 1С работает через слой совместимости, она «думает», что находится в среде Linux. Платформа 8.3 требует более современных системных вызовов, чем 8.2. Если FreeBSD сообщает программе, что она работает на старом ядре Linux (например, 2.6.18), компоненты 1С могут работать некорректно.
Проверим и изменим версию эмулируемого ядра. Для этого используем команду sysctl. Чтобы изменения сохранялись после перезагрузки, добавим строку в /etc/sysctl.conf:
compat.linux.osrelease=3.10.0
Это заставит 1С считать, что она работает на ядре уровня CentOS 7, что обеспечит корректную работу библиотеки glibc и механизмов потоков (pthreads), необходимых для обслуживания нескольких клиентских сессий.
Платформа 8.3 имеет больше зависимостей от системных библиотек. Часто после обновления самой платформы системные администраторы забывают обновить окружение в директории /compat/linux. Если при запуске второго сеанса 1С пытается вызвать какую-либо функцию из libgsf или glib2, которая отсутствует или устарела в слое совместимости, процесс может завершиться ошибкой.
Рассмотрим, как проверить наличие необходимых библиотек. Нам нужно зайти в окружение Linux и проверить зависимости исполняемых файлов 1С (например, rphost):
chroot /compat/linux /bin/bash
ldd /opt/1C/v8.3/x86_64/rphost
Если в выводе команды присутствуют строки not found, необходимо доустановить соответствующие пакеты в среду Linuxator (используя yum или apt в зависимости от того, какой дистрибутив развернут в /compat/linux). Особое внимание уделите шрифтам msttcorefonts, так как без них сервер 1С на FreeBSD часто падает при попытке сформировать печатную форму для второго пользователя.
При переходе на 8.3 меняются пути к временным файлам и сеансовым данным. Если первый пользователь зашел в систему и создал временные файлы с правами, запрещающими чтение/запись другим пользователям (или группе 1c), второй пользователь не сможет инициализировать свой сеанс.
Проанализируем права на папку с данными сервера 1С (обычно это /home/usr1cv8/.1cv8/1C/1cv8). Убедимся, что права установлены рекурсивно:
chmod -R 770 /home/usr1cv8/.1cv8
chown -R usr1cv8:grp1cv8 /home/usr1cv8/.1cv8
Если вышеперечисленные шаги не помогли, необходимо перейти к глубокой диагностике. Выясним, что происходит в момент попытки входа второго пользователя, используя системные логи FreeBSD и логи самой 1С.
/var/log/messages на наличие ошибок linux: pid X: syscall Y not implemented. Это укажет на нехватку функционала в текущей версии Linuxator.sockstat -4 | grep 1cv8. Вы должны увидеть, что процессы прослушивают порты 1540, 1541 и диапазон 1560-1591. Если после входа первого пользователя новые порты не открываются для прослушивания, проблема в рабочих процессах rphost.logcfg.xml. Это позволит увидеть конкретную ошибку уровня приложения, например, Network Error или Lock Violation.Подводя итог, можно сказать, что работа 1С 8.3 на FreeBSD — это «выбор сильных духом». Однако при правильной настройке POSIX-вызовов через syscalls.master и корректном конфигурировании Samba и IPC, эта связка работает крайне стабильно и производительно, превосходя многие Linux-дистрибутивы по надежности файловой системы (особенно при использовании ZFS).