
いくつかの ZFS「送信ストリーム」が保存されています (つまり、出力をzfs send
ファイルにリダイレクトすることによって作成されました)。これらのストリームを受信してファイルシステムに書き込むことなく、ストリームの内容を調べたいのですが、たとえば、ストリーム内のファイル名のリストを表示したいのですが。これを行う方法はありますか?
いろいろ読んで検索してみましたが、私が言っているようなものは見つかりませんでした。私はフリーBSDそしてそのLinux 上の ZFSZFS の実装。
答え1
にパイプすることでいくつかの情報を取得できますzstreamdump -d
が、ストリーム内にファイルがないため、ファイル名に関する情報は直接取得できません。ストリームは、ブロックで記述された 2 つのツリーのまったくの違いです。ただし、コードは公開されているため、ZFS 構造の検出と解析を追加できれば、より多くの情報を取得できます。
ZFSの内部構造は内部的にはツリーであり、すべての操作はそのツリー上で行われます。ファイル、ディレクトリ、ファイル名、属性、その他すべては、そのツリー内のデータにすぎません。スナップショット、ボリューム、および FS はツリーのルートであり、別のスナップショットを取得すると、現在のルートがどこかに保存されるだけです。ライブ システムでは、各トランザクションごとに新しいルートが生成され、常に古いルートから離れていきますが、以前のツリーからの多くのデータ「リーフ」はそのまま保持されます。ストリームは、ツリー A を B にするために実行する必要がある操作のリストを表します。
私が言いたいのは、ストリーム内に探しているデータが存在しない可能性があるということです。なぜなら、そのデータが存在する必要がないからです。ファイルがドロップされると、対応するブロックが解放されるだけなので、ファイル名や内容が何であったかはわかりません。ファイルが変更されると、オブジェクト ID によって参照されるため、ファイルが最初から書き直されても、ディレクトリ エントリが更新されていなければ、ストリームからは何も取得されません。
ストリームが差分ストリームでない場合、または以前の状態を超えるデータがある場合は幸運です。ただし、これは完全なストリームが空のルートをターゲット ツリーに変換し、必要なデータがすべて含まれるためです。したがって、ブロック解析コードを に追加して、zstreamdump
ZFS 内部データを検出して処理できます。
答え2
短い答え:
送信ストリームの内容を zfs 受信にパイプしてデータセットとして再作成するよりも軽量な方法で、送信ストリームの内容を効果的にカタログ化する方法はないと思います。
もっと長い答え:
送信ストリームはストレージブロックレベルのデータの集合であり、ないファイルシステム レベルのデータ コレクション。送信ストリームは個々のファイルを認識しておらず、気にも留めません。送信ストリームは、基本的に生のブロック デバイスを複製するように設計されています。あるユーザーは、zfs send
ファイルを直接保存した ZFS データセットを複製するためにのみこれを使用するかもしれませんが、別のユーザーは、ext4、ntfs、または LUKS などの暗号化システムでフォーマットされた ZVOL を複製するためにこれを使用するかもしれません。これらの場合、ZFS はボリュームの内容についてまったく認識しておらず、単に生のブロックを保存するだけです。
zfs send
データセットを複製する場合でも、raw zvolを複製する場合でも、rawブロックストレージレベル以下のことは気にしないので、まったく同じように動作します。ファイル名、ファイルサイズ、パスなどについては何も知りません。zvolまたはスナップショットの特定のスナップショットにどのブロックが属するかは知っていますが、ないそれらのブロックが互いにどのように関連しているかを知る。
つまり、ストリームのファイル内容をカタログ化する簡単な方法はないzfs send
。はファイルの内部カタログはありません。この特定のストリームが暗号化されていない ZFS データセットの完全な (増分ではない) レプリケーションであることが確実にわかっている場合でも、どのブロックにファイル名が含まれているかを判断するために、そのすべてのブロックを 1 行ずつ解析する必要があります。
基本的に、送信ストリームからファイル名を抽出するには、zfs receive
最初にそのストリームをデータセットに適用することによって行われるのと同じ作業をすべて実行することになります。