process_children_only keeps sanoid from messing with empty parent datasets; improved docs in default conf files
This commit is contained in:
parent
aa55a4ece0
commit
470a16e480
|
@ -1,4 +1,7 @@
|
||||||
1.2.0 added monitor-children-only parameter to sanoid.conf for use with recursive definitions - in cases where container dataset is kept empty
|
1.3.0 changed monitor_children_only to process_children_only. which keeps sanoid from messing around with empty parent datasets at all.
|
||||||
|
also more thoroughly documented features in default config files.
|
||||||
|
|
||||||
|
1.2.0 added monitor_children_only parameter to sanoid.conf for use with recursive definitions - in cases where container dataset is kept empty
|
||||||
|
|
||||||
1.1.0 woooo - working recursive definitions in Sanoid! Also intelligent config errors in Sanoid; will die with errors if unknown config value is set.
|
1.1.0 woooo - working recursive definitions in Sanoid! Also intelligent config errors in Sanoid; will die with errors if unknown config value is set.
|
||||||
|
|
||||||
|
|
13
README.md
13
README.md
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
Sanoid is a policy-driven snapshot management tool for ZFS filesystems.
|
Sanoid is a policy-driven snapshot management tool for ZFS filesystems.
|
||||||
|
|
||||||
You can use Sanoid to create, automatically thin, and monitor snapshots and pool health from a single eminently human-readable TOML config file at /etc/sanoid/sanoid.conf. A typical Sanoid system would have a single cron job:
|
You can use Sanoid to create, automatically thin, and monitor snapshots and pool health from a single eminently human-readable TOML config file at /etc/sanoid/sanoid.conf. (Sanoid also requires a "defaults" file located at /etc/sanoid/sanoid.defaults.conf, which is not user-editable.) A typical Sanoid system would have a single cron job:
|
||||||
|
|
||||||
```
|
```
|
||||||
* * * * * /usr/local/bin/sanoid --cron
|
* * * * * /usr/local/bin/sanoid --cron
|
||||||
|
@ -14,10 +14,11 @@ And its /etc/sanoid/sanoid.conf might look something like this:
|
||||||
```
|
```
|
||||||
[data/home]
|
[data/home]
|
||||||
use_template = production
|
use_template = production
|
||||||
[data/images/win2012]
|
[data/images]
|
||||||
use_template = production
|
|
||||||
[data/images/win7-spice]
|
|
||||||
use_template = production
|
use_template = production
|
||||||
|
recursive = yes
|
||||||
|
process_children_only = yes
|
||||||
|
[data/images/win7]
|
||||||
hourly = 4
|
hourly = 4
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
|
@ -33,7 +34,7 @@ And its /etc/sanoid/sanoid.conf might look something like this:
|
||||||
autoprune = yes
|
autoprune = yes
|
||||||
```
|
```
|
||||||
|
|
||||||
Which would be enough to tell sanoid to take and keep 36 hourly snapshots, 30 dailies, 3 monthlies, and no yearlies. Except in the case of data/images/win7-spice, which only keeps 4 hourlies for whatever reason.
|
Which would be enough to tell sanoid to take and keep 36 hourly snapshots, 30 dailies, 3 monthlies, and no yearlies for all datasets under data/images (but not data/images itself, since process_children_only is set). Except in the case of data/images/win7-spice, which follows the same template (since it's a child of data/images) but only keeps 4 hourlies for whatever reason.
|
||||||
|
|
||||||
Sanoid also includes a replication tool, syncoid, which facilitates the asynchronous incremental replication of ZFS filesystems. A typical syncoid command might look like this:
|
Sanoid also includes a replication tool, syncoid, which facilitates the asynchronous incremental replication of ZFS filesystems. A typical syncoid command might look like this:
|
||||||
|
|
||||||
|
@ -55,4 +56,4 @@ syncoid root@remotehost:data/images/vm backup/images/vm
|
||||||
|
|
||||||
Which would pull-replicate the filesystem from the remote host to the local system over an SSH tunnel.
|
Which would pull-replicate the filesystem from the remote host to the local system over an SSH tunnel.
|
||||||
|
|
||||||
Syncoid supports and uses mbuffer buffering, lzop compression, and pv progress bars if the utilities are available on the systems used.
|
Syncoid supports recursive replication (replication of a dataset and all its child datasets) and uses mbuffer buffering, lzop compression, and pv progress bars if the utilities are available on the systems used.
|
||||||
|
|
8
sanoid
8
sanoid
|
@ -106,7 +106,7 @@ sub monitor_snapshots() {
|
||||||
foreach my $section (keys %config) {
|
foreach my $section (keys %config) {
|
||||||
if ($section =~ /^template/) { next; }
|
if ($section =~ /^template/) { next; }
|
||||||
if (! $config{$section}{'monitor'}) { next; }
|
if (! $config{$section}{'monitor'}) { next; }
|
||||||
if ($config{$section}{'monitor_children_only'}) { next; }
|
if ($config{$section}{'process_children_only'}) { next; }
|
||||||
|
|
||||||
my $path = $config{$section}{'path'};
|
my $path = $config{$section}{'path'};
|
||||||
push @paths, $path;
|
push @paths, $path;
|
||||||
|
@ -178,6 +178,7 @@ sub prune_snapshots {
|
||||||
foreach my $section (keys %config) {
|
foreach my $section (keys %config) {
|
||||||
if ($section =~ /^template/) { next; }
|
if ($section =~ /^template/) { next; }
|
||||||
if (! $config{$section}{'autoprune'}) { next; }
|
if (! $config{$section}{'autoprune'}) { next; }
|
||||||
|
if ($config{$section}{'process_children_only'}) { next; }
|
||||||
|
|
||||||
my $path = $config{$section}{'path'};
|
my $path = $config{$section}{'path'};
|
||||||
|
|
||||||
|
@ -256,6 +257,7 @@ sub take_snapshots {
|
||||||
foreach my $section (keys %config) {
|
foreach my $section (keys %config) {
|
||||||
if ($section =~ /^template/) { next; }
|
if ($section =~ /^template/) { next; }
|
||||||
if (! $config{$section}{'autosnap'}) { next; }
|
if (! $config{$section}{'autosnap'}) { next; }
|
||||||
|
if ($config{$section}{'process_children_only'}) { next; }
|
||||||
|
|
||||||
my $path = $config{$section}{'path'};
|
my $path = $config{$section}{'path'};
|
||||||
|
|
||||||
|
@ -531,7 +533,7 @@ sub init {
|
||||||
tie my %ini, 'Config::IniFiles', ( -file => $conf_file ) or die "FATAL: cannot load $conf_file - please create a valid local config file before running sanoid!";
|
tie my %ini, 'Config::IniFiles', ( -file => $conf_file ) or die "FATAL: cannot load $conf_file - please create a valid local config file before running sanoid!";
|
||||||
|
|
||||||
# we'll use these later to normalize potentially true and false values on any toggle keys
|
# we'll use these later to normalize potentially true and false values on any toggle keys
|
||||||
my @toggles = ('autosnap','autoprune','monitor_dont_warn','monitor_dont_crit','monitor','recursive','monitor_children_only');
|
my @toggles = ('autosnap','autoprune','monitor_dont_warn','monitor_dont_crit','monitor','recursive','process_children_only');
|
||||||
my @istrue=(1,"true","True","TRUE","yes","Yes","YES","on","On","ON");
|
my @istrue=(1,"true","True","TRUE","yes","Yes","YES","on","On","ON");
|
||||||
my @isfalse=(0,"false","False","FALSE","no","No","NO","off","Off","OFF");
|
my @isfalse=(0,"false","False","FALSE","no","No","NO","off","Off","OFF");
|
||||||
|
|
||||||
|
@ -615,7 +617,7 @@ sub init {
|
||||||
foreach my $dataset(@datasets) {
|
foreach my $dataset(@datasets) {
|
||||||
chomp $dataset;
|
chomp $dataset;
|
||||||
foreach my $key (keys %{$config{$section}} ) {
|
foreach my $key (keys %{$config{$section}} ) {
|
||||||
if (! ($key =~ /template|recursive|monitor_children_only/)) {
|
if (! ($key =~ /template|recursive|children_only/)) {
|
||||||
if ($args{'debug'}) { print "DEBUG: recursively setting $key from $section to $dataset.\n"; }
|
if ($args{'debug'}) { print "DEBUG: recursively setting $key from $section to $dataset.\n"; }
|
||||||
$config{$dataset}{$key} = $config{$section}{$key};
|
$config{$dataset}{$key} = $config{$section}{$key};
|
||||||
}
|
}
|
||||||
|
|
15
sanoid.conf
15
sanoid.conf
|
@ -14,6 +14,21 @@
|
||||||
hourly = 12
|
hourly = 12
|
||||||
monthly = 1
|
monthly = 1
|
||||||
|
|
||||||
|
# you can also handle datasets recursively.
|
||||||
|
[zpoolname/parent]
|
||||||
|
use_template = production
|
||||||
|
recursive = yes
|
||||||
|
# if you want sanoid to manage the child datasets but leave this one alone, set process_children_only.
|
||||||
|
process_children_only = yes
|
||||||
|
|
||||||
|
# you can selectively override settings for child datasets which already fall under a recursive definition.
|
||||||
|
[zpoolname/parent/child]
|
||||||
|
# child datasets already initialized won't be wiped out, so if you use a new template, it will
|
||||||
|
# only override the values already set by the parent template, not replace it completely.
|
||||||
|
use_template = demo
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
# templates below this line #
|
# templates below this line #
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
path =
|
path =
|
||||||
recursive =
|
recursive =
|
||||||
use_template =
|
use_template =
|
||||||
monitor_children_only =
|
process_children_only =
|
||||||
|
|
||||||
# If any snapshot type is set to 0, we will not take snapshots for it - and will immediately
|
# If any snapshot type is set to 0, we will not take snapshots for it - and will immediately
|
||||||
# prune any of those type snapshots already present.
|
# prune any of those type snapshots already present.
|
||||||
|
|
2
syncoid
2
syncoid
|
@ -4,7 +4,7 @@
|
||||||
# from http://www.gnu.org/licenses/gpl-3.0.html on 2014-11-17. A copy should also be available in this
|
# from http://www.gnu.org/licenses/gpl-3.0.html on 2014-11-17. A copy should also be available in this
|
||||||
# project's Git repository at https://github.com/jimsalterjrs/sanoid/blob/master/LICENSE.
|
# project's Git repository at https://github.com/jimsalterjrs/sanoid/blob/master/LICENSE.
|
||||||
|
|
||||||
my $version = '1.2.0';
|
my $version = '1.3.0';
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
|
|
Loading…
Reference in New Issue