zfs send コマンドを実行すると、スナップショットのストリーム表現が作成され、標準出力に書き込まれます。デフォルトでは、完全なストリームが生成されます。この出力は、ファイルまたは別のシステムにリダイレクトできます。zfs receive コマンドを実行すると、ストリームに内容が指定されているスナップショットが作成され、標準入力に渡されます。ストリーム全体を受信する場合、新しいファイルシステムも作成されます。ZFS スナップショットデータを送信したり、ZFS スナップショットデータやファイルシステムを受信したりすることもできます。
さらに、このリリースでは ZFS データの転送を再開する機能が組み込まれています。特に、ネットワーク障害またはシステム障害が原因で大量の ZFS データの転送が中断されることがあります。すべてのデータを再送信しなければならない事態を避けるため、zfs send および zfs receive コマンドに、ZFS データの送信を再開するための –C オプションを付けて実行できます。詳細は、再開可能レプリケーションの使用を参照してください。
このセクションの内容は次のとおりです。
ZFS データを保存する際は、次のバックアップ解決策に注意してください。
企業向けバックアップ製品 –これらの製品には、次のような機能が備わっています。
ファイルごとのレプリケーション
バックアップメディアの検証
メディアの管理
ファイルシステムのスナップショットとスナップショットのロールバック - ファイルシステムのコピーを作成し、必要に応じて、以前のファイルシステムバージョンに戻します。
スナップショットの作成およびロールバックの詳細については、ZFS スナップショットの概要を参照してください。
スナップショットの保存 – zfs send および zfs receive コマンドを使用すると、スナップショット間の増分変更を保存できますが、ファイルを個別に復元することはできません。ファイルシステムのスナップショット全体を復元する必要があります。
リモートレプリケーション – あるシステムから別のシステムにファイルシステムをコピーします。この処理は、WAN 経由でデバイスをミラー化する従来のボリューム管理製品とは異なります。特殊な構成やハードウェアは必要ありません。zfs send および zfs receive コマンドを使用して ZFS ファイルシステムをレプリケートすると、ファイルシステムを別のシステムのストレージプール上に再作成し、その新しく作成したプールに同じファイルシステムデータを格納しながら、RAID-Z などの別の構成レベルを指定できます。
アーカイブユーティリティー - tar、cpio、pax、サードパーティーバックアップ製品などのアーカイブユーティリティーを使って ZFS データを保存します。現時点では、tar と cpio では NFSv4 方式の ACL を正しく変換できますが、pax では変換できません。
zfs send および zfs receive コマンド以外に、tar や cpio コマンドなどのアーカイブユーティリティーを使用して、ZFS ファイルを保存することもできます。これらのユーティリティーは、ZFS ファイル属性と ACL を保存して復元します。tar コマンドと cpio コマンドの適切なオプションを確認してください。
zfs send コマンドを使用して、1 つ以上のスナップショットのストリームを作成できます。続いて、zfs receive コマンドを使用することにより、このスナップショットストリームを使用して、ZFS ファイルシステムまたはボリュームを再作成できます。
スナップショットストリームを作成する際に使用された zfs send オプションによって、生成されるストリーム形式のタイプが決まります。
完全なストリーム – データセットが作成された時間から指定されたスナップショットまで、すべてのデータセットの内容から構成されます。
zfs send コマンドで生成されたデフォルトのストリームが完全なストリームです。これには、1 つのファイルシステムまたはボリュームから指定されたスナップショットまで含まれます。ストリームには、コマンドで指定されたスナップショット以外のスナップショットは含まれません。
増分ストリーム – あるスナップショットと別のスナップショットの差から構成されます。
ストリームパッケージとは、1 つ以上の完全ストリームまたは増分ストリームを含むストリームタイプです。ストリームパッケージのタイプには、次のものがあります。
レプリケーションストリームパッケージ - 指定したデータセットとその子孫で構成されます。すべての中間スナップショットを含みます。クローンの作成元であるデータセットがコマンド行で指定されたスナップショットの子孫でない場合は、この作成元のデータセットがストリームパッケージに含まれません。ストリームを受信するには、元のデータセットが受信先のストレージプールに存在する必要があります。
次に示すデータセットとそれらの作成元の一覧が、表示される順序で作成されたと仮定します。
NAME ORIGIN pool/a - pool/a/1 - pool/a/1@clone - pool/b - pool/b/1 pool/a/1@clone pool/b/1@clone2 - pool/b/2 pool/b/1@clone2 pool/b@pre-send - pool/b/1@pre-send - pool/b/2@pre-send - pool/b@send - pool/b/1@send - pool/b/2@send -
次の構文を使用して、レプリケーションストリームパッケージが作成されたと仮定します。
# zfs send -R pool/b@send ....
このパッケージは、次の完全ストリームおよび増分ストリームで構成されます。
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@pre-send - incr pool/b@send pool/b@pre-send incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@pre-send pool/b/1@clone2 incr pool/b/1@send pool/b/1@send incr pool/b/2@pre-send pool/b/1@clone2 incr pool/b/2@send pool/b/2@pre-send
この出力では、レプリケーションストリームパッケージに pool/a/1@clone スナップショットが含まれていません。したがって、このレプリケーションストリームパッケージは、すでに pool/a/1@clone スナップショットがあるプールでのみ受信できます。
再帰的ストリームパッケージ – 指定したデータセットとその子孫で構成されます。複製ストリームパッケージとは異なり、ストリームに含まれる複製されたデータセットの複製元でないかぎり、中間スナップショットは含まれません。デフォルトでは、データセットの作成元がコマンドで指定されたスナップショットの子孫でない場合の動作は、レプリケーションストリームと同様です。自己完結型の再帰的ストリームは、外部の依存関係を持たないことに注意してください。
再帰的ストリームパッケージを作成するには、次の例のような構文を使用します。
# zfs send -r pool/b@send ...
このパッケージ例は、次の完全ストリームおよび増分ストリームで構成されます。
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
この出力では、再帰的ストリームパッケージに pool/a/1@clone スナップショットが含まれていません。したがって、レプリケーションストリームパッケージと同様に、この再帰的ストリームパッケージは、すでに pool/a/1@clone スナップショットがあるプールでのみ受信できます。この動作は、前述の複製ストリームパッケージの場合と似ています。
自己完結型の再帰的ストリームパッケージ - このタイプのパッケージは、ストリームパッケージに含まれないどのデータセットにも依存しません。再帰的ストリームパッケージを作成するには、次の例のような構文を使用します。
# zfs send -rc pool/b@send ...
このパッケージ例は、次の完全ストリームおよび増分ストリームで構成されます。
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - full pool/b/1@clone2 incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
このような自己完結型の再帰的ストリームは、pool/b/1@clone2 スナップショットの完全なストリームを含んでいるため、外的な依存関係なしに pool/b/1 スナップショットを受信できます。
zfs send コマンドを使用して、スナップショットストリームのコピーを送信し、バックアップデータの格納に使用する別のプール (同じシステム上または別のシステム上にある) でそのスナップショットストリームを受信することができます。たとえば、異なるプール上のスナップショットストリームを同じシステムに送信するには、次の例のようなコマンドを使用します。
# zfs send ool/dana@snap1 | zfs recv spool/ds01
スナップショットストリームを別のシステムに送信する場合は、zfs send の出力を ssh コマンドにパイプします。例:
sys1# zfs send ool/dana@snap1 | ssh sys2 zfs recv pool/dana
完全なストリームを送信するときは、対象のファイルシステムが存在してはいけません。
多数のコピーを保管する必要がある場合は、gzip コマンドを使って ZFS スナップショットのストリーム表現を圧縮することを検討してください。例:
# zfs send pool/fs@snap | gzip > backupfile.gz使用例 38 増分 ZFS データを送信する
zfs send –i オプションを使用すれば、増分データを送信できます。例:
sys1# zfs send -i ool/dana@snap1 system1/dana@snap2 | ssh system2 zfs recv ool/dana
最初の引数 (snap1) は以前のスナップショットで、2 番目の引数 (snap2) はそれよりあとのスナップショットです。この場合は、増分データの受信を正常に行うために ool/dana ファイルシステムがすでに存在している必要があります。
増分ソース snap1 は、スナップショット名の最後のコンポーネントとして指定できます。その後、snap1 には @ 記号のあとの名前のみを指定する必要があります。これにより、snap2 と同じファイルシステムから作成されたものと見なされます。例:
sys1# zfs send -i snap1 ool/dana@snap2 | ssh system2 zfs recv ool/dana
このショートカット構文は、増分構文と同等です。
異なるファイルシステム snapshot1 から増分ストリームを生成しようとすると、次のメッセージが表示されます。
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
元の受信側ファイルシステム内のファイル情報にアクセスすると、増分スナップショットの受信操作が失敗して、次のようなメッセージが表示される可能性があります。
cannot receive incremental stream of pool/dana@snap2 into pool/dana: most recent snapshot of pool/dana@snap2 does not match incremental source
元の受信側ファイルシステム内のファイル情報にアクセスする必要がある場合で、増分スナップショットを受信側ファイルシステムで受信する必要もある場合は、atime プロパティーを off に設定することを考慮してください。
多数のコピーを保管する必要がある場合は、gzip コマンドを使って ZFS スナップショットのストリーム表現を圧縮することを検討してください。例:
# zfs send pool/fs@snap | gzip > backupfile.gz使用例 39 Oracle Solaris 12.0 データセットから ZFS データを送信する
出力データストリーム内でレコード単位のチェックサムを使用する機能は、デフォルトで使用可能になっています。データを古いシステムに転送するには、nocheck 引数を使用してこの機能を無効にする必要があります。
# zfs send -s nocheck pool/dana@snap1 | zfs recv pool/ds01
zfs receive を使用したデータの転送が中断された場合、プロセスを再開できます。たとえば、このコマンドで転送を開始したとします。
system1# zfs send pool/dana@snap1 | ssh system2 zfs recv pool/dana
転送が中断された場合、データセットが不完全になります。次の一連のコマンドを使用して転送を再開できます。
system1# ssh system2 zfs receive -C pool/dana | zfs send -C pool/dana@snap1 | \ ssh system2 zfs receive pool/dana
不完全なデータセットを表示するには、zfs list –I コマンドを使用します。不完全な ZFS データセットを一覧表示するを参照してください。
ファイルシステムスナップショットを作成するときは、次のキーポイントに注意してください。
スナップショットとファイルシステムの両方が受信されます。
ファイルシステムとその子孫のすべてのファイルシステムがアンマウントされます。
ファイルシステムが受信されている間は、それらにアクセスできません。
ターゲットシステム上に、受信されるソースファイルシステムと同じ名前を持つファイルシステムが存在してはいけません。ターゲットシステム上にファイルシステム名がすでに存在する場合は、ファイルシステム名を変更してください。
例:
# zfs send system1/gozer@0830 > /bkups/gozer.083006 # zfs receive system1/gozer2@today < /bkups/gozer.083006 # zfs rename system1/gozer system1/gozer.old # zfs rename system1/gozer2 system1/gozer
対象のファイルシステムに変更を加え、新たに増分スナップショットを送信する場合は、まず受信側のファイルシステムをロールバックする必要があります。
次のような例を考えます。まず、次のようにファイルシステムに変更を加えます。
sys2# rm newsys/dana/file.1
次に、system1/dana@snap3 の増分送信を実行します。新しい増分スナップショットを受信したり、–F オプションを使用してロールバック手順を排除したりするには、まず受信側のファイルシステムをロールバックする必要があります。例:
sys1# zfs send -i system1/dana@snap2 system1/dana@snap3 | ssh sys2 zfs recv -F newsys/dana
増分スナップショットを受信するときは、対象のファイルシステムが存在している必要があります。
ファイルシステムに変更を加えたあとで、新しい増分スナップショットを受信するために受信側のファイルシステムのロールバックを行わない場合、または –F オプションを使用する場合は、次の例のようなメッセージが表示されます。
sys1# zfs send -i system1/dana@snap4 system1/dana@snap5 | ssh sys2 zfs recv newsys/dana cannot receive: destination has been modified since most recent snapshot
–F オプションが正常に実行される前に、次の検査が行われます。
最新のスナップショットが増分ソースと一致しない場合は、ロールバックも受信も完了せず、エラーメッセージが返される。
zfs receive コマンドで指定された増分ソースと一致しない異なるファイルシステムの名前を間違って指定した場合は、ロールバックも受信も完了せず、次のエラーメッセージが返される。
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
特定のファイルシステムプロパティー値を含む ZFS スナップショットストリームを送信したあとに、スナップショットストリームの受信時に別のローカルプロパティー値を指定するか、またはスナップショットストリームの受信時に元のプロパティー値が使用されるように指定すると、元のファイルシステムを再作成できます。さらに、スナップショットストリームを受信したときにファイルシステムプロパティーを無効にすることもできます。
ローカルのプロパティー値を受信した値 (存在する場合) に戻すには、zfs inherit –S コマンドを使用します。プロパティーに受信した値がない場合、–S オプションの動作は、オプションを付けなかった場合と同じです。プロパティーに受信値が存在する場合、zfs inherit コマンドは、zfs inherit –S コマンドの発行によって継承値が受信値に戻されるまでの間、受信値を継承値でマスクします。
zfs get で表示される列を指定できます。新しい非デフォルトの RECEIVED 列を含めるには、–o オプションを使用します。RECEIVED を含むすべての列を含めるには、–o all オプションを使用します。
–R オプションを使用せずにプロパティーを送信ストリームに含めるには、–p オプションを使用します。
送信されたスナップショット名の最後の要素を使用して新しいスナップショット名を指定するには、–e オプションを使用します。
次の例では、poolA/bee/cee@1 スナップショットを poolD/eee ファイルシステムに送信し、スナップショット名の最後の要素 (cee@1) のみを使用して、受信側のファイルシステムおよびスナップショットを作成します。
# zfs list -rt all poolA NAME USED AVAIL REFER MOUNTPOINT poolA 134K 134G 23K /poolA poolA/bee 44K 134G 23K /poolA/bee poolA/bee/cee 21K 134G 21K /poolA/bee/cee poolA/bee/cee@1 0 - 21K - # zfs send -R poolA/bee/cee@1 | zfs receive -e poolD/eee # zfs list -rt all poolD NAME USED AVAIL REFER MOUNTPOINT poolD 134K 134G 23K /poolD poolD/eee 44K 134G 23K /poolD/eee poolD/eee/cee 21K 134G 21K /poolD/eee/cee poolD/eee/cee@1 0 - 21K -
場合によっては、送信ストリーム内のファイルシステムプロパティーが受信側のファイルシステムに該当しなかったり、mountpoint プロパティー値などのローカルファイルシステムプロパティーが復元を妨害したりすることがあります。
たとえば、system1/data というファイルシステムで compression プロパティーが無効になっていると仮定します。system1/data ファイルシステムのスナップショットが、プロパティー (–p オプション) を指定してバックアッププールに送信され、compression プロパティーが有効な状態で受信されます。
# zfs get compression system1/data NAME PROPERTY VALUE SOURCE system1/data compression off default # zfs snapshot system1/data@snap1 # zfs send -p system1/data@snap1 | zfs recv -o compression=on -d bpool # zfs get -o all compression bpool/data NAME PROPERTY VALUE RECEIVED SOURCE bpool/data compression on off local
この例では、スナップショットが bpool に受信されたとき、compression プロパティーは有効になります。したがって、bpool/data では、compression 値は on です。
このスナップショットストリームが復元目的で restorepool という新規プールに送信される場合、元のスナップショットプロパティーをすべて保持することが必要なことがあります。この場合、元のスナップショットプロパティーを復元するために zfs send –b オプションを使用します。例:
# zfs send -b bpool/data@snap1 | zfs recv -d restorepool # zfs get -o all compression restorepool/data NAME PROPERTY VALUE RECEIVED SOURCE restorepool/data compression off off received
この例では、compression 値は off です。これは、元の system1/data ファイルシステムからのスナップショット圧縮値を表します。
スナップショットストリーム内にローカルファイルシステムのプロパティー値があり、スナップショットストリームを受信したときにこのプロパティーを無効にする場合、zfs receive –x オプションを使用します。たとえば次のコマンドでは、すべてのファイルシステムプロパティーを予約した状態で home ディレクトリファイルシステムの再帰的なスナップショットストリームをバックアッププールに送信しますが、割り当て制限プロパティー値は設定されません。
# zfs send -R system1/home@snap1 | zfs recv -x quota bpool/home # zfs get -r quota bpool/home NAME PROPERTY VALUE SOURCE bpool/home quota none local bpool/home@snap1 quota - - bpool/home/lori quota none default bpool/home/lori@snap1 quota - - bpool/home/mark quota none default bpool/home/mark@snap1 quota - -
再帰的なスナップショットが –x オプションで受信されなかった場合、割り当て制限プロパティーは受信側ファイルシステム内で設定されます。
# zfs send -R system1/home@snap1 | zfs recv bpool/home # zfs get -r quota bpool/home NAME PROPERTY VALUE SOURCE bpool/home quota none received bpool/home@snap1 quota - - bpool/home/lori quota 10G received bpool/home/lori@snap1 quota - - bpool/home/mark quota 10G received bpool/home/mark@snap1 quota - -
このセクションでは、–I および –R オプションを zfs send コマンドに使用して、より複雑なスナップショットストリームを送受信する方法について説明します。
複雑な ZFS スナップショットストリームを送受信するときは、次の点に留意してください。
1 つのスナップショットのすべての増分ストリームを累積スナップショットに送信するには、–I オプションを使用します。このオプションを使用すると、元のスナップショットからの増分ストリームを送信して、クローンを作成することもできます。増分ストリームを受け入れるには、元のスナップショットが受信側にすでに存在している必要があります。
すべての子孫ファイルシステムのレプリケーションストリームを送信するには、–R オプションを使用します。レプリケーションストリームが受信されると、すべてのプロパティー、スナップショット、子孫ファイルシステム、およびクローンが保持されます。
–c オプションを付けずに zfs send –r コマンドまたは zfs send –R コマンドを使用してパッケージストリームを送信すると、一部の状況ではクローンの origin が省略されます。詳細は、ZFS スナップショットストリームのタイプを参照してください。
増分複製ストリームを送信するには、両方のオプションを使用します。
プロパティーの変更は保持され、スナップショットおよびファイルシステムの rename 操作と destroy 操作も保持されます。
レプリケーションストリームの受信時に –F オプションが指定されていない場合、データセットの destroy 操作は無視されます。したがって、必要に応じて、受信操作を取り消して、ファイルシステムを以前の状態に復元できます。
増分ストリームを送信するときに –I を使用すると、snapA と snapD 間のすべてのスナップショットが送信されます。–i を使用すると、(すべての子孫の) snapD スナップショットのみが送信されます。
このようなタイプの zfs send ストリームを受信するには、そのストリームを送信できるソフトウェアバージョンが受信側のシステムで動作している必要があります。ストリームのバージョンは 1 増やされています。
–I オプションを使用すると、増分スナップショットの A グループを結合して 1 つのスナップショットを作成できます。例:
# zfs send -I pool/fs@snapA pool/fs@snapD > /snaps/fs@all-I
次に、増分スナップショット snapB、snapC、および snapD を削除します。
# zfs destroy pool/fs@snapB # zfs destroy pool/fs@snapC # zfs destroy pool/fs@snapD
結合されたスナップショットを受信するには、次のコマンドを使用します。
# zfs receive -d -F pool/fs < /snaps/fs@all-I # zfs list NAME USED AVAIL REFER MOUNTPOINT pool 428K 16.5G 20K /pool pool/fs 71K 16.5G 21K /pool/fs pool/fs@snapA 16K - 18.5K - pool/fs@snapB 17K - 20K - pool/fs@snapC 17K - 20.5K - pool/fs@snapD 0 - 21K -
–I コマンドを使用すると、スナップショットとクローンスナップショットを結合して、結合されたデータセットを作成することもできます。例:
# zfs create pool/fs # zfs snapshot pool/fs@snap1 # zfs clone pool/fs@snap1 pool/clone # zfs snapshot pool/clone@snapA # zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I # zfs destroy pool/clone@snapA # zfs destroy pool/clone # zfs receive -F pool/clone < /snaps/fsclonesnap-I
ZFS ファイルシステムおよびすべての子孫ファイルシステムを指定されたスナップショットまでレプリケートするには、–R オプションを使用します。このストリームが受信されると、すべてのプロパティー、スナップショット、子孫ファイルシステム、およびクローンが保持されます。
次の例では、ユーザーファイルシステムのスナップショットを作成します。すべてのユーザースナップショットから 1 つの複製ストリームが作成されます。次に、元のファイルシステムおよびスナップショットが破棄されてから回復されます。
# zfs snapshot -r users@today # zfs list NAME USED AVAIL REFER MOUNTPOINT users 187K 33.2G 22K /users users@today 0 - 22K - users/user1 18K 33.2G 18K /users/user1 users/user1@today 0 - 18K - users/user2 18K 33.2G 18K /users/user2 users/user2@today 0 - 18K - users/user3 18K 33.2G 18K /users/user3 users/user3@today 0 - 18K - # zfs send -R users@today > /snaps/users-R # zfs destroy -r users # zfs receive -F -d users < /snaps/users-R # zfs list NAME USED AVAIL REFER MOUNTPOINT users 196K 33.2G 22K /users users@today 0 - 22K - users/user1 18K 33.2G 18K /users/user1 users/user1@today 0 - 18K - users/user2 18K 33.2G 18K /users/user2 users/user2@today 0 - 18K - users/user3 18K 33.2G 18K /users/user3 users/user3@today 0 - 18K -
次の例では、–R コマンドを使用して、users ファイルシステムとその子孫をレプリケートし、レプリケートしたストリームを別のプール users2 に送信します。
# zfs create users2 mirror c0t1d0 c1t1d0 # zfs receive -F -d users2 < /snaps/users-R # zfs list NAME USED AVAIL REFER MOUNTPOINT users 224K 33.2G 22K /users users@today 0 - 22K - users/user1 33K 33.2G 18K /users/user1 users/user1@today 15K - 18K - users/user2 18K 33.2G 18K /users/user2 users/user2@today 0 - 18K - users/user3 18K 33.2G 18K /users/user3 users/user3@today 0 - 18K - users2 188K 16.5G 22K /users2 users2@today 0 - 22K - users2/user1 18K 16.5G 18K /users2/user1 users2/user1@today 0 - 18K - users2/user2 18K 16.5G 18K /users2/user2 users2/user2@today 0 - 18K - users2/user3 18K 16.5G 18K /users2/user3 users2/user3@today 0 - 18K -
zfs send および zfs recv コマンドを使用して、あるシステムのスナップショットのストリーム表現を別のシステムにリモートでコピーできます。例:
# zfs send system1/cindy@today | ssh newsys zfs recv sandbox/restfs@today
このコマンドは、system1/cindy@today スナップショットのデータを送信し、そのデータを sandbox/restfs ファイルシステムに受信します。このコマンドは、restfs@today スナップショットを newsys システム上にも作成します。この例のユーザーは、リモートシステム上で ssh を使用するように構成されています。