web-dev-qa-db-ja.com

zfs sendできません| zfsは同じzpoolでデータセットを受け取ります

ステージング(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

すべてのスナップショットを複製するにはどうすればよいですか?

2
Michael Niño

最近サーバーでカーネルの更新が(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 を参照してください

2
Michael Niño

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

1
ValeriRangelov

ここではいくつかのことが重要です。あなたのエラーはそれらの組み合わせから生じます:

  • 通常、ファイルシステム全体ではなく、特定のスナップショットまたは複数のスナップショットを送信します。これは、データセットをアンマウントしてユーザーを混乱させる必要がなく、後で段階的に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.
    
  • あなたの最後のアイデア(単一送信、完全受信)は機能するはずです(私は単純な環境でそれをテストしましたが、機能しました)。

それで、それを要約してあなたの特定の状況に適用するには:

  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
    
1
user121391