2015-03-03

Симлинки: Возвращение. Синхронизация сейвов игр между компами

В своем старом посте, посвященном вопросу переноса музыки на андроидных девайсах, я уже упоминал симлинки. Теперь появился повод рассказать как с их помощью я синхронизирую сейвы игр (на самом деле не только их) между несколькими компами, причем между компами с разными операционками. Рассказывать и показывать буду на примере Baldur's Gate Enhanced Edition (далее BG:EE) - эта игра хоть и стимовская, но не подерживает Steam Cloud, так что пример вышел более чем жизненный.


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

Допустим, у нас есть папка "C:\WINDOWS\". 
1. Мы делаем ярлык на эту папку и кидаем на рабочий стол. Кликаем на ярлык, какая папка откроется? Логично что "C:\WINDOWS\".
2. Теперь мы делаем симлинк на папку "C:\WINDOWS\" и располагаем его на рабочем столе. Кликаем на симлинк и оказываемся вовсе не в "C:\WINDOWS\", а очень даже в "C:\Пользователи\Василий Пупкин\Рабочий стол\WINDOWS\". Причем эта "папка" полностью повторяет папку "C:\WINDOWS\" и, по сути, ей и является. Если мы поменяем что-то в папке "WINDOWS" на рабочем столе, мы по факту сделаем это в  "C:\WINDOWS\". 

Теперь зачем это все нужно. Для того чтобы синхронизировать сейвы между компами я использую Dropbox (подойдет любой подобный сервис). Когда речь идет о простой синхронизации абстрактных файлов, то все просто: положил файлы в папку дропбокса - получил эти файлы на всех компах. В случае с игровыми сейвами этот вариант не прокатит - игра ищет свои сейвы не в дропбоксе, а там, где по ее мнению эти файлы должны находиться. Можно конечно, поиграв, копировать папку с сейвами в дропбокс, а на другом компе брать их из дропбокса и класть куда нужно игре. Гемор? Гемор. Значительно проще скопировать сейвы в дропбокс один раз, а на их прежнее "правильное" место вернуть симлинк. Игра будет работать с симлинком так, словно это и есть папка, при этом все изменения будут происходить уже в настоящей папке, находящейся в дропбоксе.

В моем случае изюминкой ситуации является то, что на двух компах, между которыми я настраивал синхронизацию, стоят разные операционки (BG:EE поддерживает и винду и линух). На самом деле не столь принципиально, настраивается синхронизация между двумя виндами, или линуксами, или как в моем случае - имеет место сборная солянка.
Общий принцип такой:
  1. Актуальный сейв переносится в дропбокс, 
  2. На всех компах из дропбокса делаются симлинки в те места, где должна лежать папка.
Имея актуальные сейвы на линуксе, я начал с него.

  1. В линуксе сейвы BG:EE лежат в папке:
    /home/qiwichupa/.local/share/Baldur's Gate - Enhanced Edition/
  2. Эту папку я копирую в /home/qiwichupa/Dropbox/link_sync/
  3. Теперь у меня есть папка:
    /home/qiwichupa/Dropbox/link_sync/Baldur's Gate - Enhanced Edition/
  4. После этого, в теперь пустой на сейвы папке /home/qiwichupa/.local/share/, я делаю симлинк на папку /home/qiwichupa/Dropbox/link_sync/Baldur's Gate - Enhanced Edition/
  5. Теперь у меня есть:
    1. Папка
      /home/qiwichupa/Dropbox/link_sync/Baldur's Gate - Enhanced Edition/
      она будет синхронизироваться дропбоксом
    2. Симлинк
      /home/qiwichupa/.local/share/Baldur's Gate - Enhanced Edition/
      выглядит как изначальная папка с сейвами, но работая с ним, игра будет менять файлы в настоящей папке в дропбоксе.

Если вышеописанная многоходовка показалась страшной - это не так. Вот видео в котором все шаги наглядно показаны за несколько секунд:




Вторая часть марлезонского балета - комп с виндой. К сожалению в ней работа с симлинками во-первых функционально ограничена, а во-вторых, требует установки сторонней утилиты (как минимум для удобного создания симлинка).

Ограничения чисто функциональные - симлинки в винде могут быть сделаны только на папку (в данном случае это не помеха, но вообще неприятно) и могут быть только внутри того диска, на котором располагается исходная папка. Последний момент оказался для меня печальным - папка дропбокса у меня была на диске D, а папка с документами, в которой в винде и располагаются сейвы BG:EE - на диске C в профиле. Пришлось переместить папку документов на D, иначе симлинк не сделать.

Теперь о софте. Чтобы не мучать консоль и сделать все удобно в пару кликов, я использую программу "Link Shell Extension", расширяющую меню проводника. После установки, правой кнопкой мышки клацаю на папку "Baldur's Gate - Enhanced Edition", находящуюся в папке дропбокса (у меня она приехала с линукса, в случае если синхронизация настраивается между виндами - предварительно копируем исходную папку в дропбокс) и выбираю опцию "Pick Link Source". Теперь клацаю ПКМ в папке документов и выбираю "Drop AS... > Symbolic Link". Вуаля! 

Теперь на всех компах у меня в папке дропбокса лежит сама папка с сейвами - ее нужно беречь и охранять. А в тех местах, где сама игра ищет сейвы - лежат симлинки. Их можно в любой момент удалить - это не приведет к удалению исходной папки (ВАЖНО: удаление самого симлинка не удаляет исходную папку, но удаление файлов внутри симлинка удалит их в исходной папке!) и симлинк можно в любой момент пересоздать.

ЗЫ: Поступило справедливое замечание относительно риска возникновения конфликта версий в случае временного отсутствия интернета на одном из компов. Безусловно этот момент стоит иметь в виду во избежание потери актуальной версии данных (настроек, сейвов etc.)

Комментариев нет:

Отправить комментарий