同じ zpool からデータ・セットを受け取る zfs に送信することはできません。

同じ zpool からデータ・セットを受け取る zfs に送信することはできません。

2つの環境を準備しています(分割火)そして開発()。コピーできません(スナップショットを含める)データセットからzfs/staging.assets他のデータセットへzfs/choang.assets 以内に同じzpool zfs

注:ソースとターゲットのデータセットをアンロードする必要があるとします。

zfs unmount zfs/staging.assets
zfs unmount zfs/choang.assets

zfs send -R zfs/staging.assets | zfs receive -F zfs/choang.assets

上記のコマンドを実行すると、次のエラーが発生します。

Error: Unsupported flag with filesystem or bookmark.
cannot receive: failed to read from stream

-Rオプションを削除してコマンドを実行すると成功します。

zfs send zfs/staging.assets | zfs receive -F  zfs/choang.assets

zfs/choang.assets@--head--ただし、スナップショットは受信されず、単一のスナップショットが作成されます。

最後にスナップショットを送ってみました。一度に一つずつ送れないかと思いました。

zfs send zfs/staging.assets@sha512_hash | zfs receive -Fduv zfs/choang.assets

この方法も機能せず、次のエラーが発生します。

internal error: Invalid argument
cannot receive: failed to read from stream

すべてのスナップショットをコピーするには?

ベストアンサー1

ここにいくつかの重要なことがあります。あなたのエラーは次の組み合わせによって引き起こされます。

  • 通常、ファイルシステム全体ではなく、特定のスナップショットまたは複数のスナップショットを送信します。つまり、データセットを削除してユーザーを邪魔する必要がなく、send/recv後で徐々に実行できます。
  • ソースでスナップショットを指定しないと、@--head--転送時にソースの状態である自動生成されたスナップショットが表示されます。 (既存のスナップショットを送信した場合、このスナップショットは@--head--ソース側のスナップショットを置き換えます。)
  • このsend -R | recv -F組み合わせは、コピー全体(ソースの属性を繰り返し含め、ターゲットの以前のコンテンツを削除する)を意味するため、ファイルシステム階層を拡張する方法を決定する必要があります。または、受信時にnoフラグ(フラグなし)を使用することもできます-e-dソース親データセットの名前を保持せずに、新しいデータセットの下のコンテンツをマージすることを意味します。

    The -d and -e options cause the file system name of the target snapshot
    to be determined by appending a portion of the sent snapshot's name to
    the specified target filesystem.  If the -d option is specified, all
    but the first element of the sent snapshot's file system path (usually
    the pool name) is used and any required intermediate file systems
    within the specified one are created. If the -e option is specified,
    then only the last element of the sent snapshot's file system name
    (i.e. the name of the source file system itself) is used as the target
    file system name.
    
  • 最後のアイデア(単一の送信、完全な受信)は機能するはずですが(簡単な環境でテストしましたが、うまくいきました)とにかく望んでいません。

したがって、特定の状況に要約して適用するには、次のようにします。

  1. 現在のスナップショットを繰り返し作成するか、コピーしたいすべての古いコンテンツを含む古いスナップショットを選択して始めます。

    zfs snapshot -r zfs/staging.assets@now
    
  2. ターゲットのソースから古いスナップショットをすべて削除します。すべてのスナップショットを表示するzfs list -Hr -o name -t snap zfs/choang.assetsか、エラーメッセージからヒントを取得します。または、ターゲットデータセットに重要な内容が含まれていない場合は、ターゲットデータセットを削除して再作成してください。

  3. 再帰的に送信して完全に受信し、2番目のデータセットの以前のデータセットをすべて削除し、サブデータセットをターゲットにマージしてソースをミラーリングします。

    zfs send -R zfs/staging.assets@now | zfs recv -Fu zfs/choang.assets
    

おすすめ記事