Предисловие
Возникла у меня с полгода назад задачка: быстро и с минимальными затратами организовать работу аудиторской фирмы после переезда и резкого расширения штата сотрудников. Имелся десяток стареньких компьютеров, NAS c RAID-массивом, около ста тысяч рублей денег на всё про всё. Надо было умудриться купить ещё несколько компьютеров и сделать так, чтобы «тормоза», к которым сотрудники уже почти привыкли, хотя бы не усилились. Появились и рабочие места вне офиса, по области, с не очень-то «толстым» каналом в Интернет. Плюс ко всему имелось пожелание улучшить безопасность: новые сотрудники должны быть ограничены в доступе к некоторым базам данных, не могли скопировать базы к себе на «флэшку» и т.п.
Понятно, что в такой (впрочем, как почти в любой) фирме всё вертится вокруг 1С (в данном случае — 8.2). Используются файловые базы данных, это для заказчика весьма важно. Узкое место здесь — сеть. Ну, предположим, заменить 100-мегабитное оборудование на гигабитное несложно, но есть ещё и вопрос безопасности: файлы в общем доступе — хорошая дырка. А ведь есть ещё и удалённые рабочие места. Очевидно, что я стал смотреть в сторону терминального доступа.
Покрутив в голове и электронных таблицах различные варианты коммерческих терминальных серверов известных фирм я понял: в бюджет не уложиться. Зато, как я помнил, 1с версии 8.3 существует в виде «нативной» реализации под Linux, при этом конфигурации от 8.2 с ней вполне совместимы. Проведя пару экспериментов дома, я решился и вышел к заказчику с предложением: «делаем терминальное решение полностью на Linux!» Заказчик отреагировал здраво: «хоть на чёрте лысом делай, но чтоб в понедельник всё работало!» И я взялся за работу.
В статье я вольным стилем и кратко опишу, как я решал задачу. Не претендую на то, что сделал всё правильно и хорошо, однако задача решена и пользователи довольны.
Реализация
Оборудование и технологии
В качестве сервера приобрели Lenovo ThinkServer TS140 c 4-ядерным процессором Intel Xeon и 16Гиб ОЗУ. Выбор пал на него, потому что он в Desktop-корпусе и очень тихий (я бы сказал — потрясающе тихий при его-то мощности), а выделенной серверной у заказчика не было. Также на борту у сервера имелось два жёстких диска с маркировкой «1Тб».
В качестве клиентских терминалов я выбрал недорогие ноутбуки Packard Bell (о чём впоследствии несколько пожалел), их удалось купить нужное количество и уложиться в бюджет. Почему ноутбуки, а не бездисковые моноблоки? Прихоть заказчика.
Далее — open source и красноглазие.
Мой любимый дистрибутив GNU/Linux — openSuSE. Его я и поставил на сервер, недолго думая. Только на сервер я поставил последнюю на тот момент версию 13.1, а на ноутбуки — 12.3. Это объясняется тем, что на сервере хотелось иметь систему, которая будет долго поддерживаться обновлениями, а на терминалах — проверенную и стабильную операционную систему.
Режим терминального доступа — разумеется, «иксы». Причём без дополнений вроде NX, так как, на мой взгляд, в локальной сети всё это только мешает и затрудняет администрирование. Для удалённой работы — VNC.
Централизация управления пользователями — классическая связка NIS+NFS.
Настройка сервера
Диски сервера я объединил в массив RAID-1 («зеркало»). Получившийся логический том я разбил на корневой ("/"), пользовательский ("/home"), «изменчивый» ("/var") и серверный ("/srv") разделы. Файловая система — ext4, ибо эксперименты с btrfs в частности и создание зоопарка ФС вообще я счёл неразумными.
Был включен и настроен сервер NIS, который экспортирует стандартные списки passwd, group, netid, rpc, services, а также списки автомонтирования auto.master и auto.home. Последние пришлось настроить вручную:
/etc/auto.master:
+auto.master
/home auto.home
/etc/auto.home:
* -fstype=nfs,soft,intr,rsize=8192,wsize=8192,nosuid,tcp 192.168.1.20:/home/&
Включен и настроен NFS-сервер, экспортирующий каталог /home. Был включен также ypxfrd (быстрое обновление экспортированных списков).
Настройка всего этого средствами YaST тривиальна, буквально в несколько кликов мышью.
Принтеры, как имеющиеся в офисе, так и удалённые (об этом позже), были установлены в подсистему CUPS, и их могут видеть все пользователи. Хотелось бы, конечно, назначить разные принтеры по умолчанию для разных пользователей, но это не обязательно, так как 1С запоминает пользовательский выбор принтера.
Все данные пользователей хранятся на сервере, доступ к файлам на NFS по достаточно быстрой локалке абсолютно прозрачен. Пользователи распределены по группам с соответствующими правами.
1С
Технологическую платформу можно получить на официальном сайте (требуется регистрация пользователя и соответствующего продукта 1С), 64-битные версии присутствуют. Нужно также установить библиотеку ImageMagick из стандартных репозиториев.
Не следует, однако, гнаться за самыми новыми версиями платформы. Например, в моей конфигурации были непонятные проблемы с печатью. Поиск по ключевым словам и общение на профильных форумах давало только рекомендации откатиться на предыдущую версию. И правда, версия 8.3.4.496 у меня вполне стабильно работает, в отличие от, скажем, 8.3.5.1119.
«Из коробки» у технологической платформы возникают проблемы с экспортом файлов: при попытке сохранить файл программа «падает» с ошибкой «Ошибка загрузки библиотеки libWand.so по причине:dlopen: невозможно продолжать загрузку объекта со статичным TLS ». Лечится это запуском 1С с параметром окружения «LD_PRELOAD=libgomp.so.1». Если я правильно понял проблему, упомянутая библиотека занимает слишком много места в таблице импортируемых символов 1С — это как-то связано с параметрами её компиляции и бинарник от этой проблемы уже не вылечить без пересборки (а пересборка без исходников невозможна). Через LD_PRELOAD мы засовываем её в память до загрузки 1С и это как-то проблему решает.
Ключ вставлен непосредственно в сервер, так что поднимать и настраивать сервер ключа необязательно. Однако в офисе есть пара машин с 1С 7.7, и для них был запущен haspd от Etersoft. Никаких проблем с этим не возникло, USB-ключи находятся автоматически.
Базы данных разложены в соответствующие каталоги в серверном разделе, им назначены соответствующие права доступа.
К сожалению, пришлось всё-таки вставить один «костыль». Без комментариев.
/etc/crontab:
# Ногами не пинать!!! 1С - [censored] [censored] [censored], которое игнорирует umask.
* 8-21 * * * root chmod -R g+rw /srv/Storage
Терминалы
На терминалах была установлена стандартная комплектация openSuSE, среда LXDE и офисный пакет LibreOffice.
На терминалах в офисе включен клиент NIS. Делается это в YaST. Необходимо также включить пункт «Запускать automount» при настройке.
На рабочем столе создан ярлык для запуска 1С (файл «1C 8.3.desktop»):
[Desktop Entry]
Name=1C 8.3
Exec=ssh -X -c arcfour 192.168.1.20 'LD_PRELOAD=libgomp.so.1 /opt/1C/v8.3/x86_64/1cv8'
Type=Application
StartupNotify=true
Icon=applications-system
Немного поясню про опции SSH. "-X" осуществляет собственно «проброс» протокола X11 через туннель. "-c arcfour" ограничивает выбор алгоритмов шифрования алгоритмом RC4 — он самый быстрый. Внутри локалки сильное шифрование не нужно.
Ключи SSH согласованы, так что пользователи входят на сервер совершенно «прозрачно».
Удалённые терминалы в NIS не подключены. Однако их немного, так что согласовать имена пользователей и ключи SSH несложно.
Для удалённых терминалов ярлык запуска выглядит несколько иначе:
[Desktop Entry]
Name=1C 8.3
Exec=ssh -XС firewall.external.ip.address -p 2022 'LD_PRELOAD=libgomp.so.1 /opt/1C/v8.3/x86_64/1cv8'
Type=Application
StartupNotify=true
Icon=applications-system
Здесь включено сжатие, не ограничивается согласование алгоритмов шифрования и используется нестандартный порт для ssh. Ну просто чтоб не ломились самые тупые боты-брутфорсеры. Разумеется, сервер не подключен к интернету напрямую, а установлен отдельный брандмауэр, на котором порт 2022 «проброшен» на 22-й порт сервера.
Не-Linux клиенты
Да, есть у меня и такие. Полностью «зоопарка» избежать не удалось из-за специфичных приложений, которые даже под WINE не запустить. Это различные банк-клиенты, а также люто ненавидимые мной программы пенсионного фонда или «ПУ 5», которые даже в чистой windows-среде запустить непросто, если у тебя не типичная однопользовательская конфигурация (для их работы требуются права администратора и т.п.)
Внутри офиса всё тривиально: Xming и putty. Правда, выглядят окошки не очень красиво, есть некоторые проблемы с изменением размеров окон в некоторых конфигурациях, но работать можно.
Но возник у меня и один удалённый клиент в селе, которого никак нельзя было перевести на Linux. К тому же у него был принтер, на который непременно надо печатать из 1С. И вот тут начались пляски с бубном и костылями интересные задачи…
Проброс «иксов» по классической схеме показал абсолютную непригодность данного метода на плохих каналах. Пришлось задействовать VNC. Я установил пакет Xvnc, но сразу же отказался от классической схемы с xinetd. Ведь пользователю нельзя разрешать работать с файлами напрямую, как было бы при загрузке полноценного рабочего стола. Я копнул документацию Xvnc чуть глубже и получилось следующее:
~/VNC (исполняемый):
#!/bin/sh
export DISPLAY=:21
vncserver $DISPLAY -localhost -geometry 1280x800 -depth 16 -query localhost -once securitytypes=none
LD_PRELOAD=libgomp.so.1 /opt/1C/v8.3/x86_64/1cv8
vncserver -kill $DISPLAY
~/.vnc/xstartup (исполняемый):
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
openbox &
В конфигурации сеанса putty в разделе SSH я указываю команду ./VNC, а в разделе Tunnels — пробрасываю локальный порт 5900 на серверный порт 5921. Затем клиентом TightVNC соединяюсь с localhost, и получаю голый рабочий стол с запущенной 1С почти без тормозов. Победа! Набрасываю нехитрый «батник», который последовательно запускает putty и tightvnc. Поражаюсь отсутствию в винде стандартных средств задержки на заданное количество секунд и использую классический вариант с ping localhost…
Почему TightVNC? Потому что Xvnc разрабатывается той же командой и имеет свою модификацию кодирования информации внутри протокола VNC. Xvnc будет работать и с другими VNC-клиентами, но не так эффективно.
Затем я принялся размышлять, как же подключить принтер… Вариант таскать по такому каналу SMB-протокол я отбросил сразу. «Службы UNIX для Windows» поднять так и не удалось, LPR-сервер почему-то в упор не видел локальный принтер. Я уже был готов сдаться и начать смотреть в сторону проброса принтера по RDP и виртуальных машин на винде, но вдруг поисковиком нашёлся вот этот малоизвестный проект. После нехитрой настройки программка слушает заданный порт (обычно 9100) и перенаправляет принятые данные на заданный локальный принтер, то есть по сути делает то же, что и копеечные принт-серверы, но внутри windows-машины.
Таким образом проблема была решена. Удалённый порт 29100 при помощи той же putty я пробросил на локальный 9100, а принтер на сервере в CUPS настроил на бэкенд «socket://localhost:29100». Даже «батник» править не пришлось.
Заключение
Несмотря на то, что полностью на Linux перейти не получилось из-за узкоспециализированного и при этом криво написанного софта, доля Linux-машин в организации оказалась свыше 90%. Это говорит о том, что сэкономить на использовании открытого ПО в коммерческих организациях (по крайней мере небольших) уже сейчас вполне реально. Особенно на решениях вроде терминального сервера, которые в исполнении известных коммерческих производителей ПО весьма недёшевы.
Вот, пожалуй, всё, что я могу рассказать о данном конкретном случае. Буду рад ответить на вопросы по теме и выслушать объективную критику.
P.S. Ах да, забыл рассказать про NAS, который остался «за бортом» повествования. Он теперь используется для хранения резервных копий баз и документов. Система резервного копирования duplicity хранит на нём месяц ежедневных инкрементных бэкапов и полгода еженедельных. Тёмными ночами просыпается крон…
Автор: m0Ray