Наборы данных ZFS¶
Страница ZFS создаёт резервные копии наборов данных ZFS. Объектом называется один набор данных вместе со всеми наборами данных под ним. Для каждой копии BombVault делает один снимок ZFS всего дерева, поэтому каждый набор данных в нём фиксируется в один и тот же момент. Затем он читает файлы каждого набора данных из этого снимка, сохраняет их с помощью restic так же, как папку, и сразу после этого удаляет снимок. Копии дедуплицированы, каждую из них можно просматривать, а отдельные файлы можно восстановить.
BombVault никогда не использует zfs send для наборов данных, никогда не откатывает набор данных и никогда его не уничтожает.
Требования¶
- Подключение SSH к этому серверу. Наборы данных ZFS используют тот же ключ, хост и пользователя, что и копии VM. Если копии VM уже работают, это тоже заработает. Иначе следуйте руководству по копированию VM через SSH на GitHub. Поля шаблона называются Host SSH: Address, Host SSH: Port и Host SSH: User.
- Команда
zfsна этом хосте. Она есть в Unraid 6.12 и новее и в TrueNAS SCALE. - Host Data, сопоставленный как
/mntс Access Mode Read/Write - Slave. Это значение шаблона по умолчанию. Снимок набора данных появляется в его папке.zfs/snapshotтолько после запуска BombVault, поэтому контейнер должен получать монтирования, которые хост делает позже. - Наборы данных, смонтированные под
/mnt. В Unraid пулы находятся в/mnt/<pool>, так что это уже выполнено.
Включите домен в Настройки, Общие (Наборы данных ZFS). Тогда на странице ZFS появится карточка Соединение с этим сервером. Она проверяет подключение SSH, называет пользователя и хост, к которым подключается, и говорит, чего не хватает, если чего-то не хватает. Проверка интеграции с хостом (/spike) показывает тот же результат.
Объекты и дочерние наборы данных¶
Откройте Добавить наборы данных на странице ZFS. Список приходит с сервера. Выберите набор данных, который находится выше всего в том, что вы хотите копировать, например cache/appdata, и объект охватит его и каждый набор данных под ним.
- Новые дочерние наборы данных добавляются сами. Набор данных, созданный позже под объектом, копируется при следующем запуске, и этот запуск отмечает его как новый. Его первая копия один раз читает его полностью; после этого читаются только изменения.
- Отдельные дочерние наборы можно исключить. Выключите один в настройках объекта, и он будет исключён вместе со всем, что под ним. Исключённый дочерний набор, которого больше нет на сервере, помечается как таковой и может быть убран из списка.
- Дочерние наборы, которые нельзя прочитать, пропускаются, но никогда молча. Запуск перечисляет их, объект показывает, сколько было пропущено, а карточка покрытия на панели считает каждый из них незащищённым. Запуск всё равно копирует всё остальное и не завершается ошибкой из-за пропущенного набора. Причины приведены в таблице кодов причин: набор данных не смонтирован, имеет
canmount=off, точку монтированияlegacyили её нет, ключ шифрования не загружен, доступ к снимкам выключен или точка монтирования, которую BombVault не видит. - Пропущенный набор данных не тянет за собой свои дочерние наборы. Набор с
canmount=off, содержащий только другие наборы данных, пропускается (показывается как "только структура"), а его смонтированные дочерние наборы копируются. Зашифрованный набор данных с незагруженным ключом пропускается вместе с дочерними наборами, которые разделяют его ключ. - Дочерние наборы, которые являются дисками VM или системными данными, изначально выключены в окне добавления, с причиной рядом с переключателем. Добавление целого пула требует подтверждения, в котором перечислено, что он содержит.
Тома¶
Том (zvol) содержит виртуальный диск вместо файлов, и страница ZFS никогда его не копирует.
- Том, который использует VM, копируется вместе с этой VM на странице Виртуальные машины.
- Том, который не использует ни одна VM (extent iSCSI, отключённый диск), BombVault не копирует. Окно добавления и страница ZFS считают такие тома и сообщают об этом. Одна из следующих версий будет их копировать.
Тома в дереве объекта пропускаются и называются при каждом запуске.
Хранилище Docker¶
С драйвером хранилища ZFS в Docker каждый слой образа является набором данных с точкой монтирования legacy. Окно добавления сворачивает их в одну строку на родителя. Дерево, содержащее больше 20 таких наборов данных, не может стать объектом: пока существует его снимок, Docker не может удалять слои образов. Вместо этого добавьте наборы данных под ним, например appdata.
Объекты никогда не пересекаются¶
Набор данных может принадлежать только одному объекту. BombVault отклоняет новый объект, который лежит внутри существующего или содержал бы его. Чтобы объединить несколько дочерних объектов в один родительский, сначала удалите дочерние объекты, выбрав сохранение их копий, а затем добавьте родительский. Каждый набор данных хранит историю под своим именем, поэтому следующая копия продолжает с того места, где остановились старые объекты, и не читает всё заново.
Остановка контейнеров и команды вокруг снимка¶
Снимок работающей базы данных похож на внезапное отключение питания: база обычно восстанавливается, но ей приходится это делать. Каждый объект может сделать с этим две вещи, и обе относятся только к моменту снимка, а не ко всей копии.
- Остановить эти контейнеры на время снимка. BombVault останавливает перечисленные контейнеры, делает снимок и сразу снова их запускает. Контейнеры одного уровня зависимостей останавливаются параллельно, сначала зависимые, поэтому всё окно обычно длится несколько секунд; запуск показывает, сколько именно. Затем копия читает замороженный снимок, пока приложения уже снова работают. Останавливаются только контейнеры, которые работали.
- Команда до и после снимка. Она выполняется внутри выбранного вами контейнера, например чтобы выгрузить базу данных в набор данных прямо перед снимком, ничего не останавливая. Если команда перед снимком завершается ошибкой, копия завершается ошибкой, и снимок не делается. Ошибка команды после снимка показывается в запуске, но не приводит к ошибке копии.
Что происходит, если что-то идёт не так:
- Если контейнер не удаётся остановить, BombVault запускает уже остановленные, а копия завершается ошибкой с именем контейнера. Он никогда не переходит на снимок работающих приложений.
- Остановка ждёт завершения идущей копии контейнера (до 30 минут при ручном запуске, до лимита времени копии при запуске по расписанию), чтобы они никогда одновременно не останавливали и не запускали один и тот же контейнер.
- Перед остановкой первого контейнера BombVault записывает, какие контейнеры он останавливает. Если BombVault будет завершён внутри окна, при следующем запуске он снова запустит эти контейнеры, отправит уведомление, а объект покажет красную пометку для каждого контейнера, который не удалось запустить.
Автоматические дампы баз данных (см. Возможности) выполняются вместе с собственной копией контейнера на странице Контейнеры, а не с объектом ZFS. База данных, контейнер которой копируется только через его набор данных, дампа не получает, поэтому задайте ей здесь команду.
Контейнер может одновременно быть в этом списке и на странице Контейнеры. Тогда его данные хранятся дважды, в двух репозиториях, а Полный бэкап останавливает его дважды. Объект об этом предупреждает.
Восстановление¶
Откройте Резервные копии у объекта, выберите копию, затем набор данных. По умолчанию это верхний набор данных объекта.
- Восстановить в сам набор данных. Файлы из копии записываются в точку монтирования набора данных. Файлы с тем же именем перезаписываются, остальные остаются. Набор данных никогда не откатывается и не заменяется. BombVault проверяет, что набор данных смонтирован, виден и доступен для записи, один раз перед началом и ещё раз прямо перед записью. Там, где внутри смонтирован дочерний набор, ничего не записывается: он сохраняет свои файлы, владельца и права и восстанавливается из своей собственной копии.
- Восстановить в папку. Выберите папку под
/mnt. BombVault проверяет, что папка находится на смонтированном пуле или общем ресурсе и что свободного места достаточно. Это работает без подключения SSH и для наборов данных, которых больше нет. - В новый набор данных. Укажите набор данных, которого ещё нет. BombVault создаёт его со свойствами ZFS из копии и восстанавливает в него, см. Восстановление как нового набора данных.
- Выбрать файлы (расширенный режим): записать обратно в набор данных только выбранные файлы и папки.
- Все наборы данных этой копии (расширенный режим): каждый набор данных дерева в свою подпапку выбранной папки. Наборы данных, пропущенные в этой копии, называются.
- С другого сервера: страница Восстановление восстанавливает из репозитория другого BombVault, всегда в папку: все наборы данных одной копии, каждый в свою подпапку, или один набор данных дерева, целиком или выбранные файлы.
Список контейнеров для остановки из объекта предлагается и при восстановлении в сам набор данных. Эти контейнеры остаются остановленными на всё время восстановления, а копии контейнеров тем временем ждут.
Страховочный снимок¶
Прежде чем записывать в набор данных, BombVault делает снимок ZFS только этого набора данных с именем bombvault-prerestore-<время>. По умолчанию он включён; для отключения нужно второе подтверждение. Если снимок сделать не удаётся, ничего не восстанавливается.
BombVault никогда сам не удаляет страховочный снимок. Объект перечисляет их с возрастом и размером, у каждого есть действие Удалить, и предупреждает, когда самому старому больше 30 дней, потому что он удерживает на пуле удалённые и изменённые данные.
Чтобы вернуться назад после восстановления, скопируйте отдельные файлы из .zfs/snapshot/bombvault-prerestore-<время> внутри набора данных. zfs rollback <dataset>@bombvault-prerestore-<время> работает, только пока это самый новый снимок этого набора данных. zfs rollback -r удаляет все более новые снимки, включая автоматические.
Восстановление как нового набора данных¶
BombVault сохраняет с каждой копией локально заданные свойства ZFS каждого набора данных: compression, recordsize, quota, reservation, atime, xattr, acltype, casesensitivity и ваши собственные пользовательские свойства. Унаследованные значения и значения только для чтения не сохраняются, потому что возвращаются сами. У копий, сделанных до того, как BombVault начал их сохранять, их нет.
- В новый набор данных запускает
zfs createсо всеми сохранёнными свойствами. casesensitivity, normalization и utf8only можно задать только так. Квоты и резервирования задаются после файлов, чтобы они не могли помешать их записи. Точка монтирования не переносится, чтобы копия не столкнулась с оригиналом, как иcanmount,readonlyи шифрование, чтобы восстановление могло записывать. Новый набор данных внутри зашифрованного получает его шифрование. Родительский набор данных должен существовать. Если после создания что-то пойдёт не так, новый набор данных останется на сервере, потому что BombVault никогда не уничтожает наборы данных. - Восстановить в сам набор данных показывает сохранённые свойства рядом с восстановлением. Задать и эти свойства задаёт те, которые существующий набор данных ещё принимает, до записи первого файла. Квоты и резервирования задаются после файлов, чтобы они не могли помешать их записи. Без этого переключателя набор данных сохраняет свои настройки.
Что входит в копию¶
В копию входят: файлы и папки каждого скопированного набора данных с владельцем, правами, отметками времени и расширенными атрибутами в том виде, в каком их сохраняет restic, а также локально заданные свойства ZFS каждого набора данных.
Не входит в копию:
- владелец и права самой верхней папки каждого набора данных (всё, что под ней, входит). Восстановление в сам набор данных оставляет существующую верхнюю папку как есть, восстановление в папку создаёт её с правами
0755; - существующие снимки ZFS;
- дочерние наборы, которые были пропущены или исключены;
- тома.
Чтобы восстановить на новый пул, создайте пул и восстановите каждый набор данных в новый набор данных. Возвращаются ли NFSv4 ACL, как их использует TrueNAS на наборах данных SMB, так, как вы ожидаете, пока не проверено, поэтому проверьте восстановление на своих данных, прежде чем на это полагаться.
Зашифрованные наборы данных¶
Зашифрованный набор данных копируется, только пока его ключ загружен. Иначе он пропускается с предупреждением; загрузите ключ командой zfs load-key и смонтируйте набор данных. BombVault читает данные в расшифрованном виде и сохраняет их в репозитории restic, который зашифрован. Если вы отключили шифрование в BombVault, этот репозиторий не зашифрован.
Оставшиеся снимки¶
Снимок копии называется <dataset>@bombvault-<14 цифр>, например cache/appdata@bombvault-20260924021500 (UTC). BombVault удаляет его сразу после копии. Если это не удаётся, например потому что набор данных занят или BombVault был остановлен, BombVault удаляет его:
- перед следующей копией этого объекта,
- при запуске BombVault, для каждого объекта, даже при выключенном домене,
- когда вы удаляете объект,
- когда вы нажимаете Удалить сейчас у объекта, где также видно, сколько их осталось.
Удаляются только имена, которые в точности равны bombvault- плюс 14 цифр. Страховочные снимки, ваши собственные снимки и автоматические снимки никогда не затрагиваются. Чтобы удалить снимок вручную:
Аномалии¶
Опустошённый дочерний набор почти не меняет итог большого дерева, поэтому обнаружение аномалий следит за каждым набором данных объекта отдельно: у размера, числа файлов, новых данных и времени restic есть своя история. Эта история принадлежит имени набора данных, поэтому она сохраняется, когда дерево позже копирует другой объект.
Набор данных, который предыдущий запуск скопировал, а этот запуск не смог прочитать, считается опустошённым, если выбор объекта не изменился. Это покрывает незагруженный ключ, несмонтированный набор данных и набор, исчезнувший из дерева. Дочерний набор, который вы исключаете сами, меняет выбор, поэтому его история начинается заново. Пока открыта находка о потерянных данных, хранение оставляет старые копии только этого набора данных, а остальное дерево очищает как обычно.
На странице Аномалии у каждого набора данных есть своя строка в панели объекта. Панель открывается кнопкой Наблюдение на карточке объекта или, если у объекта ничего не открыто, из его строки в карточке Ничего не открыто. Дерево объекта на этой странице показывает открытые находки рядом с каждым набором данных. Ссылка в находке открывает панель восстановления объекта на последней хорошей копии набора данных. Завершается ли запуск, оценивается для всего объекта, потому что запуск успешен или неуспешен как целое.
Сами проверки описаны в разделе Возможностей. Ассистент, подключённый через сервер MCP, может перечислить точки восстановления объекта ZFS, запустить его копию и прочитать находки, но подтверждение находки выполняется на странице Аномалии.
Коды причин¶
Страница, история запусков и уведомления называют проблему одним из этих кодов. Для большинства способ исправления показан и рядом на странице.
| Код | Значение | Что делать |
|---|---|---|
ssh-missing |
Подключение SSH в этом контейнере не настроено. | Настройте подключение SSH так же, как для копий VM. |
host-placeholder |
Host SSH: Address всё ещё содержит пример, а host.docker.internal тоже не ответил. |
Укажите в Host SSH: Address LAN-IP этого сервера. |
host-fallback |
Host SSH: Address всё ещё содержит пример, а host.docker.internal работает. |
Ничего, или укажите LAN-IP. |
ssh-unreachable |
Сервер недоступен по SSH. | Проверьте адрес и порт и что SSH включён. |
ssh-auth |
Сервер отклонил ключ BombVault. | Один раз выполните на сервере команду, показанную на карточке соединения. |
zfs-not-found |
На хосте SSH нет команды zfs. |
Направьте Host SSH: Address на машину, которой принадлежат пулы. |
zfs-permission |
Пользователю SSH нельзя выполнять эту команду zfs. | Используйте root или см. TrueNAS SCALE. |
uri-mismatch |
LIBVIRT_URI указывает другой хост или пользователя, чем поля SSH. |
Согласуйте их или очистите поля SSH, чтобы оба значения брались из URI. |
zfs-error |
zfs сообщил о другой ошибке. | Подробности показывают его сообщение. |
propagation-missing |
Новые монтирования на хосте не доходят до контейнера. | Установите Access Mode для Host Data в Read/Write - Slave и перезапустите BombVault. |
invalid-name |
Имя набора данных, которое BombVault не принимает. | Переименуйте набор данных. |
name-too-long |
Набор данных в дереве слишком длинный для имени снимка. | Переименуйте его или добавьте объектом набор данных под ним. |
invalid-exclude |
Шаблон исключения или исключённый дочерний набор не подходит к объекту. | Исправьте запись, названную в сообщении. Чтобы исключить дочерний набор целиком, выключите его, а не пишите шаблон. |
not-found |
Набора данных нет на сервере. | Удалите объект или создайте набор данных заново. Его копии остаются восстанавливаемыми. |
not-filesystem |
Это том, а не файловая система. | См. Тома. |
overlaps-item |
Набор данных пересекается с существующим объектом. | См. Объекты никогда не пересекаются. |
docker-storage |
Дерево содержит хранилище образов Docker. | См. Хранилище Docker. |
nothing-readable |
Сейчас не читается ни один набор данных объекта. | Посмотрите коды пропущенных наборов данных. |
snapshot-failed |
Снимок не удалось создать. | Подробности показывают сообщение zfs. |
containers-busy |
Когда контейнеры должны были остановиться, ещё шла копия контейнера. | Запустите позже ещё раз. Запуски по расписанию ждут сами. |
consistency-stop-failed |
Контейнер не удалось остановить, поэтому снимок не сделан. | Проверьте контейнер или уберите его из списка. |
pre-snapshot-failed |
Команда перед снимком завершилась ошибкой. | Подробности запуска показывают её вывод. |
container-unknown |
Контейнер из списка не существует. | Уберите его из списка. |
container-is-self |
BombVault не может остановить собственный контейнер. | Уберите его из списка. |
leftover-snapshots |
На сервере остались снимки, которые BombVault не смог удалить. | Нажмите Удалить сейчас, см. Оставшиеся снимки. |
zvol |
Том в дереве, пропущен. | См. Тома. |
canmount-off |
Никогда не монтируется (canmount=off), пропущен. |
Если в нём есть данные, смонтируйте его или перенесите данные в дочерний набор. |
legacy-mount |
Точка монтирования legacy, пропущен. | Задайте ему точку монтирования под /mnt. |
no-mountpoint |
Нет точки монтирования, пропущен. | Задайте ему точку монтирования под /mnt. |
not-mounted |
Не смонтирован на сервере, пропущен. | Смонтируйте его командой zfs mount или установите canmount=on. |
key-not-loaded |
Зашифрован, ключ не загружен, пропущен. | zfs load-key, затем смонтируйте его. |
snapdir-disabled |
Доступ к снимкам выключен, пропущен. | zfs set snapdir=hidden <dataset>. Папка .zfs остаётся скрытой. |
not-visible |
BombVault не видит точку монтирования набора данных. | Перенесите точку монтирования под путь Host Data или сопоставьте её в контейнер по тому же пути с Read/Write - Slave. |
shfs-only |
Набор данных виден только через /mnt/user, который скрывает снимки. |
Сопоставьте как Host Data /mnt, а не /mnt/user. |
snapshot-not-visible |
Снимок создан, но не появился внутри BombVault. | Выполните Проверить доступ к снимкам; см. ниже. |
snapshot-loop |
Снимок не дошёл до BombVault, потому что Host Data не пропускает новые монтирования. | Установите Access Mode для Host Data в Read/Write - Slave и перезапустите BombVault. |
backup-failed |
restic завершился ошибкой для этого набора данных. | Подробности запуска показывают причину. |
not-reached |
Запуск закончился до этого набора данных. | Запустите копию ещё раз. |
gone |
Набора данных больше нет на сервере. | Ничего. Его копии остаются восстанавливаемыми. |
read-only-mount |
BombVault может только читать набор данных, поэтому не может восстанавливать в него. | Установите сопоставление в Read/Write - Slave или восстановите в папку. |
destination-not-mounted |
Папка не находится на смонтированном пуле или общем ресурсе. | Выберите папку на пуле или общем ресурсе. |
not-enough-space |
В месте назначения недостаточно свободного места. | Освободите место или выберите другую папку. |
safety-snapshot-failed |
Страховочный снимок сделать не удалось, поэтому ничего не восстановлено. | Подробности показывают сообщение zfs. |
safety-name-too-long |
Имя набора данных слишком длинное для страховочного снимка. | Выключите страховочный снимок или восстановите в папку. |
dataset-exists |
Набор данных с таким именем уже существует. | Выберите новое имя или восстановите в сам набор данных. |
create-failed |
Не удалось создать новый набор данных. | В подробностях есть сообщение zfs. Проверьте, что родительский набор данных существует. |
new-dataset-not-visible |
Новый набор данных создан, но BombVault его не видит, поэтому ничего не восстановлено. | Набор данных остаётся на сервере. Смонтируйте его ниже пути Host Data и восстановите в него. |
set-properties-failed |
Не удалось задать сохранённые свойства, поэтому ничего не восстановлено. | Подробности показывают сообщение zfs. |
set-limits-failed |
Файлы восстановлены, но сохранённую квоту или резервирование задать не удалось. | В подробностях есть сообщение zfs. Задайте квоту или резервирование сами через zfs set. |
Проверка того, что видит контейнер¶
Проверить доступ к снимкам у объекта делает настоящий снимок его дерева, ищет его внутри BombVault для каждого набора данных и снова удаляет. Это самый быстрый способ проверить весь путь перед первым запуском по расписанию.
Чтобы посмотреть самостоятельно, выполните на сервере:
Каждая строка соответствует одному монтированию внутри контейнера. Строка набора данных показывает его путь внутри контейнера (под /host/user) и имя набора данных. Поле master:N в этой строке означает, что монтирование получает монтирования, которые хост делает позже, а именно это нужно доступу к снимкам. Если его нет, установите Access Mode для Host Data в Read/Write - Slave и перезапустите BombVault.
TrueNAS SCALE¶
- Если задана
LIBVIRT_URI(как для копий VM в TrueNAS), BombVault берёт хост, пользователя и порт SSH для своих команд zfs из URI, каждое значение, которое не задано отдельно. Без копий VM задайте вместо этогоLIBVIRT_HOST,LIBVIRT_SSH_USERиLIBVIRT_SSH_PORT. Добавьте переменные в Additional Environment Variables. - Пользователю, отличному от root, нужны права на верхний набор данных объекта, которые тогда распространяются на каждый набор данных под ним:
Для восстановления в новый набор данных нужно ещё право create на родительском наборе данных, а для задания сохранённых свойств нужны права на эти свойства.
В сеансе SSH без root в TrueNAS путь не содержит /usr/sbin; тогда BombVault вызывает /usr/sbin/zfs напрямую.
- Host Data приложения должен быть путём хоста над наборами данных, например /mnt/tank, а не ixVolume. С путём хоста приложение передаёт новые монтирования хоста в BombVault (rslave), а именно это нужно доступу к снимкам.