Ну чтож, приступим. Для начала грохаем установленную версию ванильного вайна - за несколько дней активных сношений с ним результата от него я так и не смог добиться. Обязательно сносим к чертям директорию ~/wine, ибо нам нужна чистая "Windows" . В качастве среды запуска мы будем использовать 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
Для того, чтобы после перезагрузки модуль 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
Монтирование сетевого ресурса
Сетевой ресурс можно монтировать либо для каждого пользователя персонально (тогда права доступа будут определяться сервером), либо для всех сразу- при условии что пользователи на локальной машине входят в одну группу, указанную при монтировании (доступ к ресурсу станет определяться местными настройками), а также без контроля прав. Примеры монтирования приведены ниже. Нам потребуется установить пакет, содержащий команду 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
Если монтировать с параметром noperm, права доступа к файлам будут проверяться на сервере, а не на локальном компьютере (это поможет избежать проблем при несовпадении UID и GID на сервере и локальной машине). Если разграничение доступа к базе не очень важно, это наиболее удобный вариант для совместной работы разных терминальных пользователей с базой. Если вы не уверены, нужен ли вам параметр монтирования noperm, то следует его установить!
Пример монтирования с параметром noperm
Код: Выделить всё
# mount -t cifs //<сервер>/<ресурс> <локальный каталог> -o user=<workgroup/username>,pass=<password>,noperm,wine,nounix
После этого следует создать новый виртуальный диск-каталог в ~/.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
Монтирование сетевого ресурса при загрузке системы
Для автоматического монтирования ресурса по протоколу 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
Код: Выделить всё
username=guest
password=
Поскольку сначала происходит монтирование ресурсов, указанных в 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, на нее ссылается символическая ссылка /home/raven/.wine/dosdevices/unc/server/base, на которую в свою очередь ссылается ссылка /home/raven/.wine/dosdevices/u: замудренно, ничего не скажешь, зато работает как надо.
Запускаем 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:. Затем запускаем программу с выбранной базой, вводим логин/пароль и вуаля - получаем полностью работоспособную программу.
Хотя... есть один нюанс - иногда выскакивает сообщение "Ошибка блокировки данных. Возможно данные используются другой задачей". Пока не нашел как решить ее на корню, но есть есть способ побороть ее хотя бы временно - линуксовый клиент должен подключаться раньше виндовых.