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.
- 最後のアイデア(単一の送信、完全な受信)は機能するはずですが(簡単な環境でテストしましたが、うまくいきました)とにかく望んでいません。
したがって、特定の状況に要約して適用するには、次のようにします。
現在のスナップショットを繰り返し作成するか、コピーしたいすべての古いコンテンツを含む古いスナップショットを選択して始めます。
zfs snapshot -r zfs/staging.assets@now
ターゲットのソースから古いスナップショットをすべて削除します。すべてのスナップショットを表示する
zfs list -Hr -o name -t snap zfs/choang.assets
か、エラーメッセージからヒントを取得します。または、ターゲットデータセットに重要な内容が含まれていない場合は、ターゲットデータセットを削除して再作成してください。再帰的に送信して完全に受信し、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