コンテンツにスキップ

ZFS データセット

ZFS ページは ZFS データセットをバックアップします。項目とは、1 つのデータセットとその下にあるすべてのデータセットをまとめたものです。バックアップのたびに BombVault はツリー全体の ZFS スナップショットを 1 つだけ作成するため、その中のすべてのデータセットが同じ瞬間の状態で記録されます。次にそのスナップショットから各データセットのファイルを読み取り、フォルダーと同じ方法で restic に保存し、直後にスナップショットを削除します。バックアップは重複排除され、どれも閲覧でき、個々のファイルを復元できます。

BombVault はデータセットに zfs send を使うことはなく、データセットをロールバックすることも、削除することもありません。

必要なもの

  • このサーバーへの SSH 接続。 ZFS データセットは VM バックアップと同じ鍵、ホスト、ユーザーを使います。VM バックアップがすでに動いていれば、これも動きます。そうでない場合は GitHub の SSH 経由の VM バックアップのガイドに従ってください。テンプレートの項目名は Host SSH: Address、Host SSH: Port、Host SSH: User です。
  • そのホストの zfs コマンド。 Unraid 6.12 以降と TrueNAS SCALE にはあります。
  • Host Data を /mnt として、Access Mode Read/Write - Slave でマッピング。 これはテンプレートの既定値です。データセットのスナップショットは BombVault の起動後にデータセットの .zfs/snapshot フォルダーに現れるため、コンテナはホストが後から行うマウントを受け取る必要があります。
  • データセットが /mnt の下にマウントされていること。 Unraid ではプールは /mnt/<pool> にあるので、すでにそうなっています。

設定、一般 でドメインをオンにします(ZFS データセット)。すると ZFS ページに このサーバーへの接続 カードが表示されます。SSH 接続をテストし、接続先のユーザーとホストを示し、足りないものがあれば何が足りないかを伝えます。ホスト連携チェック(/spike)も同じ結果を表示します。

項目と子データセット

ZFS ページで データセットを追加 を開きます。一覧はサーバーから取得されます。バックアップしたいものの最上位にあるデータセット、たとえば cache/appdata を選ぶと、項目はそのデータセットとその下のすべてのデータセットを対象にします。

  • 新しい子データセットは自動で加わります。 後から項目の下に作られたデータセットは次の実行でバックアップされ、その実行で新しいものとして示されます。最初のバックアップでは一度だけ全体を読み取り、その後は変更だけを読み取ります。
  • 個々の子を除外できます。 項目の設定で子をオフにすると、その下のすべてと一緒に除外されます。除外した子がサーバーからなくなると、その旨が表示され、一覧から削除できます。
  • 読み取れない子はスキップされますが、黙ってスキップされることはありません。 実行はそれらを一覧にし、項目はスキップした数を示し、ダッシュボードのカバレッジカードはそれぞれを保護されていないものとして数えます。それでも実行は他のすべてをバックアップし、スキップした子があっても失敗にはなりません。理由は理由コードの表にあります。マウントされていない、canmount=off、マウントポイントが legacy かない、暗号鍵が読み込まれていない、スナップショットへのアクセスがオフ、BombVault から見えないマウントポイント、のいずれかです。
  • スキップされたデータセットがその子を巻き込むことはありません。 他のデータセットだけを含む canmount=off のデータセットはスキップされ(「構造のみ」と表示)、マウントされている子はバックアップされます。鍵が読み込まれていない暗号化データセットは、同じ鍵を共有する子と一緒にスキップされます。
  • VM ディスクやシステムデータである子は、追加ダイアログで最初からオフになっています。 理由はスイッチの横に表示されます。プール全体を追加すると、その内容を一覧にした確認が求められます。

ボリューム

ボリューム(zvol)はファイルの代わりに仮想ディスクを持ち、ZFS ページがボリュームをバックアップすることはありません。

  • VM が使うボリュームは、VM ページでその VM と一緒にバックアップされます。
  • どの VM も使っていないボリューム(iSCSI extent、切り離したディスク)は BombVault ではバックアップされません。追加ダイアログと ZFS ページはそのようなボリュームを数え、その旨を表示します。今後のバージョンでバックアップされる予定です。

項目のツリー内のボリュームは、実行のたびにスキップされ、名前が示されます。

Docker のストレージ

Docker の ZFS ストレージドライバーでは、イメージの各レイヤーが legacy マウントポイントを持つデータセットになります。追加ダイアログはこれらを親ごとに 1 行にまとめます。このようなデータセットを 20 個より多く含むツリーは項目にできません。そのスナップショットが存在する間、Docker はイメージレイヤーを削除できないからです。代わりにその下のデータセット、たとえば appdata を追加してください。

項目が重なることはありません

1 つのデータセットは 1 つの項目にしか属せません。BombVault は、既存の項目の内側にある新しい項目や、既存の項目を含むことになる新しい項目を拒否します。複数の子項目を 1 つの親項目にまとめるには、まず子項目をバックアップを残す設定で削除し、それから親を追加します。各データセットは自分の名前で履歴を保つので、次のバックアップは古い項目が止まったところから続き、すべてを読み直すことはありません。

スナップショット前後のコンテナ停止とコマンド

動作中のデータベースのスナップショットは、突然の停電のようなものです。データベースはたいてい回復しますが、回復処理が必要になります。各項目はこれに対して 2 つのことができ、どちらもバックアップ全体ではなくスナップショットの瞬間だけを対象にします。

  • スナップショットのあいだ、これらのコンテナを止める。 BombVault は一覧のコンテナを停止し、スナップショットを作成して、すぐに再起動します。同じ依存階層のコンテナは並行して停止し、依存する側が先に止まるので、全体の時間は通常数秒です。実行にはその長さが表示されます。その後バックアップは、アプリがすでに動き出している間に凍結されたスナップショットを読み取ります。停止されるのは動いていたコンテナだけです。
  • スナップショットの前後に実行するコマンド。 選んだコンテナの中で実行されます。たとえば何も止めずに、スナップショットの直前にデータベースをデータセットへダンプするために使います。スナップショット前のコマンドが失敗するとバックアップは失敗し、スナップショットは作成されません。スナップショット後のコマンドが失敗しても実行に表示されるだけで、バックアップは失敗しません。

うまくいかなかったときの動作:

  • コンテナを停止できない場合、BombVault はすでに停止したコンテナを起動し、バックアップはそのコンテナ名を示して失敗します。動作中のアプリのスナップショットで済ませることはありません。
  • 停止は、実行中のコンテナバックアップが終わるまで待ちます(手動実行では最大 30 分、スケジュール実行ではバックアップの制限時間まで)。これにより、両者が同じコンテナを同時に停止したり起動したりすることはありません。
  • 最初のコンテナを止める前に、BombVault はどのコンテナを止めるかを記録します。その間に BombVault が強制終了された場合、次回の起動時にそれらのコンテナを再び起動し、通知を送ります。起動できなかったコンテナごとに、項目に赤い注記が表示されます。

データベースの自動ダンプ(機能を参照)は、ZFS 項目ではなく コンテナ ページでのコンテナ自身のバックアップと一緒に実行されます。コンテナがデータセット経由でしかバックアップされないデータベースにはダンプが作られないので、ここでコマンドを設定してください。

コンテナはこの一覧と コンテナ ページの両方に同時に入れることができます。その場合、データは 2 つのリポジトリに 2 回保存され、全体バックアップ はそのコンテナを 2 回停止します。項目にはその旨が表示されます。

復元

項目で バックアップ を開き、バックアップを選び、次にデータセットを選びます。既定では項目の最上位のデータセットです。

  • データセットの中へ復元。 バックアップのファイルがデータセットのマウントポイントに書き込まれます。同じ名前のファイルは上書きされ、ほかのファイルはそのまま残ります。データセットがロールバックされたり置き換えられたりすることはありません。BombVault は、データセットがマウントされていて、見えていて、書き込み可能であることを、開始前に一度、書き込み直前にもう一度確認します。中に子データセットがマウントされている場所には何も書き込みません。子は自分のファイル、所有者、権限を保ち、自分のバックアップから復元されます。
  • フォルダーへ復元。 /mnt の下のフォルダーを選びます。BombVault は、そのフォルダーがマウントされたプールまたは共有にあり、十分な空き容量があることを確認します。SSH 接続がなくても、もう存在しないデータセットでも使えます。
  • 新しいデータセットへ。 まだ存在しないデータセットの名前を指定します。BombVault はバックアップに保存された ZFS プロパティでそれを作成し、そこへ復元します。新しいデータセットとして復元を参照してください。
  • ファイルを選ぶ(詳細): 選んだファイルとフォルダーだけをデータセットに書き戻します。
  • このバックアップのすべてのデータセット(詳細): ツリーの各データセットを、選んだフォルダーのそれぞれのサブフォルダーに復元します。そのバックアップでスキップされたデータセットは名前が示されます。
  • 別のサーバーから: リカバリー ページは別の BombVault のリポジトリから、常にフォルダーへ復元します。1 つのバックアップのすべてのデータセットをそれぞれのサブフォルダーへ、またはツリーの 1 つのデータセットを丸ごとか選んだファイルだけ復元します。

項目の停止するコンテナの一覧は、データセットの中への復元でも提示されます。それらのコンテナは復元の間ずっと停止したままで、その間コンテナのバックアップは待機します。

安全用スナップショット

データセットに書き込む前に、BombVault はそのデータセットだけの ZFS スナップショットを bombvault-prerestore-<時刻> という名前で作成します。既定でオンになっており、オフにするには 2 回目の確認が必要です。スナップショットを作成できない場合、何も復元されません。

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 スナップショット
  • スキップされた子や除外した子
  • ボリューム

新しいプールへ復元するには、プールを作成し、各データセットを新しいデータセットへ復元します。TrueNAS が SMB データセットで使う NFSv4 ACL が期待どおりに戻るかどうかはまだ確認されていないので、頼る前に自分のデータで復元を試してください。

暗号化されたデータセット

暗号化されたデータセットは、鍵が読み込まれている間だけバックアップされます。そうでない場合は警告付きでスキップされます。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 接続が設定されていません。 VM バックアップと同じように SSH 接続を設定します。
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 ホストの新しいマウントがコンテナに届きません。 Host Data の Access Mode を 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/user ではなく /mnt をマッピングします。
snapshot-not-visible スナップショットは作成されましたが、BombVault 内に現れませんでした。 スナップショットへのアクセスを試す を実行します。下記を参照してください。
snapshot-loop Host Data が新しいマウントを通さないため、スナップショットが BombVault に届きませんでした。 Host Data の Access Mode を 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

各行はコンテナ内の 1 つのマウントです。データセットの行には、コンテナ内のパス(/host/user の下)とデータセット名が表示されます。その行に master:N フィールドがあれば、そのマウントはホストが後から行うマウントを受け取るという意味で、スナップショットへのアクセスにはこれが必要です。ない場合は、Host Data の Access Mode を Read/Write - Slave にして BombVault を再起動してください。

TrueNAS SCALE

  • LIBVIRT_URI が設定されている場合(TrueNAS での VM バックアップと同じく)、BombVault は zfs コマンド用の SSH ホスト、ユーザー、ポートのうち個別に設定されていないものを URI から取ります。VM バックアップを使わない場合は、代わりに LIBVIRT_HOST、LIBVIRT_SSH_USER、LIBVIRT_SSH_PORT を設定してください。変数は Additional Environment Variables に追加します。
  • root 以外のユーザーには、項目の最上位データセットに対する権限が必要です。これでその下のすべてのデータセットが対象になります:
zfs allow <user> snapshot,destroy,mount <dataset>

新しいデータセットへの復元には、上位のデータセットに対する create も必要です。保存されたプロパティを設定するには、それらのプロパティに対する権限が必要です。

TrueNAS の root 以外の SSH セッションでは、パスに /usr/sbin が含まれません。その場合 BombVault は /usr/sbin/zfs を直接呼び出します。 - アプリの Host Data は、ixVolume ではなく、データセットより上のホストパス(たとえば /mnt/tank)である必要があります。ホストパスであれば、アプリはホストの新しいマウントを BombVault に渡し(rslave)、スナップショットへのアクセスにはこれが必要です。