Provided by: zfsutils-linux_2.2.2-0ubuntu9.3_amd64 bug

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 disabled, 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 package 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,
             descendent 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 values 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 descendants), 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 feature is active on the sending system, then the  receiving  system  must  have  that
             feature 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 overridden 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  feature  is
             active on the sending system, then the receiving system must have that feature enabled as well.  If
             the  large_blocks  feature  is  enabled  on the sending system 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 attempt 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  untrusted
             machine since that machine will not have the encryption keys to read the protected data or alter it
             without  being detected.  Upon being received, the dataset will have the same encryption 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 encrypted datasets, data will be sent unencrypted and  may  be
             re-encrypted  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 (created 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 incremental target.

             If the destination is a clone, the source may be the origin snapshot, 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 output 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 implicit when -R is  specified.   The
             receiving  system  must  also  support  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 descendents are skipped.
             This flag can only be used in conjunction 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 receive 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 incremental 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 disabled, 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 package 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  feature  is
             active on the sending system, then the receiving system must have that feature enabled as well.  If
             the  large_blocks  feature  is  enabled  on the sending system 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  untrusted
             machine since that machine will not have the encryption keys to read the protected data or alter it
             without  being detected.  Upon being received, the dataset will have the same encryption 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 encrypted datasets, data will be sent unencrypted and  may  be
             re-encrypted  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  feature  is  active  on  the sending system, then the receiving system must have that
             feature 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 output 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 contain 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 received
             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 snapshots 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 redaction bookmark will  contain  all  of
             the  blocks necessary to fill in any redacted data, should it be needed, because the sending system
             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 respect 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, depending 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 either
             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 received.

         -S, --saved
             This flag requires that the specified filesystem previously received a resumable send that did  not
             finish  and  was  interrupted.  In such scenarios this flag enables the user to send this partially
             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 bookmark 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
         partway  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
       information.   When  provided to zfs send, this causes a redacted send to occur.  Redacted sends omit the
       blocks containing sensitive information, replacing them with REDACT records.  When these send streams are
       received, 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
       parent  snapshot,  a  bookmark  to  be  created,  and  a  number of redaction snapshots.  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 snapshots 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 target system, this will create a redacted dataset, missing
       the data that corresponds to the blocks in the redaction bookmark on the sending system.  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.  Incrementals 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 snapshots, 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 tracking 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 snapshots.  The parent can then be sent, redacted, to the target server where
       the research and development teams have access.  Finally, incremental 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
       operation.

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)

OpenZFS                                           July 27, 2023                                      ZFS-SEND(8)