Wine: Поднимая тост за ваши Windows-приложения в Linux
Автор: Gaurav Taneja
Перевод: Юрий Прушинский
Обработка: Александр Куприн


Несколько лет назад, когда я только начинал работать с Линукс, у меня всегда была установлена Windows на соседнем разделе диска. Так, на случай, если что-нибудь рухнет. Но позднее я осознал, что в Linux есть практически всё, что мне нужно, и нет необходимости тратить деньги на что-либо иное. Тем не менее, иногда у меня возникает необходимость запустить приложение, написанное именно под Windows. Что делать в этой ситуации? Мой ответ - использовать Wine.

Wine не имеет ничего общего со спиртным!

Такие программы как VMware и Win4Lin позволяют вам запускать из-под Linux другие операционные системы (как правило Windows) и таким образом предоставляют возможность запускать Windows-приложения на Линукс-машине. [Win4Lin специально создана для использования исключительно Windows. VMware -- это "отдельная песня". Уникальность этого продукта в том, что он эмулирует работу "железа" компьютера, что позволяет устанавливать в её среде такие ОС как Windows, MSDOS, Linux, FreeBSD и т.п. Исключение могут составлять те операционные системы, которые очень круто обходятся с аппаратным обеспечением. Прим.ред.] Кроме того, можно пойти традиционным путем и установить Windows на соседний раздел. Тем не менее, эти альтернативы скорее нагружают вашу систему, чем решают проблему.

Wine (рекурсивный акроним от "WINE Is Not an Emulator") отличается от всех вышеперечисленных методов, и не требует от вас покупки лицензионной копии Windows. Принцип его работы основан на эмуляции Win32 API, код которого полностью переписан и отличается от кода Microsoft.

Прим.ред.: предыдущий абзац вводит немного в заблуждение. Так всё-таки: Wine -- эмулятор или нет? Посмотрим, что говорится в документации к нему (c3886.html):

Аббревиатура "Wine" -- это рекурсивный акроним "Wine Is Not an Emulator". Кроме этого Wine известен тем, что используется как "эмулятор Windows". В некотором смысле, оба значения верны, только отличаются в зависимости от перспективы. Первое определение говорит о том, что Wine не виртуальная машина. Он не эмулирует работу CPU и вы не устанавливаете Windows или драйвера устройств для неё. Правильней сказать, что Wine -- это реализация API Windows и он может использоваться как библиотека для портирования приложений Windows на Unix. Второе утверждение (о том, что Wine эмулятор), очевидно, опирается на то, что для исполняемых файлов Windows (.exe файлы), Wine действительно выглядит как Windows, подражая его поведению.

Давайте поднимем тост!

Если вы уже решились поэкспериментировать с Wine, то для начала вам нужно взять последние исходники эмулятора с официального сайта проекта http://www.winehq.com. Хотя вовсе не обязательно собирать его вручную из "сырцов". На сайте есть ссылки на уже собранные версии эмулятора в разных форматах (rpm, deb и т.д.).

Если вы решились собрать Wine из исходников, то необходимо выполнить следующее:

gunzip Wine-20020411.tar.gz
tar -xvf Wine-20020411.tar cd wine-20020411
./configure

make depend
make make install
[Но лучше этого не делать и воспользоваться соответствующим пакетом "сырцов". Почему именно пакетом? Во-первых, для тех, кто не в курсе, смотрите статью Дениса Овсиенко об организации и ведении "пакетного хозяйства". Во-вторых, почему пакет "сырцов", а не "бинарников"? Всегда лучше "заточить" программу под конкретную машину. Кроме этого, если вы используете rpm-based дистрибутив, то я советую вам взять пакет Wine на сайте ALT Linux из репозитория пакетов Sisyphus. Пакет с исходниками вы найдёте здесь (ищите файл wine-номер_cvs_версии-номер_сборки.src.rpm). Здесь же вы можете взять и пакет исходников для WineX (см. подкаталог Sisyphus/unsupported и ищите файл WineX-номер_версии-номер_сборки.src.rpm). Прим.ред.]

Если же вы хотите самую-самую свежую версию Wine, то можно взять исходный код с CVS:

export CVSROOT=:pserver:cvs@cvs.winehq.com:/home/wine 
cvnpres login

На запрос пароля, введите 'cvs':

cvs -z 3 checkout wine

После этого в вашей текущей папке появится подкаталог "wine", в который и скопируются все необходимые файлы. После завершения копирования, вы можете скомпилировать wine вышеуказанными командами.

Настройка Wine

Теперь нам нужен конфигурационный файл с именем "config" в каталоге "~/.wine/". Вы можете просто скопировать его пример из каталога с исходниками:

cp documentation/samples/config ~/.wine/config

Конечно, от количества параметров в конфигурационном файле "config" можно слегка приуныть, но это только на первый взгляд. На самом деле достаточно настроить лишь самые основные пути для вашей системы. Например, вам нужно проверить следующие секции:


[Drive A]
"Path" = "/mnt/fd0"
"Type" = "floppy"
"Label" = "Floppy"
"Serial" = "87654321"
"Device" = "/dev/fd0"

[Drive C]
"Path" = "/c"
"Type" = "hd"
"Label" = "MS-DOS"
"Filesystem" = "win95"

[Drive D]
"Path" = "/cdrom"
"Type" = "cdrom"
"Label" = "CD-Rom"
"Filesystem" = "win95"
; убедитесь что устройство указано правильно и имеет корректно
; установленные атрибуты доступа!
"Device" = "/dev/cdrom"

Wine пытается эмулировать DOS-раздел и структуру каталогов, поэтому, например, секция которая начинается с "[Drive C]" обозначает соответствие гипотетическому диску С: с вашим Линукс-каталогом, в данном случае "/c".

Далее, таким же образом в секции "[wine]" настраиваются системные папки "windows" и "system":


"Windows" = "c:\\windows"
"System" = "c:\\windows\\system"
"Temp" = "e:\\"
"Path" = "c:\\windows;c:\\windows\\system;e:\\;e:\\test;f:\\"
"Profile" = "c:\\windows\\Profiles\\Administrator"
"GraphicsDriver" = "x11drv"
; Wine по умолчанию не "понимает" символьные ссылки каталогов для
; Windows-программ.
; Включение этой опции может вызвать сбой в программе, пытающейся
; сделать рекурсивный просмотр всего дерева
; подкаталогов, в случае если символьная ссылка указывает на саму
; себя.
; "ShowDirSymlinks" = "1"
"ShellLinker" = "wineshelllink"
Обратите внимание на ошибку -- переменная "Temp" указывает на диск [E], но диски определены только до [D]. Тоже самое относится к переменной "Path". Прим.ред.

Сейчас мы создадим основную структуру каталогов Windows (папки "windows", "system") которые указаны в файле "config" в секции "[wine]":

cd /c 
mkdir -p windows/system 
mkdir -p windows/Start\ Menu/Programs

Секция "[DllOverrides]" в конфигурационном файле управляет библиотеками DLL, которые в Wine являются аналогами библиотек Windows, а также некоторыми родными Windows библиотеками, которые вам могут быть необходимы:


; Будьте предельно осторожны здесь, неверная
; настройка DllOverrides потенциально может
; повредить настройку вашего эмулятора
[DllOverrides]
"commdlg" = "builtin, native"
"comdlg32" = "builtin, native"
"ver" = "builtin, native"
"version" = "builtin, native"
"shell" = "builtin, native"
"shell32" = "builtin, native"
"shfolder" = "builtin, native"
"shlwapi" = "builtin, native"
"shdocvw" = "builtin, native"
"lzexpand" = "builtin, native"
"lz32" = "builtin, native"
"comctl32" = "builtin, native"
"commctrl" = "builtin, native"
"advapi32" = "builtin, native"
"crtdll" = "builtin, native"
"mpr" = "builtin, native"........
Ну, не всё так страшно. Можно воспользоваться и "родными" для Windows динамическими библиотеками. Например: commdlg, comdlg32, commctrl, comctl32, shell, shell32. Только нужно, чтобы они присутствовали в каталоге, определённом переменной "System" секции [wine]. Общий список, что можно использовать в Wine из библиотек Windows, а что нельзя, вы найдёте в файле документации x1273.html. Прим.ред.

Секция [serialports] отвечает за настройку разных портов и устройств:

Com1=/dev/ttyS0
Com2=/dev/ttyS1
Com3=/dev/modem,38400 
Com4=/dev/modem

Внешний вид окон можно поменять в секции [Tweak.Layout].


;; поддерживаются стили 'Win31'(default), 'Win95', 'Win98'
;; но не путайте это с номерной версией Windows, которую выдает  Wine:
;; для этого используйте опцию командной строки --winver .
"WineLook" = "Win98"
(Не обязательно запускать Wine с ключом --winver, вы можете прописать в ~/.wine/config следующие строки:
[Version]
; Имитация версии Windows  (win95,win98,winme,nt351,nt40,win2k,winxp,win20,win30,win31)
"Windows" = "win98"
; Имитация версии DOS
"DOS" = "6.22"
Прим.ред.)

А про реестр Windows вы не забыли?

Далее нам необходимо установить реестр по умолчанию, который в точности соответствует реестру, который есть на любой Windows-машине. Но перед этим надо не забыть немного подправить файл /etc/ld.so.conf . Для этого мы просто добавляем в него строку /usr/local/lib/wine [Здесь будьте особенно внимательны -- возможно ваша версия Wine собрана с другим ключом --prefix. Например, /usr. Соответственно, и пути поменяются. Прим.ред.], которая указывает на расположение библиотек, необходимых программе для имитации Windows-окружения.

Да, и не забудьте запустить /sbin/ldconfig после этого.

Итак, теперь мы можем использовать regapi, чтобы установить реестр по умолчанию. В каталоге с исходниками Wine выполните следующую команду:

 programs/regapi/regapi setValue < winedefault.reg
Неплохо бы взять "родной" regedit.exe -- тогда у вас появится возможность "резвиться" в файле реестра. Если сделаете это, то заодно раскомментируйте в секции [DllOverrides] строку:
"C:\\windows\\regedit.exe" = "native, builtin"
Если нужно, исправтье путь к regedit.exe. Прим.ред.

От редактора:

А про шрифты вы не забыли?

Всё, что описал Gaurav, конечно, в тему. Но есть ещё один очень важный момент в настройке Wine -- шрифты. Для получения качественных шрифтов в Wine, необходимо в системе настроить и зарегистрировать ttf-шрифты. Идеальным вариантом будет скачать (опять обращаемся к Sisyphus) пакет ttf-шрифтов от Microsoft (ms-ttf-1.0-alt5.src.rpm). Затем правим (если нужно) в ~/.wine/config два раздела, [Fonts] и [FontDirs]. Получается примерно следующее:

    
[fonts]
"Resolution" = "96"
"Default" = "-monotype-arial-*-*-*--*-*-*-*-*-*-utf-8
"DefaultFixed" = "-monotype-courier new-*-*-*--*-*-*-*-*-*-utf-8
"DefaultSerif" = "-monotype-times new roman-*-*-*--*-*-*-*-*-*-utf-8
"DefaultSansSerif" = "-monotype-arial-*-*-*--*-*-*-*-*-*-utf-8

[FontDirs]
"dir1" = "/usr/X11R6/lib/X11/fonts/msttf"

Само собой разумеется, что каталог (или каталоги) меняется в зависимости от того, куда именно вы установили ttf-шрифты.

Кроме этого можно поиграть с антиалиасингом и способом и местом рендеринга шрифтов (на стороне клиента или сервера):

[x11drv]
...
"ClientSideWithRender" = "Y"
"ClientSideWithCore" = "Y"
"ClientSideAntiAliasWithRender" = "Y"
"ClientSideAntiAliasWithCore" = "Y"
...

Если же вам не нужен антиалиасинг в приложениях Windows, то выставите значение двух последних опций в "N".


А теперь давайте всё это подпалим!

В принципе, уже сейчас после произведённой ранее настройки можно попробовать запустить какое-нибудь простое Windows-приложение. Попробуем обычный калькулятор, который идёт в стандартной поставке Windows ("calc.exe").

Вы можете примонтировать раздел с Windows или скопировать calc.exe" с дискеты в вашу систему в каталог "/c/windows" и запустить его одним из нижеуказанных способов:

cd /c/windows; wine calc.exe
wine /c/windows/calc.exe
wine "c:\windows\calc.exe"

Здесь вы можете посмотреть как выглядит это приложение на моей Линукс-машине. Здорово, не правда ли! (факт запуска калькулятора несомненно крут, но к тому, что на заднем плане это уже не относится, особенно после KDE 3.1 ... - прим. перев. )

На этом всё!

Wine может быть очень полезен, когда вам необходимо запустить какой-нибудь файл для Windows в системе Линукс. Единственное замечание - надо учитывать что не все ваши приложения будут работать в Wine, и вам будет необходимо самим разобраться как заставить работать вашу любимую программу. Но, всё равно, во многих случаях Wine бывает очень полезен.


От редактора:

"А вас, Штирлиц, я попрошу остаться!" (c) Броневой

Пути.

Не торопитесь. Несколько слов о том, как мне приходилось "бодаться" с Wine при подготовке этой статьи к публикации. Во-первых, вам следует знать, что при первом запуске Wine генерирует разделы [Drive X] на основании данных /etc/fstab. Если вы планируете использовать в качестве основы для работы Wine каталоги и файлы Windows, то можете оставить всё как есть. Если же нет, то придётся подправить секции [Drive X]. Я настроил Wine таким образом, что ему доступны два диска, [C] и [D] (жёсткий диск, CD-привод) и привод флоппи-дисков [A]:

    
[Drive A]
"Path" = "/mnt/floppy"
"Type" = "floppy"
"Label" = "Floppy"
"Filesystem" = "win95"
"Serial" = "87654321"
"Device" = "/dev/fd0"

[Drive C]
"Path" = "/var/lib/wine"
"Type" = "hd"
"Label" = "MS-DOS"
"Filesystem" = "win95"

[Drive D]
"Path" = "/mnt/cdrom"
"Type" = "cdrom"
"Label" = "CDROM"
"Filesystem" = "win95"
"Device" = "/dev/cdrom"

При этом для диска [C] использовался "скелет" каталогов, сформированный Wine при инсталляции, /var/lib/wine. Решать, конечно, вам какую именно конфигурацию избрать. Можете оставить путь к подмонтированым vfat-разделам (надеюсь, понятно, что под vfat-разделами я понимаю разделы с файловыми системами FAT12, FAT16 и/или FAt32). Но, что там может натворить Wine? Лично я не знаю, поэтому работал с /var/lib/wine. К тому же этот вариант универсален, т.к. позволяет использовать Wine на машине, где нет vfat-разделов. И есть ещё одна неприятная особенность, которую я не смог побороть -- не-LATIN имена файлов сохраняются в кодировке cp1251. А в vfat-разделах они хранятся в кодировке cp866.

Обратите внимание на значение переменной "Temp" в разделе [wine] (выше, в примечаниях, я уже об этом говорил):

    
[wine]
...
"Temp" = "C:\\Temp"
...

По умолчанию переменная "Temp" указывает на отдельный диск, который формируется в "/tmp/winetmp-${USER}". Я её исправил на C:\\Temp, предварительно создав подкаталог Temp на диске [C] (в моём случае это /var/lib/wine/Temp)

Проверьте значение переменной "Path" в этом же разделе. Возможно, понадобится добавить новые пути.

Звук.

Чтобы Wine "зазвучал", вы должны раскомментировать одну из строк в секции [WinMM]:

    
[WinMM]
...
;"Drivers" = "wineoss.drv"      ; default for most common configurations
"Drivers" = "winearts.drv"    ; for KDE
;"Drivers" = "winealsa.drv"    ; for ALSA users
;"Drivers" = "winejack.drv"    ; for Jack sound server
;"Drivers" = "winenas.drv"     ; for NAS sound system
;"Drivers" = "wineaudioio.drv" ; for Solaris machines
;"Drivers" = ""                ; to disable sound
...

У меня запущен KDE, поэтому для переменной "Drivers" я указал значение "winearts.drv". Для большинства конфигураций подойдёт "wineoss.drv".

Чтобы убедиться в том, что в Wine появился звук, я установил Winamp версии 2.0 Заголовок главного окна оказался битым (но только главного -- окно плэйлиста и эквалайзера отображалось корректно), а само окно "мазалось" при перемещении других окон поверх него. Но звук был и что самое удивительное во всём этом -- в системном лотке KDE появился значок агента Winamp! И на рабочем столе столе тоже (см. скриншот)

Скриншоты.

И в заключении несколько скриншотов:

Заключение.

Судя по всему, программы небольшого размера будут себя неплохо чувствовать в среде Wine. Исключение составляют те программы, которые немного экзальтировано используют Windows API (недокументированные возможности и прочее). К сожалению, программы-гиганты типа MS Office и ему подобные, активно засоряющие реестр и таскающие за собой ворох динамических библиотек, очень трудно заставить работать.

Если вам интересно, то здесь вы найдёте конфигурационный файл, который использовал я.


Gaurav Taneja

Я работаю техническим консультантом по Linux/Java/XML/C++ в Нью Дели, Индия. Принимаю активное участие в open-source проектах, в том числе и некоторых на узле SourceForge. В свободное время люблю длительные поездки, играть в теннис, смотреть кино и вечеринки. А еще я являюсь владельцем собственной софтверной консультационной компании BroadStrike Technologies.

Copyright (c) 2002, Gaurav Taneja.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 80 of Linux Gazette, July 2002


Вернуться на главную страницу