Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ZFS-SEND(8)		    System Manager's Manual		   ZFS-SEND(8)

NAME
       zfs-send	-- generate backup stream of ZFS dataset

SYNOPSIS
       zfs     send	[-DLPVbcehnpsvw]     [-R    [-X	   dataset[,dataset]]]
	   [[-I|-i] snapshot] snapshot
       zfs	 send	    [-DLPVcensvw]	 [-i	    snapshot|bookmark]
	   filesystem|volume|snapshot
       zfs	 send	    --redact	  redaction_bookmark	  [-DLPVcenpv]
	   [-i snapshot|bookmark] snapshot
       zfs send	[-PVenv] -t receive_resume_token
       zfs send	[-PVnv]	-S filesystem
       zfs redact snapshot redaction_bookmark redaction_snapshot

DESCRIPTION
       zfs  send  [-DLPVbcehnpsvw]  [-R	  [-X	dataset[,dataset]]]   [[-I|-i]
	 snapshot] snapshot
	 Creates  a  stream  representation  of	 the second snapshot, which is
	 written to standard output.  The output can be	redirected to  a  file
	 or  to	a different system (for	example, using ssh(1)).	 By default, a
	 full stream is	generated.

	 -D, --dedup
	     Deduplicated send is no longer supported.	This flag is  accepted
	     for  backwards  compatibility,  but  a  regular, non-deduplicated
	     stream will be generated.

	 -I snapshot
	     Generate a	stream package that sends all  intermediary  snapshots
	     from  the first snapshot to the second snapshot.  For example, -I
	     @a	fs@d is	similar	to -i @a fs@b; -i @b fs@c; -i  @c  fs@d.   The
	     incremental source	may be specified as with the -i	option.

	 -L, --large-block
	     Generate  a  stream which may contain blocks larger than 128 KiB.
	     This flag has no effect if	the large_blocks pool feature is  dis-
	     abled, or if the recordsize property of this filesystem has never
	     been  set	above  128  KiB.   The	receiving system must have the
	     large_blocks pool feature enabled as well.	 This flag is required
	     if	  the	large_microzap	 pool	feature	  is   active.	   See
	     zpool-features(7)	for  details  on  ZFS  feature	flags  and the
	     large_blocks feature.

	 -P, --parsable
	     Print machine-parsable verbose information	about the stream pack-
	     age generated.

	 -R, --replicate
	     Generate a	replication stream package, which will	replicate  the
	     specified file system, and	all descendent file systems, up	to the
	     named  snapshot.	When  received,	all properties,	snapshots, de-
	     scendent file systems, and	clones are preserved.

	     If	the -i or -I flags are used in conjunction with	the  -R	 flag,
	     an	incremental replication	stream is generated.  The current val-
	     ues of properties,	and current snapshot and file system names are
	     set  when	the  stream  is	received.  If the -F flag is specified
	     when this stream is received, snapshots and file systems that  do
	     not  exist	 on the	sending	side are destroyed.  If	the -R flag is
	     used to send encrypted datasets, then -w must also	be specified.

	 -V, --proctitle
	     Set the process title to a	per-second report of how much data has
	     been sent.

	 -X, --exclude dataset[,dataset]
	     With -R, -X specifies a set of datasets (and,  hence,  their  de-
	     scendants),  to  be  excluded  from  the  send  stream.  The root
	     dataset may not be	excluded.  -X a	-X b is	equivalent to -X a,b.

	 -e, --embed
	     Generate a	more compact stream by	using  WRITE_EMBEDDED  records
	     for  blocks  which	 are  stored  more  compactly  on  disk	by the
	     embedded_data pool	feature.  This	flag  has  no  effect  if  the
	     embedded_data  feature  is	 disabled.   The receiving system must
	     have the embedded_data feature enabled.  If the  lz4_compress  or
	     zstd_compress features are	active on the sending system, then the
	     receiving	system must have the corresponding features enabled as
	     well.  Datasets that are sent with	this flag may not be  received
	     as	 an encrypted dataset, since encrypted datasets	cannot use the
	     embedded_data feature.  See zpool-features(7) for details on  ZFS
	     feature flags and the embedded_data feature.

	 -b, --backup
	     Sends only	received property values whether or not	they are over-
	     ridden  by	 local settings, but only if the dataset has ever been
	     received.	Use this option	when you want zfs receive  to  restore
	     received  properties  backed  up on the sent dataset and to avoid
	     sending local settings that may  have  nothing  to	 do  with  the
	     source dataset, but only with how the data	is backed up.

	 -c, --compressed
	     Generate  a more compact stream by	using compressed WRITE records
	     for blocks	which are compressed on	disk and in  memory  (see  the
	     compression  property  for	 details).   If	 the  lz4_compress  or
	     zstd_compress features are	active on the sending system, then the
	     receiving system must have	the corresponding features enabled  as
	     well.  If the large_blocks	feature	is enabled on the sending sys-
	     tem  but  the  -L	option is not supplied in conjunction with -c,
	     then the data will	be decompressed	before sending so  it  can  be
	     split  into  smaller  block sizes.	 Streams sent with -c will not
	     have their	data  recompressed  on	the  receiver  side  using  -o
	     compress=	value.	 The  data will	stay compressed	as it was from
	     the sender.  The new compression property will be set for	future
	     data.  Note that uncompressed data	from the sender	will still at-
	     tempt  to	compress  on  the  receiver,  unless  you  specify  -o
	     compress= off.

	 -w, --raw
	     For encrypted datasets, send data exactly as it exists  on	 disk.
	     This  allows  backups to be taken even if encryption keys are not
	     currently loaded.	The backup may then  be	 received  on  an  un-
	     trusted  machine  since that machine will not have	the encryption
	     keys to read the protected	data or	alter  it  without  being  de-
	     tected.   Upon being received, the	dataset	will have the same en-
	     cryption  keys  as	 it  did  on  the  send	 side,	although   the
	     keylocation property will be defaulted to prompt if not otherwise
	     provided.	For unencrypted	datasets, this flag will be equivalent
	     to	 -Lec.	 Note that if you do not use this flag for sending en-
	     crypted datasets, data will be sent unencrypted and may be	re-en-
	     crypted with a different encryption key on	the receiving  system,
	     which  will  disable  the ability to do a raw send	to that	system
	     for incrementals.

	 -h, --holds
	     Generate a	stream package that includes any snapshot holds	 (cre-
	     ated  with	 the  zfs hold command), and indicating	to zfs receive
	     that the holds be applied to the dataset on the receiving system.

	 -i snapshot
	     Generate an incremental  stream  from  the	 first	snapshot  (the
	     incremental  source)  to  the  second  snapshot  (the incremental
	     target).  The incremental source can be  specified	 as  the  last
	     component	of  the	 snapshot name (the @ character	and following)
	     and it is assumed to be from the same file	system as  the	incre-
	     mental target.

	     If	the destination	is a clone, the	source may be the origin snap-
	     shot, which must be fully specified (for example, pool/fs@origin,
	     not just @origin).

	 -n, --dryrun
	     Do	 a  dry-run  ("No-op")	send.  Do not generate any actual send
	     data.  This is useful in conjunction with the -v or -P  flags  to
	     determine what data will be sent.	In this	case, the verbose out-
	     put   will	 be  written  to  standard  output  (contrast  with  a
	     non-dry-run, where	the stream is written to standard  output  and
	     the verbose output	goes to	standard error).

	 -p, --props
	     Include the dataset's properties in the stream.  This flag	is im-
	     plicit when -R is specified.  The receiving system	must also sup-
	     port  this	feature.  Sends	of encrypted datasets must use -w when
	     using this	flag.

	 -s, --skip-missing
	     Allows sending a replication stream even when there are snapshots
	     missing in	the hierarchy.	When a snapshot	is missing, instead of
	     throwing an error and aborting the	send, a	warning	is printed  to
	     the standard error	stream and the dataset to which	it belongs and
	     its  descendants are skipped.  This flag can only be used in con-
	     junction with -R.

	 -v, --verbose
	     Print verbose information about  the  stream  package  generated.
	     This  information	includes  a per-second report of how much data
	     has been sent.  The same  report  can  be	requested  by  sending
	     SIGINFO or	SIGUSR1, regardless of -v.

	     The  format  of the stream	is committed.  You will	be able	to re-
	     ceive your	streams	on future versions of ZFS.

       zfs send	[-DLPVcenvw] [-i snapshot|bookmark] filesystem|volume|snapshot
	 Generate a send stream, which may be of a filesystem, and may be  in-
	 cremental  from  a  bookmark.	 If the	destination is a filesystem or
	 volume, the pool must be read-only, or	the  filesystem	 must  not  be
	 mounted.   When  the  stream generated	from a filesystem or volume is
	 received, the default snapshot	name will be "--head--".

	 -D, --dedup
	     Deduplicated send is no longer supported.	This flag is  accepted
	     for  backwards  compatibility,  but  a  regular, non-deduplicated
	     stream will be generated.

	 -L, --large-block
	     Generate a	stream which may contain blocks	larger than  128  KiB.
	     This  flag	has no effect if the large_blocks pool feature is dis-
	     abled, or if the recordsize property of this filesystem has never
	     been set above 128	KiB.   The  receiving  system  must  have  the
	     large_blocks pool feature enabled as well.	 See zpool-features(7)
	     for details on ZFS	feature	flags and the large_blocks feature.

	 -P, --parsable
	     Print machine-parsable verbose information	about the stream pack-
	     age generated.

	 -c, --compressed
	     Generate  a more compact stream by	using compressed WRITE records
	     for blocks	which are compressed on	disk and in  memory  (see  the
	     compression  property  for	 details).   If	 the  lz4_compress  or
	     zstd_compress features are	active on the sending system, then the
	     receiving system must have	the corresponding features enabled  as
	     well.  If the large_blocks	feature	is enabled on the sending sys-
	     tem  but  the  -L	option is not supplied in conjunction with -c,
	     then the data will	be decompressed	before sending so  it  can  be
	     split into	smaller	block sizes.

	 -w, --raw
	     For  encrypted  datasets, send data exactly as it exists on disk.
	     This allows backups to be taken even if encryption	keys  are  not
	     currently	loaded.	  The  backup  may  then be received on	an un-
	     trusted machine since that	machine	will not have  the  encryption
	     keys  to  read  the  protected data or alter it without being de-
	     tected.  Upon being received, the dataset will have the same  en-
	     cryption	keys  as  it  did  on  the  send  side,	 although  the
	     keylocation property will be defaulted to prompt if not otherwise
	     provided.	For unencrypted	datasets, this flag will be equivalent
	     to	-Lec.  Note that if you	do not use this	flag for  sending  en-
	     crypted datasets, data will be sent unencrypted and may be	re-en-
	     crypted  with a different encryption key on the receiving system,
	     which will	disable	the ability to do a raw	send  to  that	system
	     for incrementals.

	 -e, --embed
	     Generate  a  more	compact	stream by using	WRITE_EMBEDDED records
	     for blocks	which  are  stored  more  compactly  on	 disk  by  the
	     embedded_data  pool  feature.   This  flag	 has  no effect	if the
	     embedded_data feature is disabled.	  The  receiving  system  must
	     have  the	embedded_data feature enabled.	If the lz4_compress or
	     zstd_compress features are	active on the sending system, then the
	     receiving system must have	the corresponding features enabled  as
	     well.   Datasets that are sent with this flag may not be received
	     as	an encrypted dataset, since encrypted datasets cannot use  the
	     embedded_data  feature.  See zpool-features(7) for	details	on ZFS
	     feature flags and the embedded_data feature.

	 -i snapshot|bookmark
	     Generate an incremental send stream.  The incremental source must
	     be	an earlier snapshot in the  destination's  history.   It  will
	     commonly be an earlier snapshot in	the destination's file system,
	     in	 which	case  it can be	specified as the last component	of the
	     name (the # or @ character	and following).

	     If	the incremental	target is a clone, the incremental source  can
	     be	 the  origin  snapshot,	or an earlier snapshot in the origin's
	     filesystem, or the	origin's origin, etc.

	 -n, --dryrun
	     Do	a dry-run ("No-op") send.  Do not  generate  any  actual  send
	     data.   This  is useful in	conjunction with the -v	or -P flags to
	     determine what data will be sent.	In this	case, the verbose out-
	     put  will	be  written  to	 standard  output  (contrast  with   a
	     non-dry-run,  where  the stream is	written	to standard output and
	     the verbose output	goes to	standard error).

	 -v, --verbose
	     Print verbose information about  the  stream  package  generated.
	     This  information	includes  a per-second report of how much data
	     has been sent.  The same  report  can  be	requested  by  sending
	     SIGINFO or	SIGUSR1, regardless of -v.

       zfs     send	--redact     redaction_bookmark	   [-DLPVcenpv]	   [-i
	 snapshot|bookmark] snapshot
	 Generate a redacted send  stream.   This  send	 stream	 contains  all
	 blocks	 from  the  snapshot  being  sent  that	aren't included	in the
	 redaction list	contained in the bookmark specified  by	 the  --redact
	 (or  -d) flag.	 The resulting send stream is said to be redacted with
	 respect to the	snapshots the bookmark specified by the	--redact  flag
	 was created with.  The	bookmark must have been	created	by running zfs
	 redact	on the snapshot	being sent.

	 This  feature	can be used to allow clones of a filesystem to be made
	 available on a	remote system, in the case where their parent need not
	 (or needs to not) be usable.  For example, if a  filesystem  contains
	 sensitive  data, and it has clones where that sensitive data has been
	 secured or replaced with dummy	data, redacted sends can  be  used  to
	 replicate the secured data without replicating	the original sensitive
	 data,	while  still sharing all possible blocks.  A snapshot that has
	 been redacted with respect to a set of	 snapshots  will  contain  all
	 blocks	 referenced by at least	one snapshot in	the set, but will con-
	 tain none of the blocks referenced by none of the  snapshots  in  the
	 set.	In  other  words,  if all snapshots in the set have modified a
	 given block in	the parent, that block will not	be sent; but if	one or
	 more snapshots	have not modified a block in  the  parent,  they  will
	 still reference the parent's block, so	that block will	be sent.  Note
	 that only user	data will be redacted.

	 When  the  redacted  send  stream  is	received,  we  will generate a
	 redacted snapshot.  Due  to  the  nature  of  redaction,  a  redacted
	 dataset can only be used in the following ways:

	 1.  To	 receive,  as  a  clone, an incremental	send from the original
	     snapshot to one of	the snapshots it was redacted with respect to.
	     In	this case, the stream will produce a valid  dataset  when  re-
	     ceived  because  all  blocks that were redacted in	the parent are
	     guaranteed	to be present in the child's send  stream.   This  use
	     case  will	produce	a normal snapshot, which can be	used just like
	     other snapshots.

	 2.  To	receive	an incremental send  from  the	original  snapshot  to
	     something	redacted  with respect to a subset of the set of snap-
	     shots the initial snapshot	was redacted with respect to.  In this
	     case, each	block that was	redacted  in  the  original  is	 still
	     redacted  (redacting  with	respect	to additional snapshots	causes
	     less data to be redacted (because the snapshots  define  what  is
	     permitted,	and everything else is redacted)).  This use case will
	     produce a new redacted snapshot.

	 3.  To	 receive  an incremental send from a redaction bookmark	of the
	     original snapshot that was	created	when redacting with respect to
	     a subset of the set of snapshots the initial snapshot was created
	     with respect to anything else.  A send stream from	such a	redac-
	     tion bookmark will	contain	all of the blocks necessary to fill in
	     any  redacted data, should	it be needed, because the sending sys-
	     tem is aware of what blocks were originally redacted.  This  will
	     either  produce a normal snapshot or a redacted one, depending on
	     whether the new send stream is redacted.

	 4.  To	receive	an incremental send from a  redacted  version  of  the
	     initial  snapshot	that  is redacted with respect to a subject of
	     the set of	snapshots the initial snapshot was  created  with  re-
	     spect  to.	 A send	stream from a compatible redacted dataset will
	     contain all of the	blocks necessary to fill in any	redacted data.
	     This will either produce a	normal snapshot	or a redacted one, de-
	     pending on	whether	the new	send stream is redacted.

	 5.  To	receive	a full send as	a  clone  of  the  redacted  snapshot.
	     Since  the	 stream	is a full send,	it definitionally contains all
	     the data needed to	create a new dataset.  This use	case will  ei-
	     ther  produce  a  normal snapshot or a redacted one, depending on
	     whether the full send stream was redacted.

	 These restrictions are	 detected  and	enforced  by  zfs  receive;  a
	 redacted  send	 stream	 will  contain	the list of snapshots that the
	 stream	is redacted with  respect  to.	 These	are  stored  with  the
	 redacted  snapshot,  and  are used to detect and correctly handle the
	 cases above.  Note that for technical reasons,	raw sends and redacted
	 sends cannot be combined at this time.

       zfs send	[-PVenv] -t receive_resume_token
	 Creates a send	stream which  resumes  an  interrupted	receive.   The
	 receive_resume_token  is the value of this property on	the filesystem
	 or volume that	was being received into.  See  the  documentation  for
	 zfs receive -s	for more details.

       zfs send	[-PVnv]	[-i snapshot|bookmark] -S filesystem
	 Generate  a  send  stream  from a dataset that	has been partially re-
	 ceived.

	 -S, --saved
	     This flag requires	that the specified filesystem  previously  re-
	     ceived  a resumable send that did not finish and was interrupted.
	     In	such scenarios this flag enables the user to  send  this  par-
	     tially  received state.  Using this flag will always use the last
	     fully received snapshot as	the incremental	source if it exists.

       zfs redact snapshot redaction_bookmark redaction_snapshot
	 Generate a new	redaction bookmark.  In	addition to the	typical	 book-
	 mark  information, a redaction	bookmark contains the list of redacted
	 blocks	and the	list of	redaction snapshots specified.	 The  redacted
	 blocks	 are blocks in the snapshot which are not referenced by	any of
	 the redaction snapshots.  These blocks	are found  by  iterating  over
	 the  metadata	in  each redaction snapshot to determine what has been
	 changed since the target snapshot.  Redaction is designed to  support
	 redacted  zfs	sends; see the entry for zfs send for more information
	 on the	purpose	of this	operation.  If a redact	operation fails	 part-
	 way  through (due to an error or a system failure), the redaction can
	 be resumed by rerunning the same command.

   Redaction
       ZFS has support for a limited version of	data subsetting, in  the  form
       of  redaction.	Using the zfs redact command, a	redaction bookmark can
       be created that stores a	list of	blocks containing  sensitive  informa-
       tion.  When provided to zfs send, this causes a redacted	send to	occur.
       Redacted	 sends	omit  the blocks containing sensitive information, re-
       placing them with REDACT	records.  When	these  send  streams  are  re-
       ceived,	a  redacted  dataset is	created.  A redacted dataset cannot be
       mounted by default, since it is incomplete.  It can be used to  receive
       other  send  streams.  In this way datasets can be used for data	backup
       and replication,	with all the benefits that zfs send and	 receive  have
       to  offer,  while protecting sensitive information from being stored on
       less-trusted machines or	services.

       For the purposes	of redaction, there are	two steps to the  process.   A
       redact  step,  and a send/receive step.	First, a redaction bookmark is
       created.	 This is done by providing the zfs redact command with a  par-
       ent snapshot, a bookmark	to be created, and a number of redaction snap-
       shots.	These  redaction  snapshots  must be descendants of the	parent
       snapshot, and they should modify	data that is considered	 sensitive  in
       some  way.   Any	 blocks	of data	modified by all	of the redaction snap-
       shots will be listed in the redaction bookmark, because	it  represents
       the  truly  sensitive information.  When	it comes to the	send step, the
       send process will not send the blocks listed in the redaction bookmark,
       instead replacing them with REDACT records.  When received on the  tar-
       get  system, this will create a redacted	dataset, missing the data that
       corresponds to the blocks in the	redaction bookmark on the sending sys-
       tem.  The incremental send streams from	the  original  parent  to  the
       redaction snapshots can then also be received on	the target system, and
       this  will  produce a complete snapshot that can	be used	normally.  In-
       crementals from one snapshot on the parent filesystem and  another  can
       also  be	 done  by sending from the redaction bookmark, rather than the
       snapshots themselves.

       In order	to make	the purpose of the feature more	clear, an  example  is
       provided.   Consider  a	zfs  filesystem	 containing four files.	 These
       files represent information for an online shopping service.   One  file
       contains	 a  list of usernames and passwords, another contains purchase
       histories, a third contains click tracking data,	and a fourth  contains
       user  preferences.   The	 owner of this data wants to make it available
       for their development teams to test against, and	their market  research
       teams  to do analysis on.  The development teams	need information about
       user preferences	and the	click tracking data, while the market research
       teams need information about purchase histories and  user  preferences.
       Neither	needs access to	the usernames and passwords.  However, because
       all of this data	is stored in one ZFS filesystem, it must all  be  sent
       and  received  together.	  In  addition,	the owner of the data wants to
       take advantage of features like compression,  checksumming,  and	 snap-
       shots,  so  they	 do  want to continue to use ZFS to store and transmit
       their data.  Redaction can help them do so.  First, they	would make two
       clones of a snapshot of the data	on the source.	 In  one  clone,  they
       create  the  setup  they	 want  their market research team to see; they
       delete the usernames and	passwords file,	and overwrite the click	track-
       ing data	with dummy information.	 In another,  they  create  the	 setup
       they want the development teams to see, by replacing the	passwords with
       fake  information  and  replacing  the purchase histories with randomly
       generated ones.	They would then	create a  redaction  bookmark  on  the
       parent  snapshot,  using	snapshots on the two clones as redaction snap-
       shots.  The parent can then be sent, redacted,  to  the	target	server
       where  the research and development teams have access.  Finally,	incre-
       mental sends from the parent snapshot to	each of	the clones can be sent
       to and received on the target server; these snapshots are identical  to
       the  ones  on  the  source,  and	are ready to be	used, while the	parent
       snapshot	on the target contains none of the username and	password  data
       present	on the source, because it was removed by the redacted send op-
       eration.

SIGNALS
       See -v.

EXAMPLES
   Example 1: Remotely Replicating ZFS Data
       The following commands send a  full  stream  and	 then  an  incremental
       stream to a remote machine, restoring them into poolB/received/fs@a and
       poolB/received/fs@b,  respectively.  poolB must contain the file	system
       poolB/received, and must	not initially contain poolB/received/fs.
	     # zfs send	pool/fs@a |
		 ssh host zfs receive poolB/received/fs@a
	     # zfs send	-i a pool/fs@b |
		 ssh host zfs receive poolB/received/fs

   Example 2: Using the	zfs receive -d Option
       The following command sends a full stream of  poolA/fsA/fsB@snap	 to  a
       remote  machine,	 receiving  it	into poolB/received/fsA/fsB@snap.  The
       fsA/fsB@snap portion of the received snapshot's name is determined from
       the name	of the sent snapshot.  poolB  must  contain  the  file	system
       poolB/received.	If poolB/received/fsA does not exist, it is created as
       an empty	file system.
	     # zfs send	poolA/fsA/fsB@snap |
		 ssh host zfs receive -d poolB/received

SEE ALSO
       zfs-bookmark(8),	zfs-receive(8),	zfs-redact(8), zfs-snapshot(8)

FreeBSD	15.0			August 29, 2025			   ZFS-SEND(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=zfs-send&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help