RE:NODE

Руководства11 мин чтения

Бэкапы сервера Valheim и повреждённый мир

Где сервер Valheim хранит мир и backup, что делают флаги резервного копирования, как восстановить старое сохранение и вернуть повреждённый или сброшенный мир.

0 прочтений

Мир Valheim - это два файла, Name.db и Name.fwl, и сервер хранит три вида их копий: пару .old, которая записывается при каждом сохранении, автоматические резервные копии, которыми управляют -backups, -backupshort и -backuplong, и настоящие backup, которые вы уносите с машины. Восстановление из любой из них - одна и та же операция: остановите сервер, положите нужную пару .db и .fwl в worlds_local под именем мира и запустите его снова. Повреждение почти всегда возникает из-за того, что процесс умер или диск заполнился во время сохранения, и лечится почти всегда последней исправной парой. В этой статье - где что лежит, что делает каждый флаг, как восстанавливать и как вернуть мир, который загружается неправильно или не загружается вовсе.

Остальная настройка сервера описана в руководстве по выделенному серверу Valheim. Если вы впервые переносите мир на сервер, а не спасаете его, лучше начать со статьи как загрузить сохранение Valheim.

Что такое мир Valheim на диске#

Всё, что относится к миру, хранится в двух файлах с одинаковым базовым именем:

ФайлРазмерЧто в нём
Name.fwlНесколько сотен байтИмя мира, сид, версия генератора, ключи мира
Name.dbОт нескольких МБ до сотенКаждый элемент постройки, предмет, существо, изменение рельефа
Name.db.oldКак у .dbПредыдущее сохранение, остаётся при записи нового
Name.fwl.oldКак у .fwlПредыдущие метаданные
Name_backup_auto-*.db / .fwlКак у .dbАвтоматические резервные копии по таймеру

Файл .fwl маленький, но обязательный. В нём хранится сид, а сид генерирует рельеф, на который накладываются изменения из .db. Файл .db одного мира в паре с .fwl другого загрузится, но постройки окажутся не на том ландшафте. Всегда перемещайте, копируйте и восстанавливайте оба файла парой, снятой в один и тот же момент.

На сервере Linux место по умолчанию - папка данных Unity пользователя:

code
~/.config/unity3d/IronGate/Valheim/worlds_local/

На сервере Windows это %USERPROFILE%\AppData\LocalLow\IronGate\Valheim\worlds_local\. Если сервер запускается с -savedir /some/path, миры попадают в /some/path/worlds_local/, а списки админов, банов и разрешённых игроков - в /some/path. Хостинги обычно задают -savedir, чтобы мир лежал внутри папки сервера, куда достаёт файловый менеджер.

Чего на сервере нет, так это персонажей. Персонаж каждого игрока, его инвентарь и навыки хранятся на его собственной машине в characters_local. Восстановление мира персонажей не трогает, поэтому после отката у игроков могут остаться предметы, которых в мире уже нет, - и поэтому повреждённый персонаж - это проблема клиента, которую сервер исправить не может.

Как сервер сохраняет мир#

Мир живёт в памяти и записывается на диск каждые -saveinterval секунд, по умолчанию 1800. Корректное выключение тоже его записывает. Каждое сохранение по очереди делает три вещи:

  1. Записывает новые данные мира.
  2. Оставляет предыдущие .db и .fwl как .old.
  3. Пишет в лог строку с длительностью сохранения.
code
World saved ( 912.48ms )

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

Всё, что завершает процесс без этой строки - kill, остановка из-за нехватки памяти, падение хоста, - теряет всё, что было после предыдущей. А всё, что завершает процесс во время этой строки, пока файл записан наполовину, - именно так миры и повреждаются.

Встроенные флаги резервного копирования#

У Valheim есть собственная система резервного копирования, которая настраивается тремя аргументами запуска:

АргументПо умолчаниюЧто делает
-backups4Сколько автоматических копий хранить
-backupshort7200Секунд до первой копии после запуска
-backuplong43200Секунд между копиями после этого
-saveinterval1800Секунд между сохранениями мира

С настройками по умолчанию первая копия создаётся через два часа после запуска сервера, затем каждые двенадцать часов, и хранятся четыре самые свежие. Это полные копии .db и .fwl с _backup_auto- и отметкой времени в имени, и лежат они в той же папке worlds_local, что и мир.

Более плотная схема для активной группы:

bash
-saveinterval 900 -backups 6 -backupshort 3600 -backuplong 21600

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

Встроенные копии полезны, и выключать их не нужно. Но это не резервные копии в том смысле, который важен. Они лежат на том же диске и в той же папке, что и файл, который защищают. Они спасают от неудачного сохранения, но не от удалённого сервера, отказа диска, ошибочного удаления в файловом менеджере или человека с доступом к файлам, который удалил папку. К тому же они ротируются, так что проблема, которую никто не замечал два дня, к моменту, когда кто-то посмотрит, уже есть во всех копиях.

Увеличение -backups стоит места на диске - каждая копия это полная копия .db, - так что для мира в 150 МБ двадцать копий занимают три гигабайта. Храните столько, сколько нужно, чтобы покрыть время, за которое ваша группа замечает проблему, и не больше.

Настоящие backup: вне машины и по расписанию#

Настоящий backup - это копия мира там, куда сервер не может писать, снятая по расписанию и время от времени восстанавливаемая, чтобы убедиться, что она работает. Подробно этот довод изложен в статье Резервные копии, которые действительно восстанавливаются; коротко - backup, который никто ни разу не восстанавливал, остаётся гипотезой.

Неудобство Valheim - согласованность. У ванильного сервера нет консоли, в которую можно отправить команду save снаружи игры, - save это внутриигровая команда администратора. Поэтому копия, снятая на работающем сервере, фиксирует файлы на момент последнего сохранения, и это нормально, если только в этот момент не идёт сохранение. Чистая схема - остановить сервер, снять копию и запустить его снова:

  1. Остановите сервер. Корректная остановка записывает мир.
  2. Дождитесь завершения процесса.
  3. Скопируйте worlds_local - или хотя бы текущие .db и .fwl - в другое место.
  4. Запустите сервер.

В RE:NODE это делает за вас вкладка Schedules: расписание на cron-выражении с упорядоченными задачами и задержками - действие питания stop, backup через минуту, затем start. Слоты резервных копий входят в каждый тариф Valheim, хранятся вне машины, которую защищают, их можно скачать и заблокировать, чтобы заведомо исправная копия не ушла в ротацию. Восстановление - одна кнопка. Одно предостережение: удаление сервера удаляет и его резервные копии, включая заблокированные, поэтому скачайте всё, что хотите сохранить, прежде чем отменять услугу.

Расписание: ночной backup в 05:00
cron:   0 5 * * *task 1: power action - stoptask 2: backup (delay 60 seconds)task 3: power action - start (delay 30 seconds)

Если вы и так планируете перезапуски, ставьте backup сразу после остановки - и получите и то и другое в одном тихом окне. Синтаксис разобран в статьях Запланированные задачи, которые стоит завести и cron-выражения простыми словами.

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

Восстановление старого сохранения#

Из какой бы копии вы ни восстанавливали, порядок одинаковый.

  1. Остановите сервер и дождитесь, пока он полностью завершится.
  2. Отложите текущие файлы в сторону, а не удаляйте их. Переименуйте Midgard.db и Midgard.fwl, например, в Midgard.db.broken и Midgard.fwl.broken. Если после восстановления станет хуже, можно будет вернуться.
  3. Положите выбранную пару на место под точным именем мира: Midgard.db и Midgard.fwl. Для автоматической копии это значит скопировать Midgard_backup_auto-...db и соответствующий .fwl и переименовать их. Для предыдущего сохранения переименуйте Midgard.db.old в Midgard.db и Midgard.fwl.old в Midgard.fwl.
  4. Проверьте имя мира в аргументах запуска - оно должно совпадать, включая регистр букв.
  5. Запустите сервер и следите в логе, чтобы мир загрузился по имени, а не сгенерировался новый.
  6. Зайдите и проверьте какую-нибудь недавнюю постройку, которую вы помните, чтобы убедиться, что вернулись в нужный момент.

Какую копию брать, зависит от того, что пошло не так:

ПроблемаОткуда восстанавливать
Последнее сохранение повреждено, всё до него было в порядке.db.old / .fwl.old
Ошибка несколько часов назад (гриферство, неудачная смена модификатора)Самая свежая автоматическая копия до неё
Пропала вся папка или сервер пересобралиBackup вне машины
Обновление мода сломало мир несколько дней назадBackup вне машины, сделанный до обновления

Восстановление из панели заменяет файлы сервера файлами из копии за один шаг, это покрывает шаги 2-3. Оно восстанавливает всё, что есть в копии, а не только мир, поэтому если вы с тех пор меняли конфиги модов, они тоже откатятся.

Как распознать повреждённый мир#

Повреждение проявляется несколькими узнаваемыми способами.

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

Сервер не запускается, при загрузке мира падает исключение. Файл .db повреждён - как правило, обрезан, потому что процесс умер или диск заполнился посреди сохранения. Файл .db может оказаться намного меньше, чем должен быть, или иметь нулевой размер.

Мир загружается, но что-то не так. Рельеф не совпадает с постройками (.db в паре не с тем .fwl) или большой участок откатился (сервер часами работал без удачного сохранения, а потом перезапустился). В строгом смысле это не повреждение, но лечится так же: восстановите заведомо исправную пару.

Мир загружается, но игроки жалуются на пропавшие предметы. Проверьте, в мире дело или в персонажах. Сундуки и постройки находятся в мире, инвентарь - на машине каждого игрока. Если у игрока сбросился инвентарь, у него проблема с персонажем на стороне клиента.

Самая быстрая проверка подозрительного файла - его размер. Выведите содержимое worlds_local с размерами и сравните .db с .db.old и последней автоматической копией. Текущий .db, который намного меньше соседей, и есть повреждённый.

bash
$ ls -lh ~/.config/unity3d/IronGate/Valheim/worlds_local/

Что вызывает повреждение и как его предотвратить#

Почти каждый повреждённый мир Valheim восходит к прерванному сохранению.

  • Принудительное завершение процесса. Если убить сервер - кнопкой Kill в панели вместо Stop или через kill -9 - посреди сохранения, останется наполовину записанный файл. Используйте Stop и ждите.
  • Нехватка памяти. Контейнер, остановленный на лимите памяти, умирает там, где его застало, в том числе посреди сохранения. Сохранению ненадолго нужна дополнительная память, поэтому сервер, работающий у самого лимита, скорее всего остановится именно в этот момент. В RE:NODE сервер на лимите останавливается и чисто перезапускается, а не уходит в swap, - это правильное поведение для машины, но всё равно остановка без сохранения; следите за графиком памяти и переходите на тариф выше заранее, а если это уже происходит, прочитайте почему игровой сервер постоянно перезапускается.
  • Заполненный диск. Сохранение, которое не может дописаться, оставляет обрезанный файл. Ротируемые копии и старые логи заполняют диск медленно; проверяйте свободное место, когда увеличиваете -backups.
  • Моды, которые пишут в мир. Моды, добавляющие свои данные, могут оставить мир, который загружается только с этим модом. Удаление такого мода может привести к исчезновению объектов или к тому, что мир не загрузится. Делайте backup перед изменением списка модов - безопасный способ описан в статье Моды Valheim с BepInEx.
  • Редактирование файлов мира сторонними инструментами. Редакторы миров полезны, но файл, отредактированный и сохранённый устаревшим инструментом, текущая версия игры может не прочитать. Редактируйте копию.

Уменьшение -saveinterval не предотвращает повреждение, но сокращает цену неудачной остановки и делает пару .old более свежей.

Проверка backup до того, как он понадобится#

Восстановить копию впервые в аварийной ситуации - это как раз тот способ, которым люди узнают, что их копии были пустыми, не от того мира или шестинедельной давности. Проверьте одну в спокойный вечер:

  1. Скачайте копию из панели или скопируйте её с сервера.
  2. На своём компьютере положите пару .db и .fwl в локальную папку worlds_local под тестовым именем - переименуйте оба файла одинаково.
  3. Запустите Valheim, выберите Start Game, выберите мир и отметьте Start Server, чтобы он работал локально.
  4. Дойдите до главной базы и убедитесь, что она в ожидаемом состоянии.

Это занимает десять минут и превращает надежду в факт. Более полная тренировка для любой игры - в статье Проверьте восстановление до того, как оно понадобится.

FAQ#

Насколько далеко можно откатить мир Valheim?

Настолько, насколько старая у вас самая старая копия. Пара .old - это одно сохранение назад; автоматические копии охватывают -backups, умноженное на -backuplong секунд, то есть два дня с настройками по умолчанию; backup вне машины - столько, сколько вы их храните. Всё, что старше всех трёх, потеряно.

Входят ли персонажи игроков в резервные копии?

Нет. Персонажи хранятся на компьютере каждого игрока, а не на сервере. Восстановление откатывает мир - постройки, сундуки, рельеф, прирученных животных, - но каждый игрок сохраняет тот инвентарь и навыки, которые у него есть сейчас.

Можно восстановить только одну базу, а не весь мир?

Ванильными средствами нельзя. Мир - это один файл, и восстанавливается он целиком. Редакторы миров умеют копировать участки между файлами, но это кропотливо и рискованно; прежде чем пробовать, сделайте backup текущего состояния.

Почему автоматических копий недостаточно?

Они лежат на том же диске и в той же папке, что и мир. Они переживут неудачное сохранение, но не удалённый сервер, отказ диска или ошибочно удалённую папку, и ротируются достаточно быстро, чтобы поздно замеченная проблема оказалась во всех них.

После обновления сервер создал новый мир. Мой пропал?

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

Какого размера бывают резервные копии Valheim?

Каждая - полная копия .db, то есть примерно размером с ваш мир: несколько мегабайт поначалу и часто от 50 до 150 МБ у давно живущего мира. Умножьте на количество хранимых копий.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000