Рано чи пізно може знадобитися запустити програми Windows на Linux. Для операційної системи Linux написана величезна кількість програм, для вирішення однієї певної задачі, може бути навіть кілька десятків програм. Але така тенденція спостерігається тільки для широко поширених завдань, що ж стосується спеціалізованих програм та ігор, то тут ситуація зовсім інша. Програм, для вирішення вузькоспеціалізованих завдань, наприклад, в тій же сфері СЕО для Linux просто немає, а гри почали з'являтися тільки останні кілька років.
Були і раніше простенькі ігри з відкритим вихідним кодом, але популярні ігри, класу ААА почали з'являтися тільки тоді, коли цією платформою зацікавилася Valve. Але до сих пір ситуація з іграми йде не так, як хотілося б. Тому і виникає необхідність установки Windows програм в Linux.
Зміст статті:
трохи теорії
Windows програми не можуть запускатися просто подвійним клацанням по виконуваного файлу. Формат виконуваних файлів Linux дуже сильно відрізняється від Windows. Тому для їх запуску необхідно використовувати спеціальне програмне забезпечення - wine. Назва Wine утворено за допомогою, чомусь популярного в світі вільного програмного забезпечення способу - рекурсивний акронім, і розшифровується як Wine is not emultor. І це правда, wine не є емулятором.
Це програмна оболонка, яка перетворює системні виклики Windows програм в виклики функцій операційної системи Linux. Таким чином, wine вдає із себе прошарок між Windows програмою і операційною системою Linux разом з її ядром і бібліотеками.
Щоб зрозуміти як працює Wine, потрібно спочатку сказати кілька слів про ядрі Windows. У Windows, так само як і у Linux є ядро. Як ви знаєте ядро Linux складається з одного файлу і знаходиться в папці boot. Ядро Windows зовсім інше, по суті це набір dll бібліотек, які розташовані в папці C: \ windows \ system32. Тому нам, щоб змусити Windows програми працювати в Linux досить реалізувати dll бібліотеки, які потрібні програмі, так щоб вони викликали необхідні нам функції з системи linux, що власне і робить Wine. Але проект розвивається дуже повільно і розробники не встигають реалізувати всі функції з системних бібліотек Windows, тому працюють далеко не всі програми, особливо нові.
Популярні програми в Wine запускаються легко, і без додаткових налаштувань. Але справа в тому, що для вирішення популярних і затребуваних завдань в Linux є досить альтернатив, а запускати нам доведеться спеціалізовані програми та ігри, що вимагають серйозних компонентів, ще не написаних в Wine. Ось тут і спливає недоработанность цієї програми. Але є вихід, його ми і розглянемо далі.
Основи використання Wine
Всі файли програм wine, встановлені програми, бібліотеки, файли реєстру, конфігураційні файли знаходяться в домашньому каталозі, а точніше, в ~ / .wine.
Оскільки для різних програм, знадобиться різна архітектура бібліотек і потрібно буде підміняти на оригінальні бібліотеки від windows різні файли була придумана така можливість, як префікси.
Папка ~ / .wine це префікс, але ми можемо створювати для кожної нової програми свій префікс і вона буде працювати тільки з ним. Щоб задати префікс, з яким потрібно працювати wine використовується змінна оточення WINEPREFIX, наприклад:
export WINEPREFIX = ~ / program
Для різних програм може знадобитися різна архітектура системи, wine може запускати і 64 бітні програми, але багатьом для правильної роботи потрібна архітектура х86.
Щоб задати архітектуру використовуйте змінну WINEARCH. Наприклад, для х86:
export WINEARCH = win32
Також не створюйте папку для нового префікса за допомогою mkdir або файлового менеджера, нехай програма сама створить цю папку при своєму першому запуску.
Установка Windows програм в Wine
Якщо вам потрібно запустити програму, повністю підтримувану Wine, наприклад, провідник або notepad, досить виконати:
wine адреса / файлу / программи.exe
Але як я вже говорив, нам доведеться запускати мало таких програм, більшість з них вимагатимуть функціоналу, який ще не реалізовано в wine. Тоді нам доведеться замінити бібліотеки Wine, на оригінальні бібліотеки Windows. Звичайно, є оболонки для Wine, які автоматизують цей процес, наприклад, Crossover, PlayOnLinux, WineWizard і тд. Але ми розглянемо ручної варіант.
Для установки компонентів Windows в wine існує спеціальний інструмент - winetricks. Встановлювати його краще з сайту програми, так версія буде новіше:
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
$ Chmod + x winetricks
Щоб встановити потрібний компонент досить передати ім'я цього компонента:
winetricks vcrun2008
З установкою компонентів більш-менш зрозуміло, але як дізнатися які компоненти потрібні? Швидше за все, вашу програму вже намагалися встановлювати і інші користувачі знайшли рішення проблеми. Тому скористайтеся пошуком Google для того, щоб знайти способи установки програми. Також дуже корисним буде сайт appdb.winehq.org. На ньому зібрана база даних всіх підтримуваних в Wine додатків, там є інструкції по установці, описуються можливі проблеми і дається загальна оцінка роботи програми, правда все англійською.
Давайте розглянемо приклад. Наберіть в пошуку по appdb Advego Plagiatus, нагадаю, що це програма для перевірки унікальності текстів, часто використовувана копирайтерами:
Вона відразу ж була знайдена в базі даних:
На сторінці програми, ми бачимо крім скніншота і оцінки роботи, жовтий означає золото, дуже добре, і інструкції з її встановлення, в нашому випадку потрібен набір бібліотек riched30, який можна встановити командою:
winetriks riched30
Після установки цього пакета програма запуститися і буде працювати.
Але залишається питання, що ж робити, якщо інструкцій немає, інформації мінімум, а потрібно щоб програма працювала. Ми можемо аналізувати висновок Wine при запуску програми. Причому нас будуть цікавити не всі повідомлення з логу програми, а тільки останні, саме те що викликало помилку.
Розглянемо на прикладі тієї ж Advego Plagiatus. Спочатку створимо новий префікс, щоб не зіпсувати те що вже було встановлено:
export WINEPREFIX = ~ / advego
Архітектуру нам міняти не потрібно, але якщо хочете, можете явно вказати, що потрібно використовувати win64:
export WINEARCH = ~ / win64
Далі запускаємо програму і останнє що ми побачимо в балці перед дампом змінних ядра це:
fixme: richedit: ITextRange_fnEndOf (0xa04410) -> (6 0 (nil)): stub
fixme: richedit: ITextRange_fnEndOf (0xa04410) -> (6 0 (nil)): stub
fixme: richedit: ITextRange_fnEndOf (0xa04410) -> (6 0 (nil)): stub
Залишилося зрозуміти, що таке richedit, і Microsoft TechNet нам люб'язно повідомляє що це їх API і складається воно з Riched32.dll, це остання версія, але раніше це була riched20.dll, вже розумієте які бібліотеки потрібні?
Ми знаємо як їх встановити за допомогою winetricks, але це робити необов'язково, можна і вручну. Скачайте бібліотеки, знайти їх не складе труднощів за допомогою Google. Тільки шукайте версію для Windows XP.
Копіюємо бібліотеку в наш префікс, в папку syswow64:
cp ~ / Завантаження / riched32.dll ~ / advego / drive_c / windows / syswow64 /
cp ~ / Завантаження / riched20.dll ~ / advego / drive_c / windows / syswow64 /
Для 32 бітних бібліотек використовується папка system32, а оскільки ми вказали архітектуру 64 біт потрібно і бібліотеки використовувати відповідні. Потім запустіть winecfg і на вкладці бібліотеки, в поле нове заміщення для бібліотеки наберіть * riched32, потім додати і * riched20 і знову додати:
Все, тепер можете пробувати запускати програму:
wine ~ / advego / drive_c / Program \ Files \ \ (x86 \) / Advego \ Plagiatus / plagiatus.exe
Тепер програма працює і більше не падає з помилкою. Таким чином, ви можете замінити багато бібліотек Wine. Можна запустити практично будь-яку програму, написану кілька років тому і яка потребує понад нових технологій. Досить тільки замінити потрібні бібліотеки. Ви можете не тільки використовувати winetricks або копіювати бібліотеки з інтернету, але і брати їх прямо з Windows. Точно не варто замінювати gdi32.dll, kernel32.dll, і user32.dll - ці бібліотеки реалізують функції ядра Windows на найнижчому рівні, і якщо їх замінити, це тільки порушить роботу Wine. Напевно, є й інші бібліотеки, які не можна замінювати, але це обчислюється тільки шляхом експериментів. Експериментуйте і нехай ваші програми працюють без помилок!