1 # SPDX-License-Identifier: GPL-2.0
15 synopsis = [global-options...] [--] [<subcommand> [subcommand-options...]]
17 [option general-options-section]
18 summary = General options
21 summary = print help and exit
23 [option detailed-help]
24 summary = print help, including all details, and exit
26 summary = print version and exit
30 summary = use alternative config file (default: ~/.dssrc)
32 arg_info = required_arg
35 Options may be given at the command line or in the configuration
36 file. As usual, if an option is given both at the command line and
37 in the configuration file, the command line option takes precedence.
39 However, there is one exception to this rule: The run subcommand
40 re-reads the configuration file when it receives the HUP signal. In
41 this case the options in the config file override any options that
42 were previously given at the command line. This allows changing the
43 configuration of a running dss process by sending SIGHUP.
47 summary = set loglevel (0-6)
49 arg_info = required_arg
53 Lower values mean more verbose logging.
57 summary = only print what would be done
59 This flag does not make sense for all subcommands. The run subcommand
60 refuses to start if this option was given while the ls subcommand
61 silently ignores the flag.
64 summary = the remote directory to snapshot
66 arg_info = required_arg
70 The directory on the remote host from which snapshots are taken.
71 Of course, the user specified as --remote-user must have read access
74 This option is mandatory for the create and run subcommands: It may
75 be given multiple times to specify more than one source directory.
76 However, all source directories must reside on the same server.
79 summary = where snapshots are stored
81 arg_info = required_arg
84 The destination directory on the local host where snapshots will be
85 written. This must be writable by the user who runs dss.
87 This option is mandatory for all subcommands except kill.
88 Unlike --source-dir, this option may only be given once.
91 summary = abort if destination directory is not a mountpoint
93 This option checks whether a file system is mounted on the directory
94 specified as the argument to --dest-dir. Operation proceeds only
95 if this is the case. Otherwise dss exits unsuccessfully without
96 performing any action. Use this option to prevent snapshot creation
97 if the snapshot file system is not mounted.
99 This option is silently ignored for subcommands which do not depend
100 on the destination directory.
102 [option Rsync-options]
103 summary = Controlling how rsync is run
106 These options are only relevant to the run and the create subcommands.
110 summary = host to take snapshots from
112 arg_info = required_arg
114 default_val = localhost
116 If this option is given and its value differs from the local
117 host, then rsync uses ssh. Make sure there is no password
118 needed for the ssh connection. To achieve that, use public key
119 authentication for ssh and, if needed, set the remote user name
120 by using the --remote-user option.
124 summary = Remote user name (default: current user)
125 arg_info = required_arg
129 Set this if the user that runs dss is different from the user on the
133 summary = run rsync with --checksum occasionally
135 arg_info = required_arg
139 If a file on the backup becomes corrupt in a way that file size
140 and modification time still match the original file, rsync will not
141 consider the file for transfer ("quick check"). Hence the corruption
142 stays on the backup until the file is modified on the source.
143 The --checksum option of rsync disables the quick check and compares
144 the contents of each file, fixing such corruptions. Since computing
145 the checksums adds a significant slowdown due to a lot of disk I/O,
146 the option is not enabled by default.
148 The argument to the --checksum option of dss is a number between 0
149 and 1000, inclusively, which determines the probability of adding
150 --checksum to the rsync options each time a snapshot is created. The
151 default value zero means to never add the option. The value 100 will
152 create every tenth snapshot (on average) using checksums, and the
153 value 1000 will always pass --checksum to rsync.
155 [option rsync-option]
157 summary = further rsync options
159 arg_info = required_arg
163 This option may be given multiple times. The given argument is
164 passed verbatim to the rsync command. Note that in order to use
165 rsync options that require an argument, you have to specify the
166 option and its argument as separate --rsync-options, like this:
168 --rsync-option --exclude --rsync-option /proc
171 summary = Fine tuning the number of snapshots per time unit
173 [option unit-interval]
175 summary = the duration of a unit interval
177 arg_info = required_arg
181 Increasing this number instructs dss to create fewer snapshots per
182 time unit while the number of snapshots to keep stays the same.
184 [option num-intervals]
186 summary = the number of unit intervals
188 arg_info = required_arg
192 Increasing this number by one doubles the total number of
196 summary = Commands to be run on certain events
199 All hooks default to "true". That is, the true(1) utility (which
200 always returns with exit code zero) is executed if the hook command
203 [option pre-create-hook]
205 summary = executed before a snapshot is created
207 arg_info = required_arg
211 This command is executed before dss runs rsync to create a new
212 snapshot. If the command returns with a non-zero exit status, no
213 snapshot will be created and the operation is retried later.
215 For example, the command could execute a script that checks whether
216 all snapshot-related file systems are mounted.
218 Another possible application of the pre-create hook is to return
219 non-zero during office hours in order to not slow down the file
220 systems by taking snapshots.
222 [option post-create-hook]
223 summary = executed after a snapshot has been created
225 arg_info = required_arg
229 This is only executed if a snapshot has successfully been created. The
230 full path of the newly created snapshot is passed to the hook as the
231 first argument. The exit code of this hook is ignored.
233 For instance this hook could count the number of files per user
234 and/or compute disk usage patterns to be stored in a database for
237 [option pre-remove-hook]
238 summary = executed before a snapshot is removed
240 arg_info = required_arg
244 The full path to the snapshot which is about to be removed is passed
245 to the command as the first argument. If the command returns with
246 a non-zero exit status, the snapshot is not going to be removed and
247 the operation is retried later.
249 For example, one could execute a script that checks whether the
250 snapshot to be deleted is currently used by another process, e.g. by
251 a tape-based backup system that runs concurrently to dss.
253 Another possible application of this is to record disk-usage
254 patterns before and after snapshot removal.
256 [option post-remove-hook]
257 summary = executed after snapshot removal
259 arg_info = required_arg
263 As for the pre-remove hook, the full path of the removed snapshot is
264 passed to the hook as the first argument. The exit code of this hook
268 summary = executed before the run command exits
270 arg_info = required_arg
274 This hook is only relevant to the run subcommand. It is executed just
275 before dss terminates. The reason for termination is passed as the
278 One possible application for this hook is to send email to the system
279 administrator to let her know that no more snapshots are going to
283 [option disk-space-monitoring]
284 summary = Disk space monitoring
287 The options of this section control the aggressiveness of snapshot
288 removal. That is, they define under which circumstances existing
289 snapshots are removed. These options are only relevant to the run
290 and the prune subcommands.
294 summary = minimal amount of free disk space
295 arg_info = required_arg
300 If disk space on the file system containing the destination
301 directory gets low, the run subcommand suspends the currently
302 running rsync process and starts to remove snapshots in order to
303 free disk space. This option specifies the minimal amount of free
304 disk space. If less than the given number of megabytes is available,
305 snapshots are being deleted. See also the --min_free_percent and the
306 min-free-percent-inodes options below.
308 A value of zero deactivates this check.
310 [option min-free-percent]
312 summary = minimal percentage of free disk space
313 arg_info = required_arg
318 This is like --min-free-mb but the amount of free disk space
319 is specified as a percentage. It is not recommended to set both
320 --min-free-mb and --min-free-percent to zero as this will cause your
321 file system to fill up quickly.
323 [option min-free-percent-inodes]
325 summary = minimal percent of free inodes
326 arg_info = required_arg
331 The minimum amount of free inodes on the file system containing the
332 destination dir. If the percentage of free inodes drops below the
333 given value, snapshot removal kicks in like in case of low disk space.
335 The number of free inodes is determined from the f_ffree field of
336 the statvfs structure. However, some file systems set this field to
337 zero, indicating that the number of inodes is basically unlimited.
338 Moreover it is not possible to reliably detect whether this is the
339 case. Therefore this feature is disabled by default. It's safe to
340 enable it for ext2/ext3/ext4 file systems on linux though.
342 A value of zero (the default) deactivates this check.
344 [option keep-redundant]
346 summary = prune by disk space only
348 By default, redundant and outdated snapshots are removed automatically
349 to keep the number of snapshots in harmony with the configured
350 policy. If this flag is given, dss removes such snapshots only if
351 disk space or number of free inodes becomes low.
353 [option min-complete]
354 summary = minimal number of complete snapshots to keep
355 arg_info = optional_arg
360 This option is only relevant if snapshots must be deleted because
363 dss refuses to remove old snapshots if there are fewer complete
364 snapshots left than the given number. The default value of one
365 guarantees that at least one complete snapshot is available at
368 If only <num> complete snapshots are left, and there is not enough
369 disk space available for another snapshot, the program terminates
370 with a "No space left on device" error.
374 dss supports the subcommands described below. If no subcommand is
375 given, the list of available subcommands is shown and the program
376 terminates successfully without performing any further action.
380 purpose = start creating and pruning snapshots
382 This is the main mode of operation. Snapshots are created in an endless
383 loop as needed and pruned automatically. The loop only terminates on
384 fatal errors or if a terminating signal was received. See also the
389 summary = run as background daemon
391 If this option is given, the dss command detaches from the console
392 and continues to run in the background. It is not possible to let
393 a daemonized process re-attach to the console by editing the config
394 file and sending SIGHUP. However, log output may be redirected to a
395 different file in this way.
401 summary = where to write log output
402 arg_info = required_arg
405 default_val = /dev/null
407 This option is only honored if --daemon is given, in which case
408 log messages go to the given file. Otherwise the option is silently
409 ignored and log output is written to stderr.
411 [option max-rsync-errors]
412 summary = terminate after this many rsync failures
414 arg_info = required_arg
418 If the rsync process exits with a fatal error, dss restarts the command
419 in the hope that the problem is transient and subsequent rsync runs
420 succeed. After the given number of consecutive rsync error exits,
421 however, dss gives up, executes the exit hook and terminates. Set
422 this to zero if dss should exit immediately on the first rsync error.
424 The only non-fatal error is when rsync exits with code 24. This
425 indicates a partial transfer due to vanished source files and happens
426 frequently when snapshotting a directory which is concurrently being
430 purpose = execute rsync once to create a new snapshot
432 This command does not check the amount free disk space. The pre-create
433 and post-create hooks are honored, however.
435 Specify --dry-run to see the rsync command which is executed to create
439 purpose = remove snapshots
441 A snapshot is said to be (a) outdated if its interval number is greater
442 or equal than the specified number of unit intervals, (b) redundant if
443 the interval it belongs to contains more than the configured number of
444 snapshots, and (c) orphaned if it is incomplete and not being created
445 or deleted. All other snapshots are called regular.
447 Unless --dry-run is given, which just prints the snapshot that would be
448 removed, this subcommand gets rid of non-regular snapshots. At most
449 one snapshot is removed per invocation. If no such snapshot exists
450 and disk space is low, the subcommand also removes regular snapshots,
451 always picking the oldest one.
453 The subcommand fails if there is another dss "run" process.
456 summary = act as if free disk space was high/low
457 arg_info = required_arg
467 By default, free disk space is checked and even regular snapshots
468 become candidates for removal if disk space is low. This option
469 overrides the result of the check.
472 purpose = print the list of all snapshots
474 The list contains all existing snapshots, no matter of their state.
475 Incomplete snapshots and snapshots being deleted will also be listed.
478 purpose = send a signal to a running dss process
480 This sends a signal to the dss process that corresponds to the given
481 config file. If --dry-run is given, the PID of the dss process is
482 written to stdout, but no signal is sent.
486 summary = send the given signal rather than SIGTERM
488 arg_info = required_arg
490 default_val = SIGTERM
492 Like for kill(1), alternate signals may be specified in three ways: as
493 a signal number (e.g., 9), the signal name (e.g., KILL), or the signal
494 name prefixed with "SIG" (e.g., SIGKILL). In the latter two forms,
495 the signal name and the prefix are case insensitive, so "sigkill"
498 Sending SIGHUP causes the running dss process to reload its config file.
502 summary = wait until the signalled process has terminated
504 This option is handy for system shutdown scripts which would like
505 to terminate the dss daemon process.
507 Without --wait the dss process which executes the kill subcommand
508 exits right after the kill(2) system call returns. At this point the
509 signalled process might still be alive (even if SIGKILL was sent).
510 If --wait is given, the process waits until the signalled process
511 has terminated or the timeout expires.
513 If --wait is not given, the kill subcommand exits successfully if
514 and only if the signal was sent (i.e., if there exists another dss
515 process to receive the signal). With --wait it exits successfully
516 if, additionally, the signalled process has terminated before the
519 It makes only sense to use the option for signals which terminate dss.
521 [subcommand configtest]
522 purpose = run a configuration file syntax test
524 This command checks the command line options and the configuration
525 file for syntactic correctness. It either reports "Syntax Ok" and
526 exits successfully or prints information about the first syntax error
527 detected and terminates with exit code 1.
530 purpose = list available subcommands or print subcommand-specific help
531 non-opts-name = [subcommand]
533 If the optional subcommand argument is given, the help text of that
534 subcommand is shown. Without the argument the available subcommands
539 summary = show the long help text of a subcommand
541 If this option is given, the command also shows the description of
542 the subcommand and the help text of each option, Otherwise only the
543 purpose, the synopsis and the option list of the subcommand is shown.
544 If no subcommand is supplied, the option has no effect.
548 Suppose you'd like to create snapshots of the existing directory
552 Create the config file
555 the values for the source and the destination directories
560 echo 'source-dir "/foo/bar"' > ~/.dssrc
561 echo 'dest-dir "/baz/qux"' >> ~/.dssrc
565 Then execute the commands
574 To print the list of all snapshots created so far, run
577 The second example involves a slightly more sophisticated config
578 file. It instructs dss to exclude everything which matches at least
579 one pattern of the given exclude file, prevents rsync from crossing
580 file system boundaries and increases the number of snapshots.
584 source-dir "/foo/bar"
586 # exclude files matching patterns in /etc/dss.exclude
587 rsync-option \-\-exclude\-from=/etc/dss.exclude
588 # don't cross filesystem boundaries
589 rsync-option \-\-one\-file\-system
590 # maintain 2^6 - 1 = 63 snapshots
597 file could look like this (see rsync(1) for more examples)
607 [section snapshot distribution]
608 The age of a snapshot is measured in terms of unit
613 interval and the number
615 of unit intervals to consider, dss tries to keep
617 snapshots in interval
619 where the interval number
624 with zero being the most recent unit interval. Snapshots older than
626 unit intervals are regarded as outdated and are removed. There are
630 For example, with four unit intervals, the 2^4 - 1 = 15 snapshots
631 are distributed as follows.
638 Snapshots \~\~\~\~*\~\~\~ \~\~*\~\~*\~\~ \~*\~*\~*\~* ********
641 Note that for this to work out the system must be fast enough to
644 snapshots per unit interval because this is the number of snapshots
651 Copyright (C) 2008 - present AUTHOR()
655 This is free software: you are free to change and redistribute it.
657 There is NO WARRANTY, to the extent permitted by law.