ステージング(staging)と開発(choang)の2つの環境があります。データセットzfs/staging.assets
から別のデータセットzfs/choang.assets
内に(スナップショットを含めて)複製できません同じzpoolzfs
。
注:起点と宛先の両方のデータセットをアンマウントする必要があると想定しています。
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
すべてのスナップショットを複製するにはどうすればよいですか?
最近サーバーでカーネルの更新が(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 を参照してください
ZFSで送信/受信を使用すると、スナップショットでのみ使用でき、データセットをアンマウントする必要はありません。ボリュームを送受信できなくなります。
Zfs sendコマンドは、標準出力に書き込まれるスナップショットのストリーム表現を作成します。デフォルトでは、フルストリームが生成されます。出力をファイルまたは別のシステムにリダイレクトできます。 zfs receiveコマンドは、標準入力で提供されるストリームでコンテンツが指定されているスナップショットを作成します。完全なストリームが受信されると、新しいファイルシステムも作成されます。これらのコマンドを使用して、ZFSスナップショットデータを送信し、ZFSスナップショットデータとファイルシステムを受信できます。
適切なコマンドは次のとおりです。
zfs send tank/data@snap1 | zfs recv spool/ds01
Zfsスナップショットを送受信するより良い方法は、mbufferを使用して、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
ここではいくつかのことが重要です。あなたのエラーはそれらの組み合わせから生じます:
send/recv
できることを意味します。@--head--
を取得します。これは、送信時のソースの状態です(既存のスナップショットを送信した場合、そのスナップショットが@--head--
の代わりになります)宛先側)。send -R | recv -F
の組み合わせは、完全なレプリケーション(再帰的で、ソースにプロパティを含め、宛先に古いものを破棄する)を意味するため、ファイルシステム階層を拡張する方法を決定する必要があります。-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