この節では、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 を使用するように設定されています。