slbackup-0.0.12/ 0000755 0001750 0001750 00000000000 11332600740 012760 5 ustar werner werner slbackup-0.0.12/conf/ 0000755 0001750 0001750 00000000000 11332600730 013704 5 ustar werner werner slbackup-0.0.12/conf/slbackup-cron 0000644 0001750 0001750 00000000303 07753012002 016367 0 ustar werner werner # cron job for Skolelinux Backup (every night at 01:00)
#0 1 * * * root if [ -x /usr/share/slbackup/slbackup-cron -a -f /etc/slbackup/slbackup.conf ]; then /usr/share/slbackup/slbackup-cron ; fi
slbackup-0.0.12/conf/slbackup.conf 0000644 0001750 0001750 00000001517 10252673754 016403 0 ustar werner werner
address localhost
location /etc
location /home
location /var/backups
type local
user root
keep 185
#
# address extern.domain
# location /etc
# location /var/backups
# type extern
# user root
# keep 0
#
#
# address somehost.domain
# location /
# exclude /proc
# exclude /sys
# exclude /tmp
# exclude_regexp \.((?i)mpg|avi|mp3|mpeg|wma|wav)$
# type extern
# user root
# keep 0
#
server_address backupserver.domain
server_destdir /backup
server_type local
server_user root
slbackup-0.0.12/src/ 0000755 0001750 0001750 00000000000 11332600731 013547 5 ustar werner werner slbackup-0.0.12/src/SLBackup.pm 0000644 0001750 0001750 00000005311 10733265002 015553 0 ustar werner werner #!/usr/bin/perl
#
# Library for use with slbackup (Skolelinux Backup)
#
# Content:
# - deal with configuration files
# - deal with log files
#
# $Id: SLBackup.pm,v 1.6 2007-12-22 19:48:18 finnarne-guest Exp $
#
# Most of the code in this module is copied from the
# LRRD project (http://www.linpro.no/project/lrrd/)
#
# Thanks to Linpro AS for well written perl code!
#
package SLBackup;
use POSIX qw(strftime);
use Exporter;
@ISA = ('Exporter');
@EXPORT = ('run_scripts',
'slbackup_overwrite',
'slbackup_readconfig',
'slbackup_writeconfig',
'slbackup_config' );
use strict;
use Config::General;
my $config = undef;
my $configfile = '/etc/slbackup/slbackup.conf';
my $DEBUG = 0;
sub slbackup_readconfig {
my ($conf, $missingok) = @_;
$conf ||= $configfile;
if (! -r $conf and ! $missingok) {
print "slbackup_readconfig: cannot open '$conf'\n";
return undef;
}
my $conffile = new Config::General(-ConfigFile => $conf,
-CComments => 0);
my $config = { $conffile->getall };
return ($config);
}
sub slbackup_writeconfig {
my ($datafilename, $data) = @_;
my $datafile = new Config::General();
$datafile->save_file($datafilename, $data);
}
# subroutine that runs scripts in a directory which is executable
# returns:
# 1: successfully executed all scripts in directory
# -1: failed reading $dir
# -2: one or more of the script failed while executing
sub run_scripts {
my ($dir, $logfile, $debug) = @_;
open (LOG, ">>$logfile") or die ("Unable to open $logfile\n");
logger ("Start running executables in $dir.");
# check that $dir is a directory
if ( ! -d $dir || ! -r $dir ) {
logger ("Failed reading files in script-directory $dir");
return -1;
}
# find and execute all executables in $dir
my $subretval = 1;
my @scripts = `find $dir/ -type f; find $dir/ -type l`;
my $script;
foreach $script (sort @scripts) {
# strip newline
$script =~ tr/\n//d;
# is $script executable?
if ( -x $script ) {
my $output = `$script 2>&1`;
my $retval = $?;
if ($debug) {
logger ("Debug-output from $script:\n $output\n" .
"Debug-output from $script ended.");
}
if ( $retval eq 0) {
logger ("Successfully run $script: \n$output");
} elsif ( $retval ne 0 ) {
$subretval = -2;
logger ("Unsuccessfully run $script:\n$output");
} else {
logger ("Something strange happened to $script:\n$output");
}
}
}
logger ("Finished running executables in $dir.");
close (LOG);
return $subretval;
}
sub logger {
my ($comment) = @_;
my $now = strftime "%b %d %H:%M:%S", localtime;
printflush LOG ("$now - $comment\n");
}
1;
__END__
slbackup-0.0.12/src/slbackup-cron 0000755 0001750 0001750 00000033551 10747636261 016267 0 ustar werner werner #!/usr/bin/perl
#
# Script to be run by cron each night (or whatever) to backup locations
# specified in the configuration file (/etc/slbackup/slbackup.conf by default).
#
# $Id: slbackup-cron,v 1.22 2008-01-29 14:48:17 finnarne-guest Exp $
#
#use strict; # failed with getopts.pl
use Config::General;
use POSIX qw(strftime);
use Net::DNS;
use SLBackup;
require 'getopts.pl';
sub usage() {
print <<_EOUSAGE_;
Usage: $0 [-c ] [-l ] [-r ] [-o ]
[-s ]
-c Name and location of the configurationfile (default is
/etc/slbackup/slbackup.conf).
-l Name and location for the logfile (default is
/var/log/slbackup/slbackup.log).
-r Name and location of the directory that contains
the scripts that shall run before the backup session
starts (default is /etc/slbackup/pre.d/).
-o Name and location of the directory that contains
the scripts that shall run after the backup session
has finished (default is /etc/slbackup/post.d/).
-s Name and location of the logfile pre- and
post-scripts (default is
/var/log/slbackup/run_scripts.log).
-h Display this usage-info.
-v Verbose output to the logfile(s).
_EOUSAGE_
exit 0;
}
# parse commandline
&Getopts ("c:l:r:o:s:hv") || &usage();
my $conffile = $opt_c || "/etc/slbackup/slbackup.conf";
my $logfile = $opt_l || "/var/log/slbackup/slbackup.log";
my $scripts_predir = $opt_r || "/etc/slbackup/pre.d";
my $scripts_postdir = $opt_o || "/etc/slbackup/post.d";
my $scripts_logfile = $opt_s || "/var/log/slbackup/run_scripts.log";
my $debug = 0;
$debug = 1 if $opt_v;
&usage() if $opt_h;
# errorsets = Number of backup sets (clients) from config for which
# rdiff-backup fails
my $errorclients = 0;
# open logfile
open (LOG, ">>$logfile") or die ("Unable to open $logfile\n");
logger ("Starting slbackup:");
# debug-output
if ($debug) {
logger ("Debug-output:\n" .
" conffile : $conffile\n" .
" logfile : $logfile\n" .
" scripts_predir : $scripts_predir\n" .
" scripts_postdir : $scripts_postdir\n" .
" scripts_logfile : $scripts_logfile\n" .
"End debug-output.");
}
# fetch configuration
my $config;
if (-r $conffile) {
$config = &slbackup_readconfig($conffile);
} else {
logger ("Unable to read config file ($conffile), exiting.");
logger ("Finished slbackup.");
close (LOG);
die ("Unable to open config file ($conffile), \nexiting ");
}
# run executables in $scripts_predir
my $retval_predir = &run_scripts($scripts_predir, $scripts_logfile, $debug);
if ( $retval_predir eq 1 ) {
logger ("Successfully running scripts in $scripts_predir.");
} elsif ( $retval_predir eq -1 ) {
logger ("Failed reading $scripts_predir.");
$errorclients += 1;
} elsif ( $retval_predir eq -2 ) {
logger ("Failed to run one or more scripts in $scripts_predir.");
$errorclients += 1;
} else {
logger ("Something strange happened when running scripts in\n" . \
"$scripts_predir");
$errorclients += 1;
}
# run rdiff-backup for each client in configuration
for my $key (keys %{$config->{client}}) {
my $client = $config->{client}->{$key};
my $execstr = "";
my $execstr_serverpart = "";
my $execstr_clientpart = "";
# check if server is not of type "local" ->
# add server-part of the exeecstr in a
if (exists ($config->{server_type}) and
$config->{server_type} ne "local") {
# check if server_address is present in configuration
if (!exists ($config->{server_address})) {
logger ("Address for server is not present in configuration " .
"file... please fix!");
logger("Failed backing up clients.");
$errorclients += 1;
last;
}
# check if server_address is valid:
if (!$config->{server_address} =~ '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$') {
# server_address doesn't seem to be an IP...
# let's try to look up the host's addresses:
my $dns_res = Net::DNS::Resolver->new;
my $query = $dns_res->search($config->{server_address});
if (!$query) {
logger ("Couldn't resolve host " .
"\'$config->{server_address}\' ");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
}
# check if server_user is present in configuration
if (!exists ($config->{server_user})) {
logger ("Username for server is not present in configuration " .
"file... please fix!");
logger("Failed backing up clients.");
$errorclients += 1;
last;
}
# test if ssh-connection to server works ok
my $sshteststr = "ssh -o BatchMode=yes " .
"$config->{server_user}" . "@" .
"$config->{server_address} 'echo -n 1'";
if (`$sshteststr` ne "1") {
logger ("ssh-connection to server $key failed...");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
# test that rdiff-backup has the same version as here
$sshteststr = "ssh $config->{server_user}" . "@" .
"$config->{server_address} 'rdiff-backup -V'";
if (`$sshteststr` ne `rdiff-backup -V`) {
logger ("rdiff-backup does not have the same version on " .
"this computer and the backup server... please fix!");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
# test that the destination dir exists
my $testcondition = "test -d $config->{server_destdir} " .
"&& echo -n ok";
$sshteststr = "ssh $config->{server_user}" . "@" .
"$config->{server_address} '$testcondition'";
if (`$sshteststr` ne `echo -n ok`) {
logger ("Destination directory (server_destdir) does not seem \n" .
"to exist on the backup server... please fix!");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
# the server-part of the configuration shall be ok, so
# build server-part of execstr and continue
$execstr_serverpart =
"$config->{server_user}\@$config->{server_address}::";
} else {
# the server is the localhost, then checking that the destination
# directory exists
if (! -d $config->{server_destdir}) {
logger ("Destination directory (server_destdir) does not seem \n" .
"to exist on the backup server... please fix!");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
}
# check if destination directory on backup server is represented in
# configuration file -> return, else add it :)
if (!exists ($config->{server_destdir})) {
logger ("Destination directory on the server is not specified " .
"in the configuration... please fix!");
logger ("Failed backing up clients.");
$errorclients += 1;
last;
}
$execstr_serverpart .= "$config->{server_destdir}/$key";
# start with the client-handling
logger ("Starting backup of client $key");
# check if client not is of type "local" ->
# - check if necessary configuration options are present
# - check if ssh-connection is ok
# - check if rdiff-backup is the same version as here
if (exists ($config->{client}->{$key}->{type}) and
$config->{client}->{$key}->{type} ne "local") {
# check that address is provided
if (!exists ($config->{client}->{$key}->{address})) {
logger ("Address for client $key is not present in " .
"configuration... please fix!");
logger ("Backup of client $key failed.");
$errorclients += 1;
next;
}
# check if the client's address is valid:
if (!$config->{client}->{$key}->{address} =~ '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$')
{
# address doesn't seem to be an IP...
# let's try to look up the host's addresses:
my $dns_res = Net::DNS::Resolver->new;
my $query = $dns_res->search($config->{client}->{$key}->{address});
if (!$query)
{
logger ("Couldn't resolve host " .
"\'$config->{client}->{$key}->{address}\' ");
logger ("Backup of client $key failed.");
$errorclients += 1;
next;
}
}
# check that username is provided
if (!exists ($config->{client}->{$key}->{user})) {
logger ("Username for client $key is not present in " .
"configuration... please fix!");
logger ("Backup of client $key failed");
$errorclients += 1;
next;
}
# test that ssh connection to the client works ok
my $sshteststr = "ssh -o BatchMode=yes " .
"$config->{client}->{$key}->{user}" . "@" .
"$config->{client}->{$key}->{address} 'echo -n 1'";
if (`$sshteststr` ne "1") {
logger ("ssh-connection to $key failed...");
logger ("Failed backing up client $key.");
$errorclients += 1;
next;
}
# test that rdiff-backup on the client is the same version as here
$sshteststr = "ssh $config->{client}->{$key}->{user}" . "@" .
"$config->{client}->{$key}->{address} 'rdiff-backup -V'";
if (`$sshteststr` ne `rdiff-backup -V`) {
logger ("rdiff-backup does not have the same version on this " .
"computer and the client $key... please fix!");
logger ("Failed backing up client $key.");
$errorclients += 1;
next;
}
# client configuration shall be ok, so we continue:
# add client address in the client-part of execstr
$execstr_clientpart .=
"$config->{client}->{$key}->{user}\@" .
"$config->{client}->{$key}->{address}::";
}
# add the common part of the client execstring
# (specify '/' as the location)
$execstr_clientpart .= "/";
# build execute string
$execstr = "rdiff-backup --print-statistics ";
# support for the --exclude-regexp option to rdiff-backup
if (exists ($config->{exclude_regexp}) ) {
$execstr .= "--exclude-regexp '$config->{exclude_regexp}' ";
}
if (exists ($config->{client}->{$key}->{exclude})) {
if (ref ($config->{client}->{$key}->{exclude}) eq "ARRAY") {
# there is more than one location to exclude (=> exclude
# is an array)
for my $loc (@{$config->{client}->{$key}->{exclude}}) {
$execstr .= "--exclude '$loc' ";
}
} else {
# there is only one location to exclude (=> exclude is a string)
my $loc = $config->{client}->{$key}->{exclude};
$execstr .= "--exclude '$loc' ";
}
}
# We don't want to cause an endless loop... ;)
if (exists ($config->{client}->{$key}->{type}) and
$config->{client}->{$key}->{type} eq "local") {
$execstr .= "--exclude $config->{server_destdir} ";
}
# include clients locations if exists
if (!exists ($config->{client}->{$key}->{location})) {
logger ("Locations for client $key is not present in " .
"configuration... please fix!");
logger ("No files from client $key will be backed up.");
$errorclients += 1;
next;
} elsif (ref ($config->{client}->{$key}->{location}) eq "ARRAY") {
# there are more than one location => location is an array
for my $loc (@{$config->{client}->{$key}->{location}}) {
$execstr .= "--include '$loc' ";
}
} else {
# there is only one location => location is a string
my $loc = $config->{client}->{$key}->{location};
$execstr .= "--include '$loc' ";
}
# exclude everything else
$execstr .= "--exclude '/*' ";
# include client-part and server-part
$execstr .= "$execstr_clientpart $execstr_serverpart";
# before backing up, remove old backups
my $client_keep;
if (($client_keep = $config->{client}->{$key}->{keep}) and
($client_keep gt 0)) {
my $removestr = "rdiff-backup --force --remove-older-than ";
$removestr .= "$client_keep" . "D ";
my $server_type = $config->{server_type};
my $server_destdir = $config->{server_destdir};
my $server_address = $config->{server_address};
my $server_user = $config->{server_user};
if ($server_type ne "local") {
$removestr .= "$server_user" . "@" . "$server_address" . "::";
}
if (grep (/\/$/, $server_destdir)) {
$removestr .= "$server_destdir";
} else {
$removestr .= "$server_destdir" . "/";
}
$removestr .= "$key";
# remove backups older than $client_keep
#FIXME - check if there are backups there...
logger ("Trying to remove backups older than $client_keep days:");
my $output .= `$removestr 2>&1`;
logger ("$output");
# 0 mean success -> invert it
my $retval = ! $?;
# log
if ($retval) {
logger ("Removing backups older than $client_keep days succeeded!");
} else {
logger ("Failed removing backups older than $client_keep (not critical).");
}
}
if ($debug) {
logger ("Will run: $execstr\n") ;
}
# run rdiff-backup for client $key
my $output .= `$execstr 2>&1`;
logger ("\n$output");
# 0 mean success -> invert it
my $retval = ! $?;
# log
if ($retval) {
logger ("Successfully finished backing up client $key");
} else {
logger ("Failed backing up client $key");
$errorclients += 1;
}
}
# run executables in $scripts_postdir
my $retval_postdir = &run_scripts($scripts_postdir, $scripts_logfile, $debug);
if ( $retval_postdir eq 1 ) {
logger ("Successfully running of scripts in $scripts_postdir.");
} elsif ( $retval_postdir eq -1 ) {
logger ("Failed reading $scripts_postdir.");
$errorclients += 1;
} elsif ( $retval_postdir eq -2 ) {
logger ("Failed to run one or more scripts in $scripts_postdir.");
$errorclients += 1;
} else {
logger ("Something strange happened when running scripts in\n" . \
"$scripts_postdir");
$errorclients += 1;
}
logger ("Finished slbackup.");
close (LOG);
sub logger {
my ($comment) = @_;
my $now = strftime "%b %d %H:%M:%S", localtime;
printflush LOG ("$now - $comment\n");
}
if ( $errorclients gt 0 ) {
# exit 1 if any of the client's failed
print STDERR "Error: backup failed for one or more of your clients.\n";
print STDERR " Please take a look at $logfile for details.\n";
exit 1;
}
exit 0;
slbackup-0.0.12/TODO 0000644 0001750 0001750 00000000351 07760703255 013466 0 ustar werner werner TODO for slbackup
------------------
The TODO-list has moved to the Bug- and Feature-tracker on Alioth:
http://alioth.debian.org/projects/slbackup/
-- Morten Werner Olsen Tue, 25 Nov 2003 17:44:23 +0100
slbackup-0.0.12/CHANGELOG 0000644 0001750 0001750 00000005476 11332405244 014210 0 ustar werner werner New in v0.0.12 (2010/02/04)
----------------------------
o Encapsulate arguments (locations) for rdiff-backup (thanks to
Finn-Arne Johansen for fixing this).
New in v0.0.11 (2007/12/23)
----------------------------
o Don't leave out things from config-file just because it looks like
a C-Comment (Closes Skolelinux bug #1002) (thanks to
Finn-Arne Johansen for fixing this!).
o Show the commandline to be run if running in verbose/debug mode
(thanks to Finn-Arne Johansen).
New in v0.0.10 (2006/02/11)
----------------------------
o Now only testing for server == or != 'local' in slbackup-cron
(thanks to Finn-Arne Johansen for finding this "bug")
o slbackup-cron is not failing when removal of older backups fail as
this does happen also when no old backup's exist.
New in v0.0.9 (2006/02/03)
---------------------------
o Now slbackup-cron "exit 1;" if backup for one of the clients fails.
o Fixed typo in usage () of slbackup-cron (thanks to Finn-Arne Johansen).
o A Munin-plugin by Finn-Arne Johansen (contrib/munin-plugin).
o Fixed a typo in the configfile-test (now dies if config file is not
present).
New in v0.0.8 (2005/08/28)
---------------------------
o Fixed a bug causing symlinks not to be run in pre.d and post.d.
o Added support for the --exclude-regexp rdiff-backup option with
the exclude_regexp option to slbackup.conf .
New in v0.0.7 (2004/12/19)
---------------------------
o Added commandline options to slbackup-cron for the most common
options and also allowed more verbose (debug-)output to the
logfile(s).
o Added checking of the destination directory on the backup server.
o Added running of scripts (in specified dirs) before and after
backup session.
o Changed from using the ssh-option PasswordAuthentication=no to
BatchMode=yes in src/slbackup-cron as the first one didn't seem to
work as I expected (thanks to Klaus Johnstad for bugreport).
o Added address checking in src/slbackup-cron.
o Added the exclude-option.
New in v0.0.6 (2003/11/30)
---------------------------
o bugfix: slbackup didn't handle configuration files with only one
location for a client
New in v0.0.5 (2003/11/12)
---------------------------
o slbackup now deletes backups older than a number of days (specified on
a per client basis in the configuration)
New in v0.0.4 (2003/11/08)
---------------------------
o New version due to moving source to alioth.debian.org.
o Probably forgot something here...
New in v0.0.3 (2003/11/02)
---------------------------
o fixing bug in cron-job
New in v0.0.2 (2003/11/02)
---------------------------
o Added /usr/share/doc/slbackup/examples/ with one example on how
to configure slbackup on a combined File server/LTSP-server
Skolelinux installation.
New in v0.0.1 (2003/11/01)
---------------------------
o Initial Release.
slbackup-0.0.12/docs/ 0000755 0001750 0001750 00000000000 11332600731 013710 5 ustar werner werner slbackup-0.0.12/docs/users_manual.nb.sgml 0000644 0001750 0001750 00000012033 10002451652 017666 0 ustar werner werner
slbackup: Users manual
Ved aktiv bruk av IT-systemer, er det vanlig at harddisker og andre
deler i systemet feiler. Det er også vanlig at brukere er uheldige og
sletter filer. Grunnen til å ha et backupsystem er at man i disse
tilfellene har en mulighet til å komme tilbake til der man var før
uhellet var ute.
Kostnadene ved det å ha et backupsystem, kan egentlig deles i to;
utstyr og arbeid. Utstyret du trenger er stort sett en stor harddisk
som har plass til alt du skal ta backup av i tillegg til de historiske
endringene du ønsker å lagre. Det vil si hvis du ønsker å ta vare på
backup i et halvt år, må du, hvis du bruker backupsystemet i
Skolelinux, lagre alle endringene som har skjedd dette halve året. Det
finnes backupsystemer som tar vare på daglig backup i en uke,
ukentlige backup i en måned, månedlige backup i et år osv, men det
backupsystemet som er brukt i Skolelinux tar vare på alle endringer
fra dag til dag i den tiden du ønsker dette.
Forslag til anbefalt diskplass for backup basert på 2 måneders
statistikk fra skolene i Time kommune, Runni ungdomsskole og Ulsrud
VGS. NB! dette er kun et forslag.
Antall brukere
3 mnd.
6 mnd.
12 mnd.
10
0,8GB
1,4GB
2,66GB
100
7,8GB
14GB
26GB
500
40GB
70GB
130GB
Arbeidskostnaden med backup er hovedsakelig forbundet med gjenskapning
av tapte data. To typiske eksempler på dette er at en bruker har ved
et uhell slettet filer/kataloger på hjemmeområdet sitt og ønsker disse
tilbake og at en maskin eller harddisk har blitt ødelagt og man ønsker
tilbake viktige data på denne.
Skolelinux Backup
Skolelinux kommer med et ferdig konfigurert og igangsatt backupsystem,
``Skolelinux Backup''. For å forklare hvordan tjenesten ``Skolelinux
Backup'' er bygd opp, er det tre roller i backupsystemet som må være
definert:
tjener
Maskinen som ``Skolelinux Backup'' er installert på,
hvor konfigurasjonsfilen ligger og eventuelt Webmin-modulen er
installert.
backupklient
En maskin som er definert som klient i konfigurasjonen
til ``Skolelinux Backup''. Maskinen(e) som har denne rollen, blir tatt
backup av.
backuptjener
En maskin som er definert som backuptjener i
konfigurasjonen til ``Skolelinux Backup''. Det er på denne maskinen
backup lagres.
En viktig ting å huske på, er at en maskin kan ha flere av disse
rollene, men kun en maskin kan inneha rollene tjener og backuptjener
(kan være på samme eller forskjellig maskin) og flere maskiner kan ha
rollen backupklient.
Hver natt starter backuptjenesten på maskinen som har tjener-rollen. Her
blir backupklientene behandlet i rekkefølge, hvor de filene/katalogene
som er oppgitt for den backupklienten i konfigurasjonsfilen blir tatt
backup av. Backupen blir plassert på backuptjeneren.
Følgende aksjoner i forbindelse med backupsystemet er nødvendige:
Konfigurere, beskrevet i
kapittel ref:configuration
Gjenskape data, beskrevet i
kapittel ref:restore
Konsistenssjekke backupsystemet, beskrevet i
kapittel ref:konsistens
Installasjon
Installasjonen av backupsystemet på tjenermaskinen gjøres når du
installerer Skolelinux. Hvis du ønsker å ta backup av flere enn
tjenermaskinen, eller ønsker å lagre backup på en annen maskin enn
tjener, krever dette at du installerer noe programvare.
Ny klient
Hvis du ønsker å ta backup av flere enn tjenermaskinen, f.eks. en
LTSP-tjener, må du på denne maskinen installere følgende programpakker
(gjøres f.eks. med {\small \it apt-get install}):
rdiff-backup
ssh
For at backupsystemet faktisk skal ta backup av denne klienten, må den
også legges til i konfigurasjonen. Se kapittel~\ref{ch:konfigurasjon}
for en detaljert beskrivelse av dette.