Поиск по этому блогу

пятница, 16 июля 2010 г.

Установка DB2 и 1С на Linux Ubuntu 10.04 LTS

Итак, мальчики и девочки придвигайтесь поближе к своим мониторам.


Мы с вами сегодня пошагово пройдём весь процесс установки с нуля бесплатного сервера баз данных IBM DB2 Express-C v9.5 (сборка 22521) и сервера 1С:Предприятия 8.2 (версия 8.2.11.236) на сервер под управлением 64-битной операционной системы Linux Ubuntu 10.04.

Установку операционной системой оставим за рамками данного повествования. Для начала внесем корректировки в параметры ядра системы, а именно в файл /etc/sysctl.conf, согласно официальной документации:
kernel.sem = 250 256000 32 1024
kernel.msgmax = 65535
kernel.msgmnb = 65535
Следующие параметры зависят от количества установленной памяти в вашем сервере.Например, в моём случае, когда установлено 12 Гб, значения следующие:
kernel.shmmax = 12619325440
kernel.shmall = 2772801
Как расчитывать эти значения ?
Параметр shmmax равен физическому размеру оперативной памяти в сервере. Параметр shmall задается в количестве 4K блоков памяти умещающихся в 90% физической памяти. Вам поможет следующая формула: shmall = shmmax * 0,9 / 4096.
Итак, Вы внесли изменения в файл /etc/sysctl.conf, теперь чтоб они вступили в силу необходимо выполнить нижеследующую команду:
sudo sysctl -p
Теперь нам понадобятся дистрибутивы программ, которые мы возьмем с сайта 1С. Перейдите в домашний каталог:
cd ~
Для начала скачаем IB DB2 (426M):
wget http://downloads.v8.1c.ru/get/Info/Platform/DB2_22251/v9.5.4_linuxx64_expc_1C.tar.gz
Распакуем полученный дистрибутив (он распаковался в папку expc):
tar xfz v9.5.4_linuxx64_expc_1C.tar.gz
Качнём дистрибутив платформы (128M):
wget http://dl01.v8.1c.ru/get/Info/Platform/8_2_11_236/setupdeb64.rar
Обратите внимание на следующий забавный факт, что дистрибуция платформы 1C под Linux запакована WinRar'ом... :-)
Соответственно, сразу устанавливаем распаковщик, если он у вас ещё не стоял:
sudo apt-get install unrar
Теперь распаковываем выкаченный пакет, чтоб получить deb-пакеты:
unrar x setupdeb64.rar
Для запуска и работы IBM DB2 на 64-битной Linux Ubuntu нужна библиотека libstdc++.so.5, которую мы сейчас поставим вручную. Для начало выкачаем её deb-архивы из репозитория для разных платформ:

wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-20_amd64.deb
wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-20_i386.deb
Сначалу принудительно установим библиотеку для i386:
sudo dpkg --force-architecture -i libstdc++5_3.3.6-20_i386.deb
Вручную перемещаем в "нужный" каталог:
sudo mv /usr/lib/libstdc++.so.5* /usr/lib32/
А теперь нативную библиотеку:
sudo dpkg -i libstdc++5_3.3.6-20_amd64.deb
Проверяем:
sudo updatedb
locate libstdc++.so.
Должны получить такой вывод на консоли:
/usr/lib/libstdc++.so.5
/usr/lib/libstdc++.so.5.0.7
/usr/lib/libstdc++.so.6
/usr/lib/libstdc++.so.6.0.13
/usr/lib32/libstdc++.so.5
/usr/lib32/libstdc++.so.5.0.7
/usr/lib32/libstdc++.so.6
/usr/lib32/libstdc++.so.6.0.13
Так же нужно поставить стандартным образом следующие пакеты, иначе инсталляция всё равно будет ругаться на то что, не может найти libstdc++.so.5 и libaio.so.1 :
sudo apt-get install ia32-libs libaio-dev
Уф. Вроде "усё" выкачали и распаковали.

Для начала установим сам сервер 1С:
sudo dpkg -i *.deb
Дополнительно поставим часть пакетов:
sudo apt-get install imagemagick msttcorefonts libgsf-1-114 texlive-base texlive-binaries
Проверим все ли библиотеки установлены:
sudo /opt/1C/v8.2/x86_64/utils/config_server
Теперь запустим сервер 1С:Предприятия:
sudo /etc/init.d/srv1cv82 start
И настроим автозапуск:
sudo update-rc.d srv1cv82 defaults
Готово.

Теперь примемся за установку DB2. Как вы помните у нас лежит распакованный дистрибутив в папке ~/expc. Перейдем туда:
cd ~/expc
Запускаем установщик:
sudo ./db2_install
Оставляем каталог по умолчанию:

нет
После чего устанавливаем сам продукт:

EXP
Теперь начинается самое интересное. Зайдём под правами суперюзера:
sudo -i
Создаём пользователей необходимых для работы DB2:
useradd -m dasusr1
useradd -m db2fenc1
useradd -m db2inst1
Задаем им пароли:
passwd dasusr1
passwd db2fenc1
passwd db2inst1
Создаем DB2 Administration Server (DAS):
cd /opt/ibm/db2/V9.5/instance/
./dascrt dasusr1
Создаим экземпляр DB2, настроенный на работу через порт 50000 (порт DB2 по-умолчанию):

./db2icrt -u db2fenc1 -p 50000 db2inst1
Зайдём под пользователем db2inst1:

su - db2inst1
Конфигурируем DB2 для работы с 1С:

db2set DB2_WORKLOAD=1C
Запускаем экземпляр DB2:

db2start
Возвращаемся в root через Ctrl-D (logout)
Настраиваем автозапуск сервера:

./db2iauto -on db2inst1
Готово.

Теперь надо подружить 1С и DB2.
Для начала выясним код группы доступа, которая является основной для запущенного экземпляра DB2:
id db2inst1
У меня вот такой вывод:

uid=1006(db2inst1) gid=1007(db2inst1) группы=1007(db2inst1),1005(dasusr1)
После этого необходимо добавить пользователя usr1cv81 в эту группу доступа (в моём случае, это 1007):

usermod -G 1007 usr1cv82
Чтобы сервер 1С:Предприятия видел динамические библиотеки DB2, то их нам надо их добавить в пути поиска. а так же задать "правильные" переменные окружения для корректной работы. Для этого добавим в конец файла /home/usr1cv82/.profile подключение профиля от нашего экземпляра DB2:
echo ". /home/db2inst1/sqllib/db2profile" >> /home/usr1cv82/.profile
Теперь перезапустим сервер 1С:
sudo /etc/init.d/srv1cv82 restart
Готово.

Таким образом мы получили работающую связку 1С и DB2 на одном сервере под управлением Linux Ubuntu 10.04 LTS.

вторник, 20 апреля 2010 г.

Yaml-формат и GEdit

Хозяйке на заметку

Я пишу в основном под PHP Symfony Framework, поэтому часто сталкиваюсь с редактированием YAML-файлов.
Окончательно переполз под Ubuntu и с удивлением обнаружил что боковая панель (File Browser) в GEdit не показывает в списке файлов и каталогов текстовые файлы *.yml, а так же отсутствует подсветка синтаксиса для данного типа файлов.
Как выяснилось это происходит из-за того что база MIME-типов считает что файлы формат YAML не является текстовыми файлами, а умный GEdit отображает лишь текстовые файлы в своей боковой панели.
Итак, что же делать? Добавим новый MIME-тип:
1) Создадим файлик x-yaml.xml со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="text/x-yaml">
<comment>YAML document</comment>
<comment xml:lang="ru">Документ - YAML</comment>
<comment xml:lang="en_GB">YAML document</comment>
<acronym>YAML</acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.yml"/>
<glob pattern="*.yaml"/>
<expanded-acronym>Yaml Aint Markup Language</expanded-acronym>
</mime-type>
</mime-info>
2) Положим его в /usr/share/mime/packages
3) Выполним sudo update-mime-database /usr/share/mime для обновления
Готово, теперь GEdit прекрасно показывает и открывает YAML-фалики.
Но что это? GEdit теперь видит, открывает, но не знает как раскрасить этот формат файла и не имеет соответствующего файла расцветки.
Что делать? Создаем свой файл "расцветки":
4) Создадим файлик yaml.lang с нижеследующим содержанием:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Masood Behabadi <m.behabadi AT gmail DOT com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<language id="yaml" _name="YAML" version="2.0" _section="Others">
<metadata>
<property name="globs">*.yaml;*.yml;</property>
<property name="line-comment-start">#</property>
</metadata>
<styles>
<style id="scalar" _name="Block literal" map-to="def:string"/>
<style id="comment" _name="Comment" map-to="def:comment"/>
<style id="string" _name="String" map-to="def:string"/>
<style id="anchor" _name="Anchor" map-to="def:identifier"/>
<style id="tag" _name="Tag" map-to="def:preprocessor"/>
<style id="alias" _name="Alias" map-to="def:type"/>
<style id="map-key" _name="Map key" map-to="def:keyword"/>
<style id="directive" _name="Directive" map-to="def:shebang"/>
<style id="null" _name="Null" map-to="def:special-constant"/>
<style id="bool" _name="Boolean" map-to="def:boolean"/>
<style id="int" _name="Integer" map-to="def:decimal"/>
<style id="float" _name="Floating point" map-to="def:floating-point"/>
</styles>
<definitions>
<define-regex id="ischar">[^-\?:,\[\]\{\}#&amp;*!|&gt;'"%@\s]</define-regex>

<define-regex id="lschar">[\s\[\{,]</define-regex>
<define-regex id="rschar">[\s\]\},]</define-regex>
<context id="scalar">
<start>(?&lt;=^|\s)[|&gt;]$</start>
<include>
<context end-parent="true" style-ref="scalar">
<start>^(?'indent'\s+)</start>
<end>^(?!\%{indent@start})</end>
</context>
<context end-parent="true">
<match>(?=.)</match>
</context>
</include>
</context>
<context id="alias" style-ref="alias">
<match>(?&lt;=^|\s)\*\%{ischar}+(?=$|\s)</match>
</context>
<context id="tag" style-ref="tag">
<match>(?&lt;=^|\s)!(?:\%{ischar}*)?!?\%{ischar}+(?=$|\s)</match>
</context>

<context id="anchor" style-ref="anchor">
<match>(?&lt;=^|\s)&amp;\%{ischar}+(?=$|\s)</match>
</context>
<context id="string" end-at-line-end="true" style-ref="string">
<start>(?&lt;=^|\%{lschar})(?'q'["'])</start>
<end>[^\\]\%{q@start}</end>
</context>
<context id="unquoted-string" end-at-line-end="true" style-ref="string">
<start>(?=\%{ischar}|[:-\?\]\}]\S)</start>
<end>(?=:\s|:$|\s#)</end>
</context>
<context id="inline-unquoted" end-at-line-end="true" style-ref="string">
<start>(?=\%{ischar}|-\S)</start>
<end>(?=[:,?\[\{\]\}]|\s#)</end>
</context>
<context id="null" style-ref="null">
<match>(?:null)(?=\s*$|\s+#)</match>
</context>
<context id="inline-null" style-ref="null">
<match>(?:null)(?=\s*[:,?\[\{\]\}]|\s+#)</match>
</context>

<context id="bool" style-ref="bool">
<match>(?:true|false)(?=\s*$|\s+#)</match>
</context>
<context id="inline-bool" style-ref="bool">
<match>(?:true|false)(?=\s*[:,?\[\{\]\}]|\s+#)</match>
</context>

<context id="inline-int" style-ref="int">
<match>-?(?:0|[1-9][0-9]*)(?=\s*[:,?\[\{\]\}]|\s+#)</match>
</context>
<context id="int" style-ref="int">
<match>-?(?:0|[1-9][0-9]*)(?=\s*$|\s+#)</match>
</context>

<context id="inline-float" style-ref="float">
<match>-?(?:0|[1-9][0-9]*)(?:[.][0-9]*)?(?:[eE][-+]?[0-9]+)?(?=\s*[:,?\[\{\]\}]|\s+#)</match>
</context>
<context id="float" style-ref="float">
<match>-?(?:0|[1-9][0-9]*)(?:[.][0-9]*)?(?:[eE][-+]?[0-9]+)?(?=\s*$|\s+#)</match>
</context>
<context id="comment" style-ref="comment">
<match>(?&lt;=^|\s)#.*$</match>
</context>
<context id="inline-sequence">
<start>(?&lt;=^|\s)\[</start>
<include>
<context ref="scalar"/>
<context ref="inline-sequence"/>
<context ref="inline-map"/>
<context ref="comment"/>
<context ref="alias"/>
<context ref="tag"/>
<context ref="anchor"/>
<context ref="string"/>
<context ref="inline-null"/>
<context ref="inline-bool"/>
<context ref="inline-int"/>
<context ref="inline-float"/>
<context ref="inline-unquoted"/>
<context end-parent="true">
<match>\]</match>
</context>
</include>
</context>
<context id="inline-map">
<start>(?&lt;=^|\s)\{</start>
<include>
<context ref="scalar"/>
<context ref="inline-sequence"/>
<context ref="inline-map"/>
<context ref="comment"/>
<context ref="alias"/>
<context ref="tag"/>
<context ref="anchor"/>
<context ref="string"/>
<context ref="inline-null"/>
<context ref="inline-bool"/>
<context ref="inline-int"/>
<context ref="inline-float"/>
<context ref="inline-unquoted"/>
<context end-parent="true">
<match>\}</match>
</context>
</include>
</context>
<context id="map">
<match>(?&lt;=^|\s)((?:[^:]|:(?=\S))+)(?::\s|:$)</match>
<include>
<context sub-pattern="1" style-ref="map-key"/>
</include>
</context>
<context id="sequence">
<match>^\s*-\s+</match>
</context>
<context id="document" style-ref="comment">
<match>^(?:-{3}|[.]{3})(?:\s|$)</match>
</context>
<context id="directive" style-ref="directive">
<match>^%\%{ischar}(?:\%{ischar}|\s)*</match>
</context>
<context id="yaml">
<include>
<context ref="directive"/>
<context ref="document"/>
<context ref="scalar"/>
<context ref="sequence"/>
<context ref="inline-sequence"/>
<context ref="inline-map"/>
<context ref="comment"/>
<context ref="null"/>
<context ref="bool"/>
<context ref="int"/>
<context ref="float"/>
<context ref="alias"/>
<context ref="tag"/>
<context ref="anchor"/>
<context ref="map"/>
<context ref="string"/>
<context ref="unquoted-string"/>
</include>
</context>

</definitions>

</language>
5) Положим его в /usr/share/gtksourceview-2.0/language-specs
Ву-а-ля. Миссия выполнена. Мы подружили GEDIT и YAML.
Теперь мы можем полноценно работать с документами в этом формате.