mirror of https://github.com/jimsalterjrs/sanoid
Merge branch 'jimsalterjrs:master' into ssh_config
This commit is contained in:
commit
21931bd8a6
|
|
@ -1,4 +1,10 @@
|
||||||
FreeBSD users will need to change the Perl shebangs at the top of the executables from #!/usr/bin/perl
|
Syncoid assumes a bourne style shell on remote hosts. Using (t)csh (the default for root under FreeBSD)
|
||||||
|
will cause syncoid to fail cryptically due to 2>&1 output redirects.
|
||||||
|
|
||||||
|
To use syncoid successfully with FreeBSD targets, you must use the chsh command to change the root shell:
|
||||||
|
root@bsd:~# chsh -s /bin/sh
|
||||||
|
|
||||||
|
FreeBSD users will also need to change the Perl shebangs at the top of the executables from #!/usr/bin/perl
|
||||||
to #!/usr/local/bin/perl in most cases.
|
to #!/usr/local/bin/perl in most cases.
|
||||||
|
|
||||||
Sorry folks, but if I set this with #!/usr/bin/env perl as suggested, then nothing works properly
|
Sorry folks, but if I set this with #!/usr/bin/env perl as suggested, then nothing works properly
|
||||||
|
|
@ -11,14 +17,3 @@ If you don't want to have to change the shebangs, your other option is to drop a
|
||||||
root@bsd:~# ln -s /usr/local/bin/perl /usr/bin/perl
|
root@bsd:~# ln -s /usr/local/bin/perl /usr/bin/perl
|
||||||
|
|
||||||
After putting this symlink in place, ANY perl script shebanged for Linux will work on your system too.
|
After putting this symlink in place, ANY perl script shebanged for Linux will work on your system too.
|
||||||
|
|
||||||
Syncoid assumes a bourne style shell on remote hosts. Using (t)csh (the default for root under FreeBSD)
|
|
||||||
has some known issues:
|
|
||||||
|
|
||||||
* If mbuffer is present, syncoid will fail with an "Ambiguous output redirect." error. So if you:
|
|
||||||
root@bsd:~# ln -s /usr/local/bin/mbuffer /usr/bin/mbuffer
|
|
||||||
make sure the remote user is using an sh compatible shell.
|
|
||||||
|
|
||||||
To change to a compatible shell, use the chsh command:
|
|
||||||
|
|
||||||
root@bsd:~# chsh -s /bin/sh
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,8 @@ And its /etc/sanoid/sanoid.conf might look something like this:
|
||||||
|
|
||||||
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, which follows the same template (since it's a child of data/images) but 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, which follows the same template (since it's a child of data/images) but only keeps 4 hourlies for whatever reason.
|
||||||
|
|
||||||
|
For more full details on sanoid.conf settings see [Wiki page](https://github.com/jimsalterjrs/sanoid/wiki/Sanoid#options).
|
||||||
|
|
||||||
**Note**: Be aware that if you don't specify some interval options the defaults will be used (from /etc/sanoid/sanoid.defaults.conf)
|
**Note**: Be aware that if you don't specify some interval options the defaults will be used (from /etc/sanoid/sanoid.defaults.conf)
|
||||||
|
|
||||||
##### Sanoid Command Line Options
|
##### Sanoid Command Line Options
|
||||||
|
|
|
||||||
31
syncoid
31
syncoid
|
|
@ -24,9 +24,9 @@ my %args = ('sshconfig' => '', 'sshkey' => '', 'sshport' => '', 'sshcipher' => '
|
||||||
GetOptions(\%args, "no-command-checks", "monitor-version", "compress=s", "dumpsnaps", "recursive|r", "sendoptions=s", "recvoptions=s",
|
GetOptions(\%args, "no-command-checks", "monitor-version", "compress=s", "dumpsnaps", "recursive|r", "sendoptions=s", "recvoptions=s",
|
||||||
"source-bwlimit=s", "target-bwlimit=s", "sshconfig=s", "sshkey=s", "sshport=i", "sshcipher|c=s", "sshoption|o=s@",
|
"source-bwlimit=s", "target-bwlimit=s", "sshconfig=s", "sshkey=s", "sshport=i", "sshcipher|c=s", "sshoption|o=s@",
|
||||||
"debug", "quiet", "no-stream", "no-sync-snap", "no-resume", "exclude=s@", "skip-parent", "identifier=s",
|
"debug", "quiet", "no-stream", "no-sync-snap", "no-resume", "exclude=s@", "skip-parent", "identifier=s",
|
||||||
"no-clone-handling", "no-privilege-elevation", "force-delete", "no-clone-rollback", "no-rollback",
|
"no-clone-handling", "no-privilege-elevation", "force-delete", "create-bookmark",
|
||||||
"create-bookmark", "pv-options=s" => \$pvoptions, "keep-sync-snap", "preserve-recordsize",
|
"pv-options=s" => \$pvoptions, "keep-sync-snap", "preserve-recordsize", "mbuffer-size=s" => \$mbuffer_size)
|
||||||
"mbuffer-size=s" => \$mbuffer_size) or pod2usage(2);
|
or pod2usage(2);
|
||||||
|
|
||||||
my %compressargs = %{compressargset($args{'compress'} || 'default')}; # Can't be done with GetOptions arg, as default still needs to be set
|
my %compressargs = %{compressargset($args{'compress'} || 'default')}; # Can't be done with GetOptions arg, as default still needs to be set
|
||||||
|
|
||||||
|
|
@ -291,11 +291,8 @@ sub syncdataset {
|
||||||
my $sourcefsescaped = escapeshellparam($sourcefs);
|
my $sourcefsescaped = escapeshellparam($sourcefs);
|
||||||
my $targetfsescaped = escapeshellparam($targetfs);
|
my $targetfsescaped = escapeshellparam($targetfs);
|
||||||
|
|
||||||
# if no rollbacks are allowed, disable forced receive
|
# keep forcedrecv as a variable to allow us to disable it with an optional argument later if necessary
|
||||||
my $forcedrecv = "-F";
|
my $forcedrecv = "-F";
|
||||||
if (defined $args{'no-rollback'}) {
|
|
||||||
$forcedrecv = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($debug) { print "DEBUG: syncing source $sourcefs to target $targetfs.\n"; }
|
if ($debug) { print "DEBUG: syncing source $sourcefs to target $targetfs.\n"; }
|
||||||
|
|
||||||
|
|
@ -343,6 +340,7 @@ sub syncdataset {
|
||||||
|
|
||||||
my $receiveextraargs = "";
|
my $receiveextraargs = "";
|
||||||
my $receivetoken;
|
my $receivetoken;
|
||||||
|
|
||||||
if ($resume) {
|
if ($resume) {
|
||||||
# save state of interrupted receive stream
|
# save state of interrupted receive stream
|
||||||
$receiveextraargs = "-s";
|
$receiveextraargs = "-s";
|
||||||
|
|
@ -684,21 +682,6 @@ sub syncdataset {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
my $matchingsnapescaped = escapeshellparam($matchingsnap);
|
my $matchingsnapescaped = escapeshellparam($matchingsnap);
|
||||||
# rollback target to matchingsnap
|
|
||||||
if (!defined $args{'no-rollback'}) {
|
|
||||||
my $rollbacktype = "-R";
|
|
||||||
if (defined $args{'no-clone-rollback'}) {
|
|
||||||
$rollbacktype = "-r";
|
|
||||||
}
|
|
||||||
if ($debug) { print "DEBUG: rolling back target to $targetfs\@$matchingsnap...\n"; }
|
|
||||||
if ($targethost ne '') {
|
|
||||||
if ($debug) { print "$sshcmd $targethost $targetsudocmd $zfscmd rollback $rollbacktype $targetfsescaped\@$matchingsnapescaped\n"; }
|
|
||||||
system ("$sshcmd $targethost " . escapeshellparam("$targetsudocmd $zfscmd rollback $rollbacktype $targetfsescaped\@$matchingsnapescaped"));
|
|
||||||
} else {
|
|
||||||
if ($debug) { print "$targetsudocmd $zfscmd rollback $rollbacktype $targetfsescaped\@$matchingsnapescaped\n"; }
|
|
||||||
system ("$targetsudocmd $zfscmd rollback $rollbacktype $targetfsescaped\@$matchingsnapescaped");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $nextsnapshot = 0;
|
my $nextsnapshot = 0;
|
||||||
|
|
||||||
|
|
@ -1491,7 +1474,7 @@ sub getssh {
|
||||||
if ($rhost ne "") {
|
if ($rhost ne "") {
|
||||||
if ($remoteuser eq 'root' || $args{'no-privilege-elevation'}) { $isroot = 1; } else { $isroot = 0; }
|
if ($remoteuser eq 'root' || $args{'no-privilege-elevation'}) { $isroot = 1; } else { $isroot = 0; }
|
||||||
# now we need to establish a persistent master SSH connection
|
# now we need to establish a persistent master SSH connection
|
||||||
$socket = "/tmp/syncoid-$rhost-" . time();
|
$socket = "/tmp/syncoid-$rhost-" . time() . "-" . int(rand(10000));
|
||||||
|
|
||||||
open FH, "$sshcmd -M -S $socket -o ControlPersist=1m $args{'sshport'} $rhost exit |";
|
open FH, "$sshcmd -M -S $socket -o ControlPersist=1m $args{'sshport'} $rhost exit |";
|
||||||
close FH;
|
close FH;
|
||||||
|
|
@ -1976,8 +1959,6 @@ Options:
|
||||||
--keep-sync-snap Don't destroy created sync snapshots
|
--keep-sync-snap Don't destroy created sync snapshots
|
||||||
--create-bookmark Creates a zfs bookmark for the newest snapshot on the source after replication succeeds (only works with --no-sync-snap)
|
--create-bookmark Creates a zfs bookmark for the newest snapshot on the source after replication succeeds (only works with --no-sync-snap)
|
||||||
--preserve-recordsize Preserves the recordsize on initial sends to the target
|
--preserve-recordsize Preserves the recordsize on initial sends to the target
|
||||||
--no-clone-rollback Does not rollback clones on target
|
|
||||||
--no-rollback Does not rollback clones or snapshots on target (it probably requires a readonly target)
|
|
||||||
--exclude=REGEX Exclude specific datasets which match the given regular expression. Can be specified multiple times
|
--exclude=REGEX Exclude specific datasets which match the given regular expression. Can be specified multiple times
|
||||||
--sendoptions=OPTIONS Use advanced options for zfs send (the arguments are filtered as needed), e.g. syncoid --sendoptions="Lc e" sets zfs send -L -c -e ...
|
--sendoptions=OPTIONS Use advanced options for zfs send (the arguments are filtered as needed), e.g. syncoid --sendoptions="Lc e" sets zfs send -L -c -e ...
|
||||||
--recvoptions=OPTIONS Use advanced options for zfs receive (the arguments are filtered as needed), e.g. syncoid --recvoptions="ux recordsize o compression=lz4" sets zfs receive -u -x recordsize -o compression=lz4 ...
|
--recvoptions=OPTIONS Use advanced options for zfs receive (the arguments are filtered as needed), e.g. syncoid --recvoptions="ux recordsize o compression=lz4" sets zfs receive -u -x recordsize -o compression=lz4 ...
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue