zfs send コマンドを実行すると、スナップショットのストリーム表現が作成され、標準出力に書き込まれます。デフォルトでは、完全なストリームが生成されます。この出力は、ファイルまたは別のシステムにリダイレクトできます。zfs receive コマンドを実行すると、ストリームに内容が指定されているスナップショットが作成され、標準入力に渡されます。ストリーム全体を受信する場合、新しいファイルシステムも作成されます。これらのコマンドを使えば、ZFS スナップショットデータを送信したり、ZFS スナップショットデータやファイルシステムを受信したりできます。次の節の例を参照してください。
ZFS データを保存するために、次のバックアップ方法が用意されています。
企業向けバックアップ製品 – 次の機能が必要な場合は、企業向けバックアップソリューションを検討してください。
ファイルごとの復元
バックアップメディアの検証
メディアの管理
ファイルシステムのスナップショットとスナップショットのロールバック – ファイルシステムのコピーを作成して、必要に応じて以前のバージョンのファイルシステムに戻す作業を簡単に実行するには、zfs snapshot および zfs rollback コマンドを使用します。たとえば、以前のバージョンのファイルシステムからファイルを復元するために、この方法を使用できます。
スナップショットの作成およびロールバックの詳細については、「ZFS スナップショットの概要」を参照してください。
スナップショットの保存 – zfs send および zfs receive コマンドを使用して、ZFS スナップショットの送信と受信を行います。スナップショットから次のスナップショットまでの増分変更を保存することができますが、ファイルを個別に復元することはできません。ファイルシステムのスナップショット全体を復元する必要があります。これらのコマンドでは、ZFS データを保存するための完全なバックアップソリューションは提供されません。
リモート複製 – あるシステムのファイルシステムを別のシステムにコピーするには、zfs send および zfs receive コマンドを使用します。この処理は、WAN 経由でデバイスをミラー化する従来のボリューム管理製品とは異なります。特殊な設定やハードウェアは必要ありません。ZFS ファイルシステムを複製する利点は、ファイルシステムを別のシステムのストレージプール上に再作成し、その新しく作成したプールに同じファイルシステムデータを格納しながら RAID-Z などの別の構成レベルを指定できることです。
アーカイブユーティリティー – tar、cpio、pax、サードパーティーバックアップ製品などのアーカイブユーティリティーを使って ZFS データを保存します。現時点では、tar と cpio では NFSv4 方式の ACL を正しく変換できますが、pax では変換できません。
zfs send および zfs receive コマンド以外に、tar や cpio コマンドなどのアーカイブユーティリティーを使用して、ZFS ファイルを保存することもできます。これらのユーティリティーは、ZFS ファイル属性と ACL を保存して復元します。tar コマンドと cpio コマンドの適切なオプションを確認してください。
ZFS およびサードパーティーバックアップ製品に関する問題の最新情報については、『Solaris 10 ご使用にあたって』または次のサイトの ZFS FAQ を参照してください。
http://hub.opensolaris.org/bin/view/Community+Group+zfs/faq/#backupsoftware
zfs send コマンドを使用して、スナップショットストリームのコピーを送信し、バックアップデータの格納に使用する別のプール (同じシステム上または別のシステム上にある) でそのスナップショットストリームを受信することができます。たとえば、別のプール上のスナップショットストリームを同じシステムに送信するには、次のような構文を使用します。
# zfs send tank/data@snap1 | zfs recv spool/ds01 |
zfs receive コマンドの別名として、zfs recv を 使用できます。
スナップショットストリームを別のシステムに送信する場合は、zfs send の出力を ssh コマンドにパイプします。次に例を示します。
host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana |
完全なストリームを送信するときは、対象のファイルシステムが存在してはいけません。
zfs send -i オプションを使用すれば、増分データを送信できます。次に例を示します。
host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana |
最初の引数 (snap1) には、以前のスナップショットを指定します。2 番目の引数 (snap2) には、それよりあとのスナップショットを指定します。この場合は、増分データの受信を正常に行うために newtank/dana ファイルシステムがあらかじめ存在している必要があります。
増分ソース snap1 は、スナップショット名の最後の構成要素だけで指定できます。このショートカットは、snap1 には @ 記号のあとの名前を指定するだけでよいことを意味し、この場合 snap1 は snap2 と同じファイルシステムから作成されたものと見なされます。次に例を示します。
host1# zfs send -i snap1 tank/dana@snap2 > ssh host2 zfs recv newtank/dana |
このショートカット構文は、前の例の増分構文と同等です。
異なるファイルシステム snapshot1 から増分ストリームを生成しようとすると、次のメッセージが表示されます。
cannot send 'pool/fs@name': not an earlier snapshot from the same fs |
多数のコピーを保管する必要がある場合は、gzip コマンドを使って ZFS スナップショットのストリーム表現を圧縮することを検討してください。次に例を示します。
# zfs send pool/fs@snap | gzip > backupfile.gz |
ファイルシステムのスナップショットを受信するときは、次の重要な点に留意してください。
スナップショットとファイルシステムの両方が受信されます。
ファイルシステムとその子孫のすべてのファイルシステムがマウント解除されます。
ファイルシステムが受信されている間は、それらにアクセスできません。
受信される元のファイルシステムは、その転送中に存在してはいけません。
ファイルシステム名がすでに存在する場合は、zfs rename コマンドを使ってファイルシステムの名前を変更できます。
次に例を示します。
# zfs send tank/gozer@0830 > /bkups/gozer.083006 # zfs receive tank/gozer2@today < /bkups/gozer.083006 # zfs rename tank/gozer tank/gozer.old # zfs rename tank/gozer2 tank/gozer |
対象のファイルシステムに変更を加え、新たに増分スナップショットを送信する場合は、まず受信側のファイルシステムをロールバックする必要があります。
次のような例を考えます。まず、次のようにファイルシステムに変更を加えます。
host2# rm newtank/dana/file.1 |
次に、tank/dana@snap3 の増分を送信します。ただし、新しい増分スナップショットを受信するには、まず受信側のファイルシステムをロールバックする必要があります。または、-F オプションを使用すれば、ロールバック手順を実行する必要がなくなります。次に例を示します。
host1# zfs send -i tank/dana@snap2 tank/dana@snap3 | ssh host2 zfs recv -F newtank/dana |
増分スナップショットを受信するときは、対象のファイルシステムが存在している必要があります。
ファイルシステムに変更を加えたあとで、新しい増分スナップショットを受信するために受信側のファイルシステムのロールバックを行わない場合、または -F オプションを使用しない場合は、次のようなメッセージが表示されます。
host1# zfs send -i tank/dana@snap4 tank/dana@snap5 | ssh host2 zfs recv newtank/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 send -I および -R オプションを使用して、より複雑なスナップショットストリームを送受信する方法について説明します。
複雑な ZFS スナップショットストリームを送受信するときは、次の点に留意してください。
1 つのスナップショットのすべての増分ストリームを累積スナップショットに送信する場合は、zfs send -I オプションを使用します。または、元のスナップショットからの増分ストリームを送信してクローンを作成する場合にも、このオプションを使用します。増分ストリームを受け入れるには、元のスナップショットが受信側にすでに存在している必要があります。
すべての子孫ファイルシステムの複製ストリームを送信する場合は、zfs send -R オプションを使用します。複製ストリームの受信時には、すべてのプロパティー、スナップショット、下位ファイルシステム、およびクローンが維持されます。
増分複製ストリームを送信するには、両方のオプションを使用します。
プロパティーの変更は保持され、スナップショットおよびファイルシステムの rename 操作と destroy 操作も保持されます。
複製ストリームの受信時に zfs recv -F が指定されていない場合、データセットの destroy 操作は無視されます。この場合の zfs recv -F 構文は、「必要に応じてロールバックする」という意味も持っています。
(zfs send -R ではない) ほかの -i または -I の場合と同様に、-I を使用すると、snapA から snapD までのすべてのスナップショットが送信されます。-i を使用すると、(すべての子孫の) snapD だけが送信されます。
このような新しい種類の zfs send ストリームを受信するには、そのストリームを送信できるソフトウェアバージョンが受信側のシステムで稼働している必要があります。ストリームのバージョンは 1 増やされています。
ただし、新しいソフトウェアバージョンを使用して古いプールバージョンのストリームにアクセスすることはできます。たとえば、新しいオプションで作成されたストリームを、バージョン 3 プールに対して送受信することができます。ただし、新しいオプションで送信されたストリームを受信するには、最近のソフトウェアが稼働している必要があります。
zfs send -I オプションを使用すると、一連の増分スナップショットを結合して 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 - |
zfs send -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 send -R コマンドを使用すると、ZFS ファイルシステムおよび指定されたスナップショットまでのすべての子孫ファイルシステムを複製できます。このストリームの受信時には、すべてのプロパティー、スナップショット、子孫ファイルシステム、およびクローンが維持されます。
次の例では、ユーザーのファイルシステムのスナップショットが作成されます。すべてのユーザースナップショットから 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 - |
次の例では、zfs send -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 tank/cindy@today | ssh newsys zfs recv sandbox/restfs@today |
このコマンドは、tank/cindy@today スナップショットのデータを送信し、そのデータを sandbox/restfs ファイルシステムに受信します。このコマンドは、restfs@today スナップショットを newsys システム上にも作成します。この例のユーザーは、リモートシステム上で ssh を使用するように設定されています。