Страница 1 из 1

Запуск 1С под wine

Добавлено: 12 окт 2010, 17:54
Raven
К самой проблемной части миграции с Windows на linux относится и такая распространенная проблема как запуск программы 1С:Предприятие, широко используемой нашими организациями. На днях такая же проблема в очередной раз возникла и передо мной. Но на этот раз задача была сложнее - во первых, база с 1С находилась на виндовой шаре, а не на линуксовой, во вторых в этот раз работать с базой предполагалось нескольким клиентам, в т.ч. и из под виндов. В этой статье я опишу весь процесс запуска 1C, основываясь на собственном опыте, с вкраплениями материала из официальной документации.

Ну чтож, приступим. Для начала грохаем установленную версию ванильного вайна - за несколько дней активных сношений с ним результата от него я так и не смог добиться. Обязательно сносим к чертям директорию ~/wine, ибо нам нужна чистая "Windows" :-D . В качастве среды запуска мы будем использовать wine@Etersoft, для чего качаем архив и распаковываем его в / (любители рукоблудства могут даже смело собрать из него пакет для своей любимой ОС). После этого, нужно скормить вайну поддержку сети, для чего лезем на ftp://ftp.etersoft.ru/pub/Etersoft/CIFS@Etersoft/ и скачиваем свежую версию пакета etercifs под ваше ядро и ОС. У меня АльтЛинукс 5.2 Sisyphus, поэтому я взял пакет etercifs-4.5.3-alt1.noarch.rpm для соответствующей ветки моего дистрибутива и установил

Код: Выделить всё

apt-get install etercifs-4.5.3-alt1.noarch.rpm
Теперь нужно собрать модуль ядра. В скриптах инициализации обычно уже имеется сценарий для пересборки, но на всякий проверим.

Код: Выделить всё

# service etercifs restart
В ответ на эту команду обычно вываливается куча ругани

Код: Выделить всё

Loading CIFS kernel module...     [FAILED]
    package etercifs version 4.3.4
    kernel module etercifs version 4.1.2 is built for current kernel
    WARNING!!! Versions of package etercifs and built module etercifs DON'T MATCH!!!
    Please, run 'service etercifs build' to build the etercifs module (recommended)"
    or run 'CHECK_VERSION=0 service etercifs restart' to disableing check."
Значит мы на верном пути. Делаем как он просит:

Код: Выделить всё

# service etercifs build

Building etercifs 4.5.3 for 2.6.32 Linux kernel (headers in /lib/modules/2.6.32/build)
/usr/bin/gcc
Checking the kernel configuration...
OK
Setting etercifs version: OK
make: Entering directory `/usr/src/kernel/sources/kernel-source-2.6.32/kernel-source-2.6.32'
make: Leaving directory `/usr/src/kernel/sources/kernel-source-2.6.32/kernel-source-2.6.32'
make: Entering directory `/usr/src/kernel/sources/kernel-source-2.6.32/kernel-source-2.6.32'
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifsfs.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.o
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c: В функции ‘SMBLegacyOpen’:
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1118: предупреждение: неиспользуемая переменная ‘count’
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1117: предупреждение: неиспользуемая переменная ‘name_len’
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1116: предупреждение: неиспользуемая переменная ‘bytes_returned’
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1115: предупреждение: неиспользуемая переменная ‘pSMBr’
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1114: предупреждение: неиспользуемая переменная ‘pSMB’
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c: На верхнем уровне:
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1062: предупреждение: ‘convert_disposition’ определена, но нигде не используется
/home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifssmb.c:1093: предупреждение: ‘access_flags_to_smbopen_mode’ определена, но нигде не используется
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifs_debug.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/connect.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/dir.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/file.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/inode.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/link.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/misc.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/netmisc.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/smbdes.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/smbencrypt.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/transport.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/asn1.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/md4.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/md5.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifs_unicode.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/nterr.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/xattr.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifsencrypt.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/readdir.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/ioctl.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/sess.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/export.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifsacl.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifs_spnego.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/dns_resolve.o
  CC [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/cifs_dfs_ref.o
  LD [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/etercifs.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/etercifs.mod.o
  LD [M]  /home/root/tmp/Etercifs.uwTSKVUC/kernel-source-etercifs-2.6.32-1.61/etercifs.ko
make: Leaving directory `/usr/src/kernel/sources/kernel-source-2.6.32/kernel-source-2.6.32'
Stripping module etercifs.ko ...
Copying built module to /lib/modules/2.6.32/kernel/fs/cifs
Do depmod -Ae for 2.6.32 kernel
Запускаем

Код: Выделить всё

# service etercifs start

Loading kernel module etercifs 4.5.3...                                                        [ DONE ]
Включаем автозагрузку:

Код: Выделить всё

# chkconfig etercifs on
В Slackware и подобных ему дистрибутивах все несколько сложнее.

Для того, чтобы после перезагрузки модуль etercifs грузился автоматически, а также, чтобы все ресурсы, прописанные в файле fstab, автоматически монтировались, надо в файл /etc/rc.d/rc.local добавить следующие строки в конец файла:

Код: Выделить всё

#Start etercifs service
if [ -x /etc/rc.d/init.d/etercifs ]; then
  /etc/rc.d/init.d/etercifs start
  mount -a -t cifs
fi
Запускаем wine и наблюдаем за выхлопом в консоль. Если ошибок нет, wine создаст префикс ~/.wine со всеми необходимыми подпапками.

Монтирование сетевого ресурса

Сетевой ресурс можно монтировать либо для каждого пользователя персонально (тогда права доступа будут определяться сервером), либо для всех сразу- при условии что пользователи на локальной машине входят в одну группу, указанную при монтировании (доступ к ресурсу станет определяться местными настройками), а также без контроля прав. Примеры монтирования приведены ниже. Нам потребуется установить пакет, содержащий команду mount.cifs. Например, для систем на основе Debian/Ubuntu она находится в пакете smbfs, для ALTLinux- в пакете samba-client.

Монтировать сетевые ресурсы, предназначенные для использования в WINE, рекомендуется с параметром монтирования wine, включающим в себя все необходимые параметры.

В версии 1.57 CIFS (начиная с ядра 2.6.29) расширено действие команды fsync, когда теперь приводит не только к передаче данных на сервер, но и ожидает окончания их записи на диск. В зависимости от настроек сервера (в SAMBA есть выключенный по умолчанию параметр strict sync, управляющий синхронизацией данных), новое поведение fsync может привести с существенному замедлению при записи. Монтирование с параметром nostrictsync отключает новое поведение, отключая ожидания окончания записи на диск.

Монтирование CIFS-ресурса для использования Linux-программами и для использования в Wine отличается.

Для монтирования удалённого CIFS-ресурса, предназначенного для Wine, необходимо с правами пользователя root выполнить команду:
Пример монтирования сетевой файловой системы

Код: Выделить всё

# mount -t cifs //<сервер>/<ресурс> <локальный каталог>  -o user=<workgroup/user>,pass=<passwd>,file_mode=0660,dir_mode=02770,uid=<user>,gid=<group>,iocharset=utf8,wine,nounix
file_mode=0660 определяет необходимые права на запись/чтение файлов пользователю и указанной (через параметр gid) группе. dir_mode=2770 определяет необходимые права на запись/чтение каталогов пользователю и указанной (через параметр git) группе. iocharset=utf8 определяет кодировку отображаемых имен файлов и каталогов (должна соответствовать кодировке локали в вашей системе).

Если монтировать с параметром noperm, права доступа к файлам будут проверяться на сервере, а не на локальном компьютере (это поможет избежать проблем при несовпадении UID и GID на сервере и локальной машине). Если разграничение доступа к базе не очень важно, это наиболее удобный вариант для совместной работы разных терминальных пользователей с базой. Если вы не уверены, нужен ли вам параметр монтирования noperm, то следует его установить!

Пример монтирования с параметром noperm

Код: Выделить всё

# mount -t cifs //<сервер>/<ресурс> <локальный каталог> -o user=<workgroup/username>,pass=<password>,noperm,wine,nounix
Если user и pass не указываются, тогда авторизация на сервере производится от имени пользователя guest. Если не указан пароль, система спросит его в любом случае.

После этого следует создать новый виртуальный диск-каталог в ~/.wine/dosdevices, который будет указывать на локальный каталог, куда смонтирована файловая система.

Монтирование для использования в Linux (например, для домашнего каталога, или для (совместной) работы с файлами OpenOffice отличается параметрами монтирования: не нужно указывать параметры wine,nounix.

Утилита монтирования etermount

Утилита etermount осуществляет монтирование сетевого ресурса по протоколу cifs с предустановленным набором параметров: user=guest,pass=,rw,iocharset=utf8,noperm,wine,nounix, который задан переменной MOUNT_OPTIONS в файле /etc/etercifs.conf. Чтобы смонтировать ресурс //server_1C/base в точку монтирования /home/raven/base мне нужно выполнить команду:

Код: Выделить всё

# etermount //server_1C/base /home/raven/base
Если точка монтирования не указана, то по умолчанию она имеет значение, указанное в переменной DEFAULT_MOUNTPOINT в файле /etc/etercifs.conf.

Монтирование сетевого ресурса при загрузке системы

Для автоматического монтирования ресурса по протоколу CIFS при загрузке системы нужно вписать соответствующую строку в файл /etc/fstab. Обратите внимание, что при использовании доступа по паролю важно использовать файл credentials, в котором указывается имя пользователя и пароль, чтобы не хранить пароль в самом /etc/fstab (поскольку /etc/fstab доступен для чтения пользователям и это небезопасно).

Пример указания точки монтирования по протоколу CIFS в fstab

Код: Выделить всё

//192.168.33.1/base /home/raven/base cifs credentials=/etc/credentials,rw,iocharset=utf8,noperm,wine,nounix 0 0
Пример файла /etc/credentials для ресурса без пароля

Код: Выделить всё

username=guest
password=
Рекомендуемые права доступа для файла /etc/credentials- 0600, то есть файл не должен быть доступен пользователям на чтение. Такие права можно установить командой chmod 600 <имя файла>.

Поскольку сначала происходит монтирование ресурсов, указанных в fstab, а уже потом загрузка модуля etercifs, то в общем случае нельзя гарантировать, что набор действий “отмонтирование ресурсов CIFS, выгрузка модуля ^cifs^, загрузка модуля ^etercifs^ и монтирование ресурсов CIFS” завершится корректно. Если вдруг после первого монтирования по каким-то причинам некий процесс занимает примонтированный ресурс, то отмонтирования не произойдёт, соответственно, драйвер не выгрузится.

Сетевые пути (UNC)

WINE позволяет работать win-приложениям, которые обращаются к ресурсам при помощи сетевого пути (UNC). Это необходимо для тех приложений, которым обязательно требуется указание UNC-пути, например путь к базе данных: \\someserver\db\db1. Сетевые пути в WINE обеспечиваются так же, как и логические диски — при помощи символьных ссылок на каталоги host-системы.

Обратите внимание, что отношения к сетевой работе это не имеет, и в wine является просто средством отображения локального каталога в сетевой путь.

Допустим, моя программа обращается к каталогу \\server_1С\base\. Чтобы обращение по такому пути работало в WINE, нам потребуется создать в каталоге ~/.wine/dosdevices/unc/ каталог server, содержащий символьную ссылку share, указывающую на расположение данного ресурса в host-системе.

Создание UNC-пути

Код: Выделить всё

$ cd ~/.wine/dosdevices
$ pwd
/home/tester/.wine/dosdevices
$ mkdir -p unc/server
$ ln -s /home/raven/base unc/server/base
$ ln -s unc/server/base u:
Ресурс /home/raven/base будет доступен win-приложениям через UNC-путь \\server_1С\base, либо через диск U:.

Итак, что мы имеем теперь - (простыми словами)? Шара монтируется локально в /home/raven/base, на нее ссылается символическая ссылка /home/raven/.wine/dosdevices/unc/server/base, на которую в свою очередь ссылается ссылка /home/raven/.wine/dosdevices/u: *CRAZY* замудренно, ничего не скажешь, зато работает как надо.

Запускаем winecfg и настраиваем сам вайн. Непосредственно для запуска 1С там все уже настроено
Изображение

но я предпочитаю добавить еще один пунктик - корень диска, поскольку это позволит запускать .exe и .msi из любого места.
Изображение


Ставим 1С
Сразу оговорюсь, что все перечисленное ниже предназначено для 1С версии 7.70.027, на 8-х версиях я это не пробовал, версии 7.70.025 и старше для данной конфигурации оказались непригодны, так как база размещается на виндовой шаре (будь она на линуксовой все должно было быть нормально), а винда как известно исполбзует кодировки 125х, порядок сортировки символов в которых отличается от Юникодового. Из-за этого возникают большие проблемы с запуском.

Итак, запускаем инсталлятор 1С, выбираем тип "Сетевой" и кликаньем кнопки "Далее" доводим дело до логического завершения, не забыв при этом снять галочку "Запустить программу 1С:Предприятие".
Теперь нужно побороть сплеш-скрин (желтая картинка запуска), поскольку если просто запустить программу, окно требующее ввода логина и пароля окажется ПОД этой картинкой, и тогда останется только один путь для ее выключения - kill или killall, в общем наглое уничтожение процесса. Можно конечно убрать в конфигураторе вайна галочку "Разрешить менеджеру окон управлять окнами Wine", но тогда мы деинтегрируем окна виндовых программ из своего окружения рабочего стола (что не особо эстетично), плюс окошко 1С с запросом логина/пароля окажется не чувствительным к переключению раскладки клавиатуры. Погуглив немного я нашел патченную dll-ку от 1С, в которой сплеш-картинка отсутствует совсем (как раз то, что мне и было нужно). Вот эта dll, но учтите - она только для 7.70.027, подмена ее в других версиях приведет к тому, что программа не будет работать вообще! Подменяем ей оригинальную 1crcrus.dll в папке с 1С (желательно созранить на всякий backup оригинала).

Теперь в принциме остается одна проблема - порядок сортировки. Как я уже писал чуть выше, именно из-за него я остановился на версии 7.70.027, поскольку с версии 7.70.026 был введен механизм отключения проверки порядка сортировки символов, путем создания в папке c 1C пустого файла OrdNoChk.prm. Теперь вроде все, запускаем 1С, в окошке с базами жмем "Добавить" (баз-то у нас пока в нем нет) и указываем путь на диск U:. Затем запускаем программу с выбранной базой, вводим логин/пароль и вуаля - получаем полностью работоспособную программу.

Изображение

Хотя... есть один нюанс - иногда выскакивает сообщение "Ошибка блокировки данных. Возможно данные используются другой задачей". Пока не нашел как решить ее на корню, но есть есть способ побороть ее хотя бы временно - линуксовый клиент должен подключаться раньше виндовых.

Re: Запуск 1С под wine

Добавлено: 12 окт 2010, 21:23
Gen1us2k
вайн пускать изпод рута?

Re: Запуск 1С под wine

Добавлено: 13 окт 2010, 09:15
Raven
Etersoftовский вайн не дает запускаться из под рута. Да и вообще, нежелательно запускать его от суперпользователя.

Re: Запуск 1С под wine

Добавлено: 13 окт 2010, 17:36
Gen1us2k
Raven
дык я знаю.. просто строчка
# wine
Смутила малость

Re: Запуск 1С под wine

Добавлено: 14 окт 2010, 09:08
Raven
Ну... Я его немного пропатчил, чтоб из-под рута работало... :-[

Re: Запуск 1С под wine

Добавлено: 14 окт 2010, 09:14
Infernal Flame
Raven
ну да ;) кое-кто постоянно под рутом сидит %)

Re: Запуск 1С под wine

Добавлено: 14 окт 2010, 11:15
Gen1us2k
Главное, чтобы у него пароль был не 123 %)

Re: Запуск 1С под wine

Добавлено: 14 окт 2010, 12:54
Raven
Gen1us2k
А ты как узнал *STOL*
Изображение

Re: Запуск 1С под wine

Добавлено: 16 окт 2010, 20:00
wass
Изображение
там просто 10 единиц, чего пугаться %)