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

FreeBSD Manual Pages

  
 
  

home | help
ZNAPZEND(1)			    znapzend			     ZNAPZEND(1)

NAME
     znapzend - znapzend daemon

SYNOPSIS
     znapzend [options...]

      --man		     show man-page and exit
      --version 	     print version and exit
      -h,--help 	     display this help and exit
      -d,--debug	     print debug messages to STDERR
      -n,--noaction	     run in simulation mode: does no changes to filesystems
      --nodelay 	     if a backup plan has a zend_delay defined, ignore it
      --nodestroy	     does all changes to the filesystem except destroy
      --forbidDestRollback   forbids forcing destination dataset rollback and
			     removal of datasets/snapshots not present on source
      --logto=x 	     select where to log (syslog::<facility> or <filepath>)
			     when logging to a file, send USR1 to re-open the filehandle
      --loglevel=x	     define the log level
      --pidfile=x	     write a pid file when running in daemon mode
      --daemonize	     fork into the background
      --runonce=[x]	     run one round on the optionally provided dataset
      -r,--recursive	     recurse from the given "run-once" dataset
      --inherited	     allow "run-once" on dataset which only inherits a plan
      --since=x 	     allow to consider a non-automatic common snapshot "x" as a starting point
      --sinceForced=x	     same as --since=x but also make sure "x" exists on
			     destination (can cause removal of newer snapshots)
      --forcedSnapshotSuffix=x	use non-generated snapshot suffix for this "run-once"
      --features=x	     comma separated list of features to be enabled
			     (detailed in man page):
	 oracleMode recvu compressed sendRaw lowmemRecurse zfsGetType
	 skipIntermediates sendIntermediates forbidDestRollback
      -i/-I		     a "zfs send" compatible on/off for skipIntermediates
      --rootExec=x	     exec zfs with this command to obtain root privileges
			     (sudo or pfexec)
      --connectTimeout=x     sets the ConnectTimeout for ssh commands
      --autoCreation	     automatically create dataset on destination if it does
			     not exist
      --noautoCreation	     avoid automatically creating a dataset on destination
			     if it does not exist (default)
      --timeWarp=x	     shift znapzend's sense of NOW into the future
			     by x seconds
      --skipOnPreSnapCmdFail skip snapshots if the pre-snap-command fails
      --skipOnPreSendCmdFail skip replication if the pre-send-command fails
      --cleanOffline	     clean up source snapshots even if a destination was offline
      --mailErrorSummaryTo=rcpt  if "send task(s) failed", mail a summary to rcpt

DESCRIPTION
     ZnapZend is a snapshot based zfs backup daemon creating snapshots on a
     scheduled basis on the source filesystem and on destination filesystems.

     ZnapZend reads its configuration from custom properties in the dataset.
     Use znapzendzetup to set and list these properties.

     -d, --debug
	 talk a lot while running. Sends debug messages to stderr.

     -n, --noaction
	 don't do any actions which have lasting effect. Ideal to try out new
	 configurations together with --debug

     --nodelay
	 if a backup plan has a zend_delay defined, ignore it (should help when
	 debugging the backup plan configurations, without waiting for hours to
	 run them during experiments)

     --nodestroy
	 do all changes to the filesystem except destroying old snapshots after
	 a successful run to snapshot and replicate to backup destinations

     --forbidDestRollback
	 by default znapzend uses zfs recv -F which rolls back destination to
	 the most recent snapshot, and in case of incremental replication
	 streams can also destroy snapshots and other child datasets not present
	 in the source.

	 The --forbidDestRollback option allows to not enforce this mode, so
	 znapzend would instead report errors if destination is not ready to re-
	 ceive data without applying such operations. This can be useful for
	 maintenance of backup destinations, but can be counter-productive for
	 regularly scheduled operations.

     --logto={syslog::facility|filepath}
	 send logs out to either syslog or a logfile. Default is to send logs to
	 syslog::daemon when running daemonized. When running in debug mode, the
	 logs will go to STDERR by default.

	 When logging to a file, send USR1 to reopen the file handle after log
	 rotation.

	 Examples:

	  --logto=/var/log/znapzend.log
	  --logto=syslog::daemon

     --loglevel={debug|info|warning|err|alert}
	 Define the log level when logging to file. Default is debug.

     --pidfile=path
	 write a pid file when running in daemon mode pidfile defaults to
	 /var/run/znapzend.pid if no pidfile is given

     --daemonize
	 Fork into the background.

     --runonce=[dataset]
	 run one round on source dataset or on all datasets if empty.  This is
	 very useful for testing. Use it in connection with --noaction and --de-
	 bug while testing your new configuration, or with --recursive for quick
	 back up of whatever has backup plans in a single pool or dataset tree.

     --forcedSnapshotSuffix=snapsuffix
	 for this round of --runonce create the specified snapshot suffix,
	 rather than one generated by a pattern managed by 'znapzend'. Note it
	 would not get automatically cleaned per retention policy, either. This
	 is primarily intended for manual operations where a sysadmin wants for
	 mark the certain data state of local significance while making an un-
	 scheduled backup.

	 This option is not valid if the run-once mode is not requested.

	 While basic sanity checks are done, it is up to the caller to specify a
	 correct string value according to the rules of their ZFS version, and
	 to take care that it is unique (no snapshots with such suffix already
	 exist).

	 See also --since=snapsuffix

     --since=snapsuffix, --sinceForced=snapsuffix
	 Enables to see a snapshot named snapsuffix in the history of the
	 dataset under source and target pools, which should be a common snap-
	 shot present on both (or only on the source pool), and may be their
	 newest common snapshot (that would otherwise be blocking the sync as
	 something that needs to be removed for a full auto-creation replication
	 and/or a usual replication).

	 If the target dataset does not have this named snapshot, but the other-
	 wise discovered history of automatic snapshots allows to include it
	 into the usual replication, it will be sent (and a newer automati-
	 cally-named snapshot would be made and sent). In other cases, it is up
	 to the systems administrator to make the original systems data consis-
	 tent with that on their remote ZFS pool.

	 One could then use --sinceForced=snapsuffix variant that can remove
	 from destination any snapshots that are newer than snapsuffix to make
	 way if needed, and ensure that this snapshot appears in destination's
	 history; by default with --since=snapsuffix such removals should not
	 happen.

	 Unlike the --forcedSnapshotSuffix=snapsuffix, this option does not de-
	 fine how the new snapshot made during this run would be called (it
	 would be named by common timestamp-based pattern to not get in the way
	 of subsequent regular replications).

	 The dataset name provided in this argument will never be removed during
	 this run-once (even if it matches the configured znapzend time-
	 stamp-based snapshot naming pattern and is old enough to rotate away in
	 other circumstances).

	 Example:

	   znapzend --runonce=rpool/ROOT --since=20200101-01-finallyStableSetup

     -r, --recursive
	 when backing up a particular dataset with --runonce=[dataset], do not
	 just look at this dataset's backup plan, but iterate into its children
	 that might have any. Useful for quick backups of a pool whose root
	 dataset has no znapzendzetup configurations defined, but some trees un-
	 der it do.

	 See below for interaction with --inherited option and examples.

     --inherited
	 when backing up a particular dataset with --runonce=[dataset], do not
	 require that the provided dataset directly has a locally defined backup
	 plan configuration (sanity check that it is not "received" via ZFS
	 replication).	With this option in place, allow also to quickly snap-
	 shot and/or replicate datasets of subtrees which inherit a backup plan
	 from a dataset which has it in its attributes whose source is "local".

     --inherited and --recursive together
	 At this time, the --inherited is "sort of exclusive" vs. --recursive
	 mode, and if both are specified the behavior depends on whether the re-
	 quested dataset has some (local or inherited-from-local) backup plan.
	 If a dataset without a backup plan is passed, the script should effec-
	 tively ignore the --inherited option and just recurse until it finds
	 some dataset(s) with proper locally defined backup plan(s) (note that
	 finding inherited plans first is highly unlikely due to ZFS attribute
	 inheritance from parents to children).

	 Examples below assume the following dataset layout:

	 + tank (no znapzend config) | + export (local znapzend config) | | +
	 home (inherited znapzend config from local tank/export) | |   + user
	 (inherited znapzend config from local tank/export) | |     + sources
	 (inherited znapzend config from local tank/export) | |     + documents
	 (inherited znapzend config from local tank/export) | |       + pictures
	 (inherited znapzend config from local tank/export) | + var (local
	 znapzend config) + usbbackup (no znapzend config)
	   + snapshots (no znapzend config)
	     + export (received znapzend config)
	     | + home (inherited from received usbbackup/snapshots/export)
	     |	 + user (inherited from received usbbackup/snapshots/export)
	     |	   + sources (inherited from received usbbackup/snapshots/ex-
	 port)
	     |	   + documents (inherited from received usbbackup/snapshots/ex-
	 port)
	     |	     + documents (inherited from received usbbackup/snap-
	 shots/export)
	     + var (received znapzend config)

	 Examples:

	   znapzend --recursive --runonce=tank

	 This should walk all filesystem or volume datasets defined anywhere un-
	 der tank (root dataset of same-named pool) and snapshot/replicate the
	 found datasets that have a backup plan configured "locally", such as
	 tank/export and tank/var, according to configuration (e.g. with chil-
	 dren and beyond if the corresponding backup plan's recursive=on option
	 is specified).  It should not waste time looking for datasets under the
	 usbbackup pool.

	   znapzend --runonce=tank/export/home/user/documents

	 Given that only tank/export "locally" defines a znapzend backup plan,
	 the default znapzend behavior with a descendant dataset would be to
	 find no configuration (sourced as "local" right in it) and so would
	 "run-once" nothing.

	   znapzend --recursive --runonce=tank/export/home

	 Same (no config found) for recursion starting from a dataset with in-
	 herited backup plan configuration (assuming none of its descendants
	 have a "local" config of their own).

	   znapzend --inherited --runonce=tank/export/home/user/documents

	 With the --inherited option however it would recognize this descendant
	 dataset as having a backup plan configuration inherited from tank/ex-
	 port, would then look at tank/export and confirm that it has this con-
	 figuration from a "local" source, and should znapzend runonce just this
	 dataset and its descendants (so including tank/export/home/user/docu-
	 ments/pictures, but not including siblings like tank/ex-
	 port/home/user/sources).

	   znapzend --inherited --recursive --runonce=tank

	 Since tank has no backup plan, znapzend should recurse and find the
	 nearest datasets with configured plans, tank/export and tank/var, and
	 process them according to configuration.

	   znapzend --inherited --recursive --runonce=tank/export

	 Since tank/export has a locally defined backup plan, znapzend should
	 process it according to configuration.

	   znapzend --inherited --recursive --runonce=tank/export/home

	 Since tank/export/home has a backup plan inherited from a locally de-
	 fined one in tank/export, znapzend should process it according to con-
	 figuration.

	   znapzend --recursive --runonce=usbbackup
	   znapzend --inherited --runonce=usbbackup/snapshots
	   znapzend --inherited --recursive --runonce=usbbackup/snapshots/export/home

	 Neither of these runs should do anything, because all datasets involved
	 (including those found by a recursive walk) under usbbackup have nei-
	 ther a local definition of a backup plan, nor one inherited from a lo-
	 cal definition.

     --features=feature1,feature2,...
	 enables enhanced zfs features not supported by all zfs implementations.
	 Do not enable features unless you are sure your zfs supports (or re-
	 quires) it

	 Available features:

	 oracleMode
	     working around the following zfs issues we have seen on oracle:

	     *	 The multi snapshot destroy syntax is not available. So stick to
		 destroying them individually.

	     *	 Sometimes a snapshot can not be destroyed because of some ora-
		 cle zfs bug.  Only a reboot seems to be able to fix this. So we
		 just destroy the ones we can destroy. Logging an error about
		 the problem

	 recvu
	     use the -u option on the receive end, to keep the destination zfs
	     filesystems unmounted.

	 resume
	     use the -s option on the receive end, to support resumable transfer
	     with receive_resume_token.

	     If you have aborted a resumable-send, you should either do a re-
	     sume-send using -t <token> to continue it or clear the half-re-
	     ceived snapshot using zfs receive -A <filesystem>

	     Example:

	      zfs get receive_resume_token tank/test
	      zfs send -t <token> | zfs receive -s tank/test

	 compressed
	     use 'compressed' to add options -Lce to the zfs send command

	     Even if a source and destination datasets are both using compres-
	     sion, zfs send will, by default, decompress the data before send-
	     ing, and zfs recv will then compress it again before writing it to
	     disk.  Using -c will skip the unnecessary decompress-compress
	     stages.  This decreases CPU load on both source and destination as
	     well as reduces network bandwidth usage.

	     The -L option is for large block support and -e is for embedded
	     data support. These may require certain (Open)ZFS features to be
	     enabled.

	 sendRaw
	     use 'sendRaw' to add option -w to zfs send commands

	     For encrypted source datasets this instructs zfs not to decrypt be-
	     fore sending which results in a remote backup that can't be read
	     without the encryption key/passphrase, useful when the remote isn't
	     fully trusted or not physically secure. This option must be used
	     consistently, raw incrementals cannot be based on non-raw snapshots
	     and vice versa.

	 sendIntermediates
	     The opposite of skipIntermediates, detailed in the next section.
	     This is the default mode of operation, and only included here to
	     allow for completeness and explicitness of your configurations.

	 skipIntermediates
	     Enable the 'skipIntermediates' feature to send a single increment
	     between latest common snapshot and the newly made one. It may skip
	     several source snaps if the destination was offline for some time,
	     and it should skip snapshots not managed by znapzend. Normally for
	     online destinations, the new snapshot is sent as soon as it is cre-
	     ated on the source, so there are no automatic increments to skip.

	     By default 'znapzend' uses the 'zfs send -I' option on the sending
	     end (so to include all intermediate snapshots), rather than '-i'
	     (which would send a single big increment), to keep the destination
	     zfs dataset history similar to the source's one. This implies the
	     -sendIntermediates mode of operation.

	     Note: it was the default from beginning of 'znapzend' to make sure
	     that in case a send operation takes too long, we still get all the
	     intermediate snapshots sent to the destination.  Beware or benefit
	     that this can deliver not only automatic, but also manually named
	     snapshots to your destination which would have to be cleaned manu-
	     ally when no longer wanted there, but that they can be used as com-
	     mon snapshots to repair broken syncs e.g. with --since=X options.

	     With the 'skipIntermediates' feature disabled, all snapshots be-
	     tween the latest common one and the newly created one on the source
	     would be sent to each destination, and then the "extra" ones of
	     those managed by znapzend may get discarded according to destina-
	     tion's retention policy. Note that snapshots which are NOT managed
	     by znapzend, e.g.	ones you created manually, would appear on the
	     destination and stay there until removed manually. Also note that
	     this may consume more disk space and transfer time than otherwise
	     needed for the data increment.

	     This original mode is now primarily recommended for irregular back-
	     ups (on removable media or over unstable links) and cases where the
	     sysadmin marks certain data states via snapshots as special (e.g.
	     "before_upgrade", etc.)

	     The feature is recommended to be part of your 'znapzend' service
	     setup for regular runs in stable storage/networking conditions.

	 forbidDestRollback
	     Avoid use of destructive 'zfs recv -F' in favor of failing to re-
	     ceive; more details in description of --forbidDestRollback CLI op-
	     tion above.

	 lowmemRecurse
	     use 'lowmemRecurse' on systems where you have too many datasets, so
	     a recursive listing of attributes to find backup plans exhausts the
	     memory available to `znapzend(zetup)`: instead, go the slower way
	     to first list all impacted dataset names, and then query their con-
	     figs one by one.

	 zfsGetType
	     use 'zfsGetType' if your 'zfs get' supports a '-t' argument for
	     filtering by dataset type at all (e.g. one in Solaris 10 does not),
	     AND lists properties for snapshots by default when recursing (e.g.
	     the one in Solaris 10u8 already does), so that there is too much
	     data to process while searching for backup plans.

	     If these two conditions apply to your system, the time needed for a
	     '--recursive' search for backup plans can literally differ by hun-
	     dreds of times (depending on the amount of snapshots in that
	     dataset tree... and a decent backup plan will ensure you have a lot
	     of those), so you would benefit from requesting this feature.

	     This feature should not impact the default (non- '--recursive')
	     listings however.

     --rootExec={sudo|pfexec}
	 Execute zfs with this command, 'sudo' or 'pfexec', to obtain root priv-
	 ileges. This is often necessary when running znapzend as a non-privi-
	 leged user with a zfs install that doesn't support finer permission
	 controls. This also applies to the zfs commands ran on remote servers
	 over ssh.

	 For sudo, the /etc/sudoers file will need to be modified to allow for
	 passwordless access to zfs commands if znapzend is to be ran as a dae-
	 mon or the system will be used as a remote. Many ZFS installations in-
	 clude an /etc/sudoers.d/zfs file as an example.

     --connectTimeout=timeout
	 sets the ssh connection timeout (in seconds)

     --autoCreation
	 Automatically create a dataset on a destination host if it's not there
	 yet.

     --noautoCreation
	 Avoid automatically creating a dataset on a destination host if it's
	 not there yet. This is the default behavior; the option is available to
	 help explicitly override a setting inherited from a configuration file,
	 etc.

     --timeWarp=x
	 Shift ZnapZend's sense of time into the future by x seconds.

	 The practical application if this function is to determine what will
	 happen at some future point in time. This can be useful for testing but
	 also when running in noaction and debug mode to determine which snap-
	 shots would be created and removed at some future point in time.

     --skipOnPreSnapCmdFail
	 Prevent snapshots of a dataset from being taken when it has a
	 pre-snap-command defined and the command returns a non-zero exit code
	 or is killed by a signal.

     --skipOnPreSendCmdFail
	 Prevent snapshots of a dataset from being replicated to a destination
	 when it has a pre-snap-command defined and the command returns a
	 non-zero exit code or is killed by a signal.

     --cleanOffline
	 Clean snapshots of a source dataset even if one or more destination
	 datasets failed during replication for whatever reason (destination of-
	 fline, destination full, destination pool became read-only due to stor-
	 age issues, source too full to make a snapshot, etc.).

	 The most recent common snapshot for each destination (as tracked on
	 source for resilience) will not be deleted from source, but this is
	 still a potentially dangerous option: if the preserved snapshot somehow
	 gets deleted from the destination, it may require a full re-replication
	 the next time it is online.

     --mailErrorSummaryTo=rcpt(@domain),...
	 If this argument is passed, a copy of error summary would be sent there
	 by your system's command line mailer program. It is then up to this
	 program and system setup to validate the recipient names (local or do-
	 main-suffixed) and deliver the message to some mailbox.

	 This feature relies on a program which supports standard sendmail-like
	 CLI.

EXAMPLE
     To test a new config:

      znapzend --debug --noaction --runonce=tank/test

     To see what is going to happen in one hour:

      znapzend --debug --noaction --timeWarp=3600 --runonce=tank/test

     To run as a daemon:

      znapzend --daemonize --pidfile=/var/run/znapzend.pid --logto=syslog::daemon

COPYRIGHT
     Copyright (c) 2014 by OETIKER+PARTNER AG. All rights reserved.

LICENSE
     This program is free software: you can redistribute it and/or modify it un-
     der the terms of the GNU General Public License as published by the Free
     Software Foundation, either version 3 of the License, or (at your option)
     any later version.

     This program is distributed in the hope that it will be useful, but WITHOUT
     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FIT-
     NESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
     details.

     You should have received a copy of the GNU General Public License along
     with this program. If not, see <http://www.gnu.org/licenses/>.

AUTHOR
     Tobias Oetiker <tobi@oetiker.ch>, Dominik Hassler <hadfl@cpan.org>

HISTORY
      2014-06-01 had Multi destination backup
      2014-05-30 had Initial Version

0.23.4				   2026-07-04			     ZNAPZEND(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=znapzend&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help