Перейти до змісту

Набори даних 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 цифр. Страхувальні знімки, ваші власні знімки та автоматичні знімки ніколи не зачіпаються. Щоб видалити знімок вручну:

zfs destroy -r cache/appdata@bombvault-20260924021500

Аномалії

Спорожнений дочірній набір майже не змінює підсумок великого дерева, тому виявлення аномалій стежить за кожним набором даних об'єкта окремо: розмір, кількість файлів, нові дані й час 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 для кожного набору даних і знову видаляє. Це найшвидший спосіб перевірити весь шлях перед першим запуском за розкладом.

Щоб подивитися самостійно, виконайте на сервері:

docker exec BombVault grep zfs /proc/self/mountinfo

Кожен рядок відповідає одному монтуванню всередині контейнера. Рядок набору даних показує його шлях усередині контейнера (під /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, потрібні права на верхній набір даних об'єкта, які тоді поширюються на кожен набір даних під ним:
zfs allow <user> snapshot,destroy,mount <dataset>

Для відновлення в новий набір даних потрібне ще право create на батьківському наборі даних, а для задання збережених властивостей потрібні права на ці властивості.

У сеансі SSH без root у TrueNAS шлях не містить /usr/sbin; тоді BombVault викликає /usr/sbin/zfs напряму. - Host Data застосунку має бути шляхом хоста над наборами даних, наприклад /mnt/tank, а не ixVolume. Зі шляхом хоста застосунок передає нові монтування хоста в BombVault (rslave), а саме це потрібно доступу до знімків.