同じ 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
    

答え2

サーバー上の最近のCPanelを介してカーネルが更新されましたが、サーバーは再起動されませんでした。ログファイルを確認した後、ZFSも更新されたことを確認しました。カーネルモジュールとCLIツール間のバージョンの競合により、この質問のコマンドが正しく機能しないようです。

別のサーバーで以下を正常に実行した後、この結論に達しました。

# zfs send -R tank1@--refresh-- | zfs recv -Fu tank2

# zfs list -t snapshot
NAME                USED  AVAIL  REFER  MOUNTPOINT
tank1@turtle          9K      -    34K  -
tank1@tiger           9K      -  47.5K  -
tank1@squirrel       10K      -  58.5K  -
tank1@rabbit         10K      -    70K  -
tank1@owl            11K      -  80.5K  -
tank1@deer           11K      -  90.5K  -
tank1@bear             0      -   106K  -
tank1@--refresh--      0      -   106K  -
tank2@turtle          9K      -    34K  -
tank2@tiger           9K      -  47.5K  -
tank2@squirrel       10K      -  58.5K  -
tank2@rabbit         10K      -    70K  -
tank2@owl            11K      -  80.5K  -
tank2@deer           11K      -  90.5K  -
tank2@bear            1K      -   106K  -
tank2@--refresh--      0      -   106K  -

その後、元のサーバーに戻り、ZFSモジュールをDKMSからカーネルのkABIモジュールシステムに切り替え、サーバーを再起動しました。コマンドが正しく実行されました。バラよりhttps://github.com/zfsonlinux/zfs/wiki/RHEL-%26-CentOS

答え3

ZFSで送受信を使用すると、データセットをアンマウントせずにスナップショットでのみ使用できます。ボリュームを送受信できません。

zfs sendコマンドは、標準出力に書き込まれるスナップショットのストリーム表現を作成します。デフォルトでは、ストリーム全体が生成されます。出力をファイルまたは他のシステムにリダイレクトできます。 zfs receiveコマンドは、標準入力に提供されているストリームに内容が指定されたスナップショットを作成します。ストリーム全体が受信されると、新しいファイルシステムも作成されます。これらのコマンドを使用してZFSスナップショットデータを送信し、ZFSスナップショットデータとファイルシステムを受信できます。

正しいコマンドは次のとおりです。

zfs send tank/data@snap1 | zfs recv spool/ds01

zfsスナップショットを送受信するためのより良い方法は、次を使用することです。バッファーI / O遅延のリスクを最小限に抑え、ネットワークバッファを埋めます。

送る機械から:

zfs send pool/image@test | mbuffer -s 128k -m 1G -O 127.0.0.1:9090

受信機から:

mbuffer -s 128k -m 1G -I 9090 | zfs receive -F pool/image1

これは、同じコンピュータで127.0.0.1を使用するか、リモートコンピュータでxx.xx.xx.xxを使用できるためです。

源泉:https://docs.oracle.com/cd/E18752_01/html/819-5461/gbchx.html

関連情報