Недавно устанавливал сервер 1С:Предприятие 8.2.15.319 в операционной системе CentOs 5.5. Вылезла проблема, на которую натыкаются многие системные администраторы - демон сервера srv1cv82 не запускался. В интернете куча обсуждений данного вопроса, рецепты везде разные. В этой статье я расскажу в чем заключалась ошибка у меня, и как ее решил.
Исходные данные
Имеем чистую систему CentOs 5.5, установленную админами хостинга на выделенный сервер. Непонятно, почему в конце 2012 года ставят именно версию 5.5, когда уже стабильна 6.3. Ну да ладно, попробуем запустить сервер на пятой ветке. Но на всякий случай обновимся до последнего стабильного релиза. Из-под рута запускаем:
yum check-update
yum update
Проверим, какая версия CentOs получилась:
# cat /etc/redhat-release
CentOS release 5.8 (Final)
Установка RPM-пакетов
Наша конфигурация проверена и протестирована на версии платформы 8.2.15.319. Поэтому будем ставить именно эту версию сервера. Скачиваем архив с RPM пакетами с официального сайта 1С. В нашем случае получим следующие файлы:
1C_Enterprise82-common-8.2.15-319.i386.rpm
1C_Enterprise82-common-nls-8.2.15-319.i386.rpm
1C_Enterprise82-crs-8.2.15-319.i386.rpm
1C_Enterprise82-crs-nls-8.2.15-319.i386.rpm
1C_Enterprise82-server-8.2.15-319.i386.rpm
1C_Enterprise82-server-nls-8.2.15-319.i386.rpm
1C_Enterprise82-ws-8.2.15-319.i386.rpm
1C_Enterprise82-ws-nls-8.2.15-319.i386.rpm
Устанавливаем все эти пакеты (хотя, подозреваю, что не все они нужны). Устанавливать командой
rpm -ivh *
не рекомендуется, так как пакеты имеют зависимости друг от друга, и если один не установится, то он просто будет пропущен. Поэтому устанавливаем пакеты руками друг за другом из-под рута (я просто пользуюсь Midnight Commander, входя в каждый пакет по Enter и запуская INSTALL). При установке смотрим, какой пакет не установился. Ставим сначала зависимый пакет, потом возвращаемся к неустановленному, снова его ставим - он должен установиться.
В процессе установки произойдет запуск сервера 1С:Предприятия. Выглядеть это будет так:
Starting 1C:Enterprise 8.2 server: OK
Но так будет не у всех и не всегда. Велика вероятность увидеть такое сообщение:
Starting 1C:Enterprise 8.2 server: Error: service failed to start!
FAILED
Почему не стартует сервер 1С предприятия?
Итак RPM-пакеты установлены. В инсталл-скриптах RPM-пакетов прописывается автозапуск демона сервера 1С при старте системы. Кроме того, при установке RPM-пакета с сервером, сервер сразу запускается. Это произойдет, если все прошло нормально. В нашем случае мы видим ошибку, и начинаем разбираться, в чем причина и как исправить.
Для начала убедимся, что сервер действительно не стартует. Попытаемся запустить его вручную:
# service srv1cv82 start
Starting 1C:Enterprise 8.2 server: Error: service failed to start!
FAILED
Видим все ту же ошибку. Нигде не сказано, где искать лог ошибок сервера 1С, поэтому посмотрим для начала файл /var/log/messages:
# cat /var/log/messages
...
Dec 18 11:19:24 srv3217 setroubleshoot: SELinux is preventing ragent from loading /opt/1C/v8.2/i386/backbas.so which requires text relocation. For complete SELinux messages. run sealert -l 9d52cffb-e837-45d8-be82-35c50be717ab
Да, последняя строка в логе очень интересная. Она касается сервера 1С. Долго я не мог понять что сие значит. А эначит это то, что в опенсорче те еще грамотеи, и поставить точку вместо запятой - для них раз плюнуть. А ведь всего-навсего нужно было написать:
For complete SELinux messages, run sealert -l 9d52cffb-e837-45d8-be82-35c50be717ab
И ни у кого бы вопросов не возникло. Запускаем рекомендуемую в этом сообщении команду и видим портянку:
# sealert -l 9d52cffb-e837-45d8-be82-35c50be717ab
Сводка:
SELinux is preventing ragent from loading /opt/1C/v8.2/i386/backbas.so which
requires text relocation.
Подробное описание:
The ragent application attempted to load /opt/1C/v8.2/i386/backbas.so which
requires text relocation. This is a potential security problem. Most libraries
do not need this permission. Libraries are sometimes coded incorrectly and
request this permission. The SELinux Memory Protection Tests
(http://people.redhat.com/drepper/selinux-mem.html) web page explains how to
remove this requirement. You can configure SELinux temporarily to allow
/opt/1C/v8.2/i386/backbas.so to use relocation as a workaround, until the
library is fixed. Please file a bug report
(http://bugzilla.redhat.com/bugzilla/enter_bug.cgi) against this package.
Разрешение доступа:
If you trust /opt/1C/v8.2/i386/backbas.so to run correctly, you can change the
file context to textrel_shlib_t. "chcon -t textrel_shlib_t
'/opt/1C/v8.2/i386/backbas.so'" You must also change the default file context
files on the system in order to preserve them even on a full relabel. "semanage
fcontext -a -t textrel_shlib_t '/opt/1C/v8.2/i386/backbas.so'"
Следующая команда разрешит доступ:
chcon -t textrel_shlib_t '/opt/1C/v8.2/i386/backbas.so'
Дополнительные сведения:
Исходный контек root:system_r:initrc_t
Целевой Контекс system_u:object_r:usr_t
Целевые Объекты /opt/1C/v8.2/i386/backbas.so [ file ]
Source ragent
Source Path /opt/1C/v8.2/i386/ragent
Port <Неизвестно>
Host srv3217
Source RPM Packages 1C_Enterprise82-server-8.2.15-319
Target RPM Packages 1C_Enterprise82-common-8.2.15-319
RPM политики selinux-policy-2.4.6-327.el5
Selinux активна True
Тип политики targeted
MLS активна True
Принудительный Enforcing
Имя доп.модуля allow_execmod
Имя хоста srv3217
Платформа Linux srv3217 2.6.18-308.24.1.el5PAE #1 SMP Tue
Dec 4 18:28:32 EST 2012 i686 i686
Счетчик уведомл 3
First Seen Tue Dec 18 10:57:32 2012
Last Seen Tue Dec 18 11:19:24 2012
Local ID 9d52cffb-e837-45d8-be82-35c50be717ab
Номера строк
Сырые сообщения
host=srv3217 type=AVC msg=audit(1355815164.656:31): avc: denied { execmod } for pid=2836 comm="ragent" path="/opt/1C/v8.2/i386/backbas.so" dev=md0 ino=16154631 scontext=root:system_r:initrc_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=file
host=srv3217 type=SYSCALL msg=audit(1355815164.656:31): arch=40000003 syscall=125 success=no exit=-13 a0=5d0b000 a1=29c000 a2=5 a3=bfbd6fa0 items=0 ppid=2835 pid=2836 auid=0 uid=501 gid=501 euid=501 suid=501 fsuid=501 egid=501 sgid=501 fsgid=501 tty=(none) ses=1 comm="ragent" exe="/opt/1C/v8.2/i386/ragent" subj=root:system_r:initrc_t:s0 key=(null)
В общем, система безопасности SELinux заблокировала запуск 1С сервера. Но в этой портянке находится еще одна рекомендация:
Следующая команда разрешит доступ:
chcon -t textrel_shlib_t '/opt/1C/v8.2/i386/backbas.so'
Запускаем ее, после чего сервер 1С будет нормально стартовать:
service srv1cv82 start
Starting 1C:Enterprise 8.2 server: OK
Заметьте, что для старта 1С-сервера не обязательно наличие PostgreSQL. Сервер стартует сам по себе, и может быть установлен практически на чистую Linux-систему.
На этом все, надеюсь кому-то помог.