Итак, Вы решили, что уже стали взрослым программистом, и надо бы разобраться, как вообще в мире взрослых программ происходит их сборка и установка. Разбираться с этим лучше всего на базе какой-нибудь нужной программы, с целью получить с этого какой-либо профит (например, начать эксплуатировать знания, зарабатывая какие-то деньги у каких-то клиентов).
Давайте разберемся, что мы тут будем делать по-взрослому, по программистскому )))
- Установим Ubuntu Server на виртуалку, чтобы было на чем тренироваться.
- Скачаем с сайта 1С последние исходники с патчами.
- Накатим патчи на исходники.
- Прикола ради попробуем собрать - не получилось, ибо в исходниках Postgres'а ошибочка в юнит-тесте XML.
- Соберем вручную.
- Инстальнем, что получилось.
- Создадим кластер.
- Попробуем запустить - ай-ай-ай, не запускается.
- Исправим файлик запуска.
- Накатим что-нибудь большое, чтобы было с чем поиграться и потестировать. Например, базу недействительных паспортов.
- Соберем с оптимальными ключами.
- А есть ли разница?
Ну что ж, приступим.
Установим Ubuntu Server на виртуалку
Итак, скачаем образ серверного Ubuntu отсюда. Если в качестве хост-стстемы у Вас стоит Windows, то, как я слышал, там есть какие-то проблемы с запуском 64-битных виртуалок. Если не взлетает - качните 32-битный образ, но это как-то не по-взрослому. Если у кого еще нет виртуальной машины, то это всегда можно по-быстрому исправить.
Собственно, у меня больше проблем возникает с установкой Windows, но, на всякий случай, покажу Вам пару картинок, как вообще развернуть Ubuntu Server на VirtualBox'е.
Для начала создадим новую виртуальныю машину. Запустим VirtualBox:
В окошке создания новой виртуальной машины укажем имя, тип и версию гостевой операционной системы:
Дальше немного настроек. Отдадим нашей ситеме 1 гибибайт памяти (ну или гигабайт, если Вы привыкли говорить так):
Создадим виртуальный жесткий диск емкостью в 20 ГиБ, например.
Перейдем к настройкам машины. В настройка системы уберем загрузку с дискеты, укажем самый новый чипсет и PS/2 мышь.
На закладке "Ускорение" укажем, что используем аппаратную виртуализацию по полной (надеюсь, она у Вас есть).
В настройках носителей примонтируем в "оптический привод" наш образ. В принципе можно указать, что это "Live-CD".
С виртуалкой все. Теперь давайте установим систему.
После старта, если у Вас все галочки поставились как надо, Вы увидите экран с выбором языка:
Выберем с помощью стрелок клавиатуры нужный нам язык (например, "Русский") и нажмем Enter на первом пункте "Установить Ubuntu". Дальше Вам зададут абсолютно стандартные вопросы на тему раскладок клавиатуры и имени пользователя, как разбить диск и что туда ставить. В принципе не вижу ничего сложного в том, чтобы выбрать правильный ответ. Вопросы при сдаче экзамена на какого-нибудь профессионала куда сложнее, а количество пересдач в нашем случае вообще неограничено.
После установки мы получим какой-то такой экран. И если у Вас получится ввести имя пользователя и пароль правильно с первого раза, то Ваш экран будет незначительно отличатся от моего )))
Заметьте, Ubuntu не дает никаких гарантий, а Windows дает? Кто-нибудь уже стряс что-нибудь с Microsoft? Нет? Ну а если нет разницы, то зачем платить больше? ))) Кстати, всегда интересовало, какие гарантии снимает с нас 1С, когда мы ковыряемся в СУБД своими шаловливыми ручками? И на какие гарании можно рассчитывать от 1С и с каким SLA, если мы ничего такого не делаем? А то тут недавно в одной большой конторе пришлось залезть в их MS SQL, чтобы исправить ошибку формирования оборотки, в которой внезапно пропала вся аналитика. Цифры есть, а субконто - нет. Синтетику - пожалуйста, а если с аналитикой - пустой отчет. Странно, что никто в сторону MS и 1C даже не мяукнул, во всем обвинили разработчиков конфигурации, а не платформы, операционной системы или сервера СУБД, в которых, собственно, и была проблема. Так что если Вас до сих пор волнуют вопросы гарантии - сходите и прыгните с высогого здания, чтобы зря не мучиться)))
Продолжаем разговор (с)...
Для начала обновим систему, чтобы все было хорошо. Для этого наберем в командной строке такое заклинание:
sudo apt-get update
sudo apt-get dist-upgrade
Первая команда обновляет из репозитариев информацию о пакетах, а вторая скачивает и устанавливает обновления, включая обновления ядра. У меня все оказалось после установки новое.
Дальше можно накатить пакет расширений для гостевой ОС. Для этого в меню "Устройства" виртуальной машины выберите "Подключить образ диска дополнений гостевой ОС". После этого нам следует куда-нибудь примонтировать CDROM и запустить скриптик, устанавливающий дополнения:
sudo mount /dev/cdrom /media/cdrom
cd /media/cdrom
Если сейчас мы запустим скрипт, то полчим ошибку, т.к. у нас не установлены пакеты для сборки. Давайте исправим это:
sudo apt-get install build-essential
Теперь установим гостевое ПО:
sudo sh VBoxLinuxAdditions.run
Получилось? Замечательно!
Устанавливаем правильную локаль
Для того, чтобы 1С не говорила, что Postgres невозможно использовать, в системе нужно поставить правильную "локаль". Для этого следует выполнить следующие команды:
locale-gen en_US
locale-gen ru_RU
update-locale LANG=ru_RU.UTF8
dpkg-reconfigure locales
Команды эти необходимо выполнять от имени администратора. Для этого лучшее всего ввести "sudo -i", после чего система "переходит" в режим root'а. Выйти из него можно (и нужно, чтобы не было проблем с дальнейшими нашими действиями) командой "exit".
Качаем Postgres с сайта 1С с патчами
На 1С-овском сайте есть соответствующий раздел, в котором абсолютно открыто лежат нужные нам файлики в количестве целых одна штука. Чтобы не мучиться с сетевыми папками и прочим, давайте скачаем этот файлик прямо из Ubuntu. Для этого в linux есть простой скачивальщик файлов "wget". Так и запишем:
wget http://v8.1c.ru/overview/postgresql_patches/9-4-2/postgresql-9.4_9.4.2-1.1c.deb.zip
Теперь остается распаковать файл и попытаться собрать. Для упрощения жизни давайте установим миднайт-коммандер - замечательный файловый менеджер. Полагаю, Вы уже поняли, как устанавливаются здесь программы: просто набираете "sudo apt-get install имя_программы" и вводите пароль. Если хотите более выдающегося интерфейса, то можете зайти в менеджер пакетов aptitude, но там и потеряться можно - пакетов тысячи. Запускаем mc и видим скаченный нами файл:
Создадим каталог, например postgres-install, в который с помощью mc распакуем наш архив. Собственно, здесь у нас три файла: файл с оригинальным постгресом (он абсолютно идентичен архиву с исходниками с официального сайта Postgres'а, только название изменено), файл с заплатками для сборки пакета под debian (Ubuntu использует инструменты сборки пакетов из debian, так что это то, что нужно) и файл с описанием (.dsc - дескрипшн). Давайте распакуем все это и накатим патчики. Для этого нам нужно выполнить следующую команду:
dpkg-source -x *.dsc
Вот что должно появиться на Вашем экране:
Мы распаковали файлы с исходниками и применили к ним патчи.
Если бы не было ошибки с юнит-тестом XML в данной версии сборки, то мы бы могли написать одну команду, которая собрала бы нам установочные пакеты. Но т.к. при этом запускаются юнит-тесты и на одном из них валится ошибка, то нам придется собирать пакет самостоятельно. И это ... хорошо! )))
Собираем PostgreSQL вручную
Для того, чтобы все было совсем хорошо, нам надо узнать, какие библиотеки поставить для сборки. Поэтому все-таки воспользуемся той волшебной командой, которая могла бы нам собрать пакет. Для этого нужно зайти в каталог, в который распаковались исходники, и запустить следующую команду:
cd postgresql-9.4-9.4.2
dpkg-buildpackage -rfakeroot
В выводе команды у нас будет следующее сообщение: "Неудовлетворенные сборочные зависимости: ..." Указанные пакеты надо поставить через уже известный нам sudo apt-get install:
sudo apt-get install libperl-dev libipc-run-perl tcl8.6-dev libedit-dev libssl-dev libpam0g-dev libxml2-dev krb5-multidev libldap2-dev libselinux1-dev libxslt1-dev python-dev python3-dev bison openjade docbook-dsssl docbook-xsl docbook opensp xsltproc libicu-dev ...
В общем и целом наша задача - переписать в эту строку все те пакеты, которые нам понадобятся и на которые ругается dpkg.
Кстати, стоит особо отметить одну библиотеку, в которой нуждается 1С-овский постгрес - это icu. В серверной убунту 14.04 по умолчанию ставится версия 52 этой библиотеки, но люди говорят, что надо 48-ю, поэтому эти два пакета придется скачать отдельно и установить командой "dpkd -i имя_пакета". Нам нужны пакеты ibicu-dev и libicu48.
После того, как все пакеты установлены, можем еще раз запустить "dpkg-buildpackage -rfakeroot", чтобы проверить, все ли зависимости удовлетворены. Если сборка пошла, то можно подождать и узнать, что из этого выйдет. У меня все завершается ошибкой юнит-теста для xml. Но то, что сборка началась - это уже хорошо. Давайте соберем это чудо программной мысли руками. Для этого запустим ./configure. Эта команда подготавливает make-файл для сборки. В качестве ключей можно передать те или иные параметры, о которых можно узнать с помощью ./configure -- help. Можно запустить и без ключей, указав параметры сборки по-умолчанию. Видел рекомендацию запускать так: "./configure --disable-integer-datetimes", но, как мне кажется, это не обязательно.
Когда команда ./configure отработает, мы получим возможность собрать нашу программу. Если ошибок не было, то выполните make clean, чтобы почистить мусор от предыдущей неудачной сборки. Дальше соберем программу с помощью make -j X, где Х - это количество потоков. Я указываю 8, т.к. у меня типа восьмиядерная машина (четыре виртуальных ядра i7 я тоже считаю). Вот, все побежало куда шустрее, хотя я и выделил своей виртуальной машине всего два ядра из четырех. Если все собралось хорошо, то последней строчкой будет такая: "All of PostgreSQL successfully made. Ready to install."
Установка
Ну собрать мы вроде как собрали, теперь давайте установим. В этом тоже ничего сверхъестественного нет, просто выполним sudo make install и введем пароль. Установка у меня заняла примерно 2 секунды. Теперь попробуем запустить нашу СУБД. Для этого нужно произвести следующие шаги:
- Создать пользователя postgres командой: "sudo useradd postgres -p postgres -U -m"
- Установить владельцем каталога, куда мы поставили PostgreSQL, данного пользователя: "sudo chown -R postgres:postgres /usr/local/pgsql"
- Инициализировать кластер: "/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data". Тут нужно отметить, что кластер придется создавать от имени пользователя postgres. Чтобы залогиниться под ним, надо выполнить "sudo su - postgres". После инициализации кластера в каталоге "data" создается структура кластера с конфигурационными файлами, и нам сообщают, что каталог инициализирован и можно запустить постгрес такой-то или этакой-то командой. Если мы попытаемся запустить команду от рута, то нам скажут, что это небезопасно. Если от пользователя postgres - то поулчим ошибку "FATAL: could not create lock file ...".
- Поборем ошибку из 3. Для этого нам нужно поменять файл postgresql.conf, который находится в каталоге data. Отредактировать там надо параметр "unix_socket_directories", в котором нужно указать каталог "/tmp". И не забудьте убрать решетку в начале строки.
Автозагрузка
Пропишем наш сервер в автозагрузку. Для этого нужно:
- Скоприовать файлик из каталога сборки "contrib/start-scripts/linux" в каталог "/etc/init.d/". Выполним "sudo cp ./contrib/start-scripts/linux /etc/init.d/postgres".
- Сделать файл исполняемым "sudo chmod +x /etc/init.d/postgres"
- Выполнить "sudo update-rc.d postgres defaults" для обновления информации об автозагрузке.
- Ну и финальное "sudo service postgres start"
Все, теперь у нас полностью рабочий постгрес, который можно юзать для работы с 1С. Подключимся к нему с помощью pgadmin:
В принципе, у меня после такой установки все заработало: и база 1С создалась (демоторговля), и документы в ней провелись (710 штук) за достаточно небольшое время. При этом я еще не трогал настройки и не компилировал ничего с ключами оптимизации быстродействия.
По поводу оптимизации, то предлагаю Вам собрать постгрес с ключами, оптимальными для Вашего процессора. Для этого нужно выполнить команду "gcc -march=native -E -v - </dev/null 2>&1 | grep cc1", в выводе которой лично у меня вот что:
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu - -march=corei7-avx -mcx16 -msahf -mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd -mno-f16c -mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr -mxsave -mxsaveopt --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx -fstack-protector -Wformat -Wformat-security
Из этого всего нам надо то, что является ключом (т.е. со знаком "-" или "--" перед словом). Я лично взял начиная с "-march=corei7-avx" и до конца строки. Для того, чтобы компиляция пошла с этими ключами, нам надо передать их в ./configure через опцию CFLAGS. Т.е. пишите что-то типа:
./configure CFLAGS='-march=corei7-avx ...'
Вот и все!