10

Строим матрешку из Wine и ваших приложений

Давненько я ничего не писал, но тут на меня снизошло желание сделать пост. Ну ладно.
Думаю, среди тех, кто недавно перешел на Linux, часто возникает потребность использовать Wine. Я и сам, каюсь, иногда его использую. Сейчас я расскажу, как держать на компьютере его разные версии и разные префиксы просто в одной папке, да еще так, что это все будет очень красиво (наверное) логически организовано.

Необходимое предисловие - возможно, вам следует почитать про каскадно-объединенное монтирование. Его принцип - использование различных файловых систем как слоев в матрешке.

Каждый следующий слой представляет разницу с предыдущим. Таким образом реализуется принцип CopyOnWrite, иными словами, нижний слой может быть ReadOnly, а во второй мы будем записывать разницу. Зачем это нужно - будет понятно по тексту.


Саму установку Wine можно разделить на 3 части - бинарники, префикс (аналог диска C:) и, собственно, ваши приложения. Вот мы и разделим.


Основной принцип таков - разделить все на сжатые squashfs файлы (их будет два, один с Wine, а второй с пустым префиксом) и папку, в которой будут ваши настройки и приложения. Посмотрите, что выйдет. Главный принцип - все манипуляции, кроме установки нужных пакетов, будут от юзера.


Сначала надо скачать нужные бинари Wine. Советую для простоты взять отседова:

https://www.playonlinux.com/wine/binaries/phoenicis/


Распаковывам архив, получаем папку с Wine, в ней должны содержаться стандартные для приложения папки - bin, lib, share, и т.д.

Теперь создадим пустой префикс. Сделаем скрипт (назовем его wine5, он нам еще пригодится):


#!/bin/bash


root=`pwd`

cd ./папка_с_вайном/bin

env WINEPREFIX=$root/test_prefix LD_LIBRARY_PATH=$root/папка_с_вайном ./wine "$*"

Запустим этот скрипт папке с папкой Wine и получим пустой префикс в папке test_prefix:

./wine5 winecfg

Теперь запакуем Wine и пустой префикс в squashfs файлы:

mksquashfs ./папка_с_вайном wine_compressed.sqsh -comp lzo

mksquashfs ./test_frefix clear_prefix.sqsh -comp lzo

Почему lzo? Потому-что жмет почти как zip, а на распаковке дает до 1.5 ГБ/с. Такое сжатие может даже ускорить работу на HDD. Приятный бонус - размер бинарей вайна и префикса сократится в 2-3 раза.

В итоге получим все два файла, которые, в сущности, и есть весь Wine. Теперь надо написать скрипт(можете начинать), который их монтирует и размонтирует.

Для начала надо поставить такие вещи, как squashfuse и unionfs-fuse. Это зависит от вашего пакетного менеджера. Допустим, пакеты вы поставили.


Сначала смонтируем squashfs:

squashfuse wine_compressed.sqsh ./wine_mountpoint


squashfuse clear_prefix.sqsh ./prefix_mount_ro

Потом создадим директории prefix_rw(сюда будут записываться ваши приложения) и prefix_merged(полная версия) и соберем матрешку префикса:


unionfs-fuse -o cow ./prefix_rw=RW:./prefix_mount_ro=RO ./merged

Теперь поправим в вашем скрипте пути, пропишем в WINEPREFIX путь к merged, а папку с вайном заменим на wine_mountpoint.


Все можно пользоваться! Размонтировать это дело можно с помощью fusermount -u (добавьте в свой скрипт или сделайте отдельный, по вкусу), опять же, полностью от юзера.

Кроме того, обратите внимание на пути.


Что это дает?

1. А то, что монтировать unionfs можно сколько угодно раз, единожды примонтировав wine и пустой префикс. Таким образом, можно создавать префиксы - для простоты - пустые установки Windows, которые почти ничего не весят, как контейнеры. Кроме того, слоев в матрешке может быть сколько угодно. Можно упаковать и приложения. Можно даже запаковать целую игру, в rw будут писаться только сохранения и настройки. Так что применение зависит только от вашей фантазии и целей.


2. Значительное сокращение размера.


3. Все это внутри одной папки и не требует софта кроме тонких оберток типа squashfuse и unionfs-fuse, которые во многих дистрибутивах есть по дефолту.


Послесловие или FAQ.

Вопрос: Это все известно и используется в контейнерах и LiveCD, зачем ты это пишешь?

Ответ: Потому-что могу и хочу.


Вопрос: Почему не использовать более современную aufs?

Ответ: Она не умеет в FUSE.


Вопрос: Ничего не понял, нафига мне это красноглазие? Я сижу на Windows и прекрасно себя чувствую.

Ответ: Вот и сидите дальше, что вы здесь забыли?


Может быть, что-то упустил.

GNU/Linux

1.2K поста15.6K подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

DELETED
Автор поста оценил этот комментарий

Если тебе нужен wine, то линукс тебе точно не нужен!

раскрыть ветку (1)
5
Автор поста оценил этот комментарий
Иллюстрация к комментарию
0
Автор поста оценил этот комментарий

Аа, даже так, ну ладно тогда, не буду морочать сильно, как возьмусь то отпишусь, если уж ты не против =) Просто я сам активно пользовался еще когда ты пост про это дело делал. А сейчас немножко железо обновил, поставил nvme, купил второй моник, думаю ну все, сейчас во все игори играть буду и как тормознул :D

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну, бывает. Я как-то перестал виндой пользоваться, мне и вайн то нужен только чтобы мс офис гонять.


Раз, правда, месяца 2 назад, кидал звуковуху pci-e, так она замечательно кидается штатными средствами virt-manager. Кажись, он тоже теперь через vfio кидает, т.е. как положено. На тяжелых нагрузках, правда, не гонял, но скорее всего винда по-прежнему не может в MSI по-дефолту.

показать ответы
0
Автор поста оценил этот комментарий

Привет, с тобой можно как-то связаться? Я qemu с пробросом делаю, видяху подхватывает, но при этом перестает видеть виртуальный жесткий, как-то может ты помог, с конфигом, был бы очень благодарен. А то неделю уже не могу настроись, чтобы в скрипт пихнуть и забыть.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можешь хоть сюда писать.

Можешь в riot.im:
@xwolfram91:matrix.org

Только я давненько этим делом не занимался, да и видюху вторую продал, так что затестить на своем конфиге не смогу. Разве что подказать могу чего...

показать ответы
0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну, для игр я рекомендую все-таки использовать предназначенные для них решения.

Ну а во-вторых, я это делал не для того, чтобы потом *.desktop лончер городить. Это как щуп для замера свечного зазора на цепь к капоту приварить - крайне уродливое решение.

0
Автор поста оценил этот комментарий

Проблема не в этом, проблема в другом. Представим себе что мы находимся в директории /home/user и запускаем некий скрипт командой /home/user/games/krutaya_igra/start.sh

Куда будет показывать показывать команда root = `pwd`? Правильно, на /home/user.

А где у нас лежит рабочая директория с игрой, вайном и прочими потрохами? Правильно, в /home/user/games/krutaya_igra.

Чтобы скрипт отработал без ошибок и без мучительного отлаживания надо написать

root=$(dirname "`readlink -f "$0"`")

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Представим себе что мы находимся в директории /home/user и запускаем некий скрипт командой /home/user/games/krutaya_igra/start.sh

Допустим, представить себе можно все, что угодно. И по мере развития фантазии проблемы будут все новые и новые.

показать ответы
5
DELETED
Автор поста оценил этот комментарий
root = `pwd`

эммм..... я уже несколько лет на баше не скриптил, но.... разве....

= оператор присваивания (пробельные символы до и после оператора -- недопустимы)

https://www.opennet.ru/docs/RUS/bash_scripting_guide/x1673.h...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, это косяк, исправил.

показать ответы