Script para um backup incremental do sistema de arquivos

3

Gostaria de executar o seguinte script incompleto semanalmente como uma tarefa cron para fazer backup do meu diretório inicial em uma unidade externa montada como / mnt / backups

#!/bin/bash
#

TIMEDATE=$(date +%b-%d-%Y-%k:%M)

LASTBACKUP=pathToDirWithLastBackup

rsync -avr --numeric-ids --link-dest=$LASTBACKUP /home/myfiles /mnt/backups/myfiles$TIMEDATE

Minha primeira pergunta é como configurar corretamente LASTBACKUP para o diretório / backs criado mais recentemente?

Em segundo lugar, tenho a impressão de que o uso de --link-desk significará que os arquivos em backups anteriores não serão copiados em backups posteriores, se ainda existirem, mas terão um link simbólico para os arquivos copiados originalmente? No entanto, não quero manter arquivos antigos para sempre. Qual seria a melhor maneira de remover todos os backups antes de uma determinada data sem perder arquivos que possam achar vinculados a esses backups por backups atuais? Basicamente eu estou olhando para mesclar todos os arquivos antes de uma certa data para uma determinada data, se isso faz mais sentido do que a forma como eu inicialmente enquadrou a questão :). Can --link-dest cria links físicos e, em caso afirmativo, apenas excluir diretórios anteriores não removeria o arquivo vinculado?

Finalmente, gostaria de adicionar uma linha ao meu script que comprime cada pasta de backup recém-criada (/ mnt / backups / myfiles $ TIMEDATE). Com base no lendo esta questão , gostaria de saber se poderia usar essa linha

gzip --rsyncable /backups/myfiles$TIMEDATE

depois que eu executo o rsync para que as execuções rsync -link-dest seqüenciais encontrem arquivos já copiados e compactados?

Eu sei que é muito, muito obrigado antecipadamente pela sua ajuda !!

    
por Evan 07.01.2011 / 20:09

4 respostas

7

Você pode querer usar uma ferramenta que automatize todo o processo para você, como rsnapshot , que parece implementar o que você está tentando fazer.

    
por Ryan Thompson 07.01.2011 / 21:12
4

Uma pergunta por vez, só responderei à primeira pergunta e você poderá postar as outras perguntas para outra pergunta:

Para saber qual foi o último diretório de backup, basta adicionar:

echo /mnt/backups/myfiles$TIMEDATE > /mnt/backups/last.dir

Até o final do script e altere seu LASTBACKUP = para:

LASTBACKUP='cat /mnt/backups/last.dir'

Dessa forma, você sempre saberá que vai usar o último diretório de backup completo e não quaisquer outros arquivos / pastas criados nesse diretório, ou pastas de backup que falharam (o que criaria uma massa de duplicação)

    
por Martin Owens -doctormo- 07.01.2011 / 20:54
2

Você pode usar o rsync.

Listing one: make_snapshot.sh

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility
# ----------------------------------------------------------------------
# this needs to be a lot more general, but the basic idea is it makes
# rotating backup-snapshots of /home whenever called
# ----------------------------------------------------------------------

unset PATH  # suggestion from H. Milz: avoid accidental use of $PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;

RSYNC=/usr/bin/rsync;


# ------------- file locations -----------------------------------------

MOUNT_DEVICE=/dev/hdb1;
SNAPSHOT_RW=/root/snapshot;
EXCLUDES=/usr/local/etc/backup_exclude;


# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( '$ID -u' != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
    exit;
}
fi;


# rotating snapshots of /home (fixme: this should be more general)

# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home/hourly.3 ] ; then         \
$RM -rf $SNAPSHOT_RW/home/hourly.3 ;                \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home/hourly.2 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.2 $SNAPSHOT_RW/home/hourly.3 ; \
fi;
if [ -d $SNAPSHOT_RW/home/hourly.1 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.1 $SNAPSHOT_RW/home/hourly.2 ; \
fi;

# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/home/hourly.0 ] ; then         \
$CP -al $SNAPSHOT_RW/home/hourly.0 $SNAPSHOT_RW/home/hourly.1 ; \
fi;

# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other
# snapshot(s) too!
$RSYNC                              \
    -va --delete --delete-excluded              \
    --exclude-from="$EXCLUDES"              \
    /home/ $SNAPSHOT_RW/home/hourly.0 ;

# step 5: update the mtime of hourly.0 to reflect the snapshot time
$TOUCH $SNAPSHOT_RW/home/hourly.0 ;

# and thats it for home.

# now remount the RW snapshot mountpoint as readonly

$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
    exit;
} fi;

e o segundo:

Listing two: daily_snapshot_rotate.sh

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility: daily snapshots
# ----------------------------------------------------------------------
# intended to be run daily as a cron job when hourly.3 contains the
# midnight (or whenever you want) snapshot; say, 13:00 for 4-hour snapshots.
# ----------------------------------------------------------------------

unset PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;

# ------------- file locations -----------------------------------------

MOUNT_DEVICE=/dev/hdb1;
SNAPSHOT_RW=/root/snapshot;

# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( '$ID -u' != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
    exit;
}
fi;


# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home/daily.2 ] ; then          \
$RM -rf $SNAPSHOT_RW/home/daily.2 ;             \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home/daily.1 ] ; then          \
$MV $SNAPSHOT_RW/home/daily.1 $SNAPSHOT_RW/home/daily.2 ;   \
fi;
if [ -d $SNAPSHOT_RW/home/daily.0 ] ; then          \
$MV $SNAPSHOT_RW/home/daily.0 $SNAPSHOT_RW/home/daily.1;    \
fi;

# step 3: make a hard-link-only (except for dirs) copy of
# hourly.3, assuming that exists, into daily.0
if [ -d $SNAPSHOT_RW/home/hourly.3 ] ; then         \
$CP -al $SNAPSHOT_RW/home/hourly.3 $SNAPSHOT_RW/home/daily.0 ;  \
fi;

# note: do *not* update the mtime of daily.0; it will reflect
# when hourly.3 was made, which should be correct.

# now remount the RW snapshot mountpoint as readonly

$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
    exit;
} fi;

Depois de criar o script de acordo com as suas necessidades, adicione-o a tarefas agendadas.

  

crontab -e

adicione o seguinte:

  

0 * / 4 * * * /usr/local/bin/make_snapshot.sh

     

0 13 * * * /usr/local/bin/daily_snapshot_rotate.sh

Eles fazem com que o make_snapshot.sh seja executado a cada quatro horas na hora e o daily_snapshot_rotate.sh seja executado todos os dias às 13:00 (ou seja, 1:00 PM).

fonte: link

* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Se você deseja que ele seja executado por hora, você adicionaria uma tarefa cron para cada hora.

Outra opção possível é usar o rsnapshot

  1. Instale o rsnapshot (disponível no centro de software)

  2. Configure o rsnapshot e especifique o diretório de origem de backup

Abra o arquivo /etc/rsnapshot.conf e descomente as seguintes linhas.

# nano /etc/rsnapshot.conf

cmd_cp          /bin/cp
cmd_ssh /usr/bin/ssh
cmd_du          /usr/bin/du
cmd_rsnapshot_diff      /usr/local/bin/rsnapshot-diff
logfile /var/log/rsnapshot
  1. Defina seus diretórios de backup de destino em /etc/rsnapshot.conf conforme mostrado abaixo. Neste exemplo,

    / home - diretório de origem que deve ser armazenado em backup localhost / - diretório de destino onde o backup será armazenado. Por favor, note que este diretório será criado no diretório /.snapshots/{internal.n}/ como mostrado na última etapa.

    nano /etc/rsnapshot.conf

    backup / home / localhost /

  2. Teste a configuração do rsnapshot

Realize o teste de configuração para garantir que o rsnapshot esteja configurado corretamente e pronto para executar o backup do linux rsync.

# rsnapshot configtest
Syntax OK
  1. Verificar a configuração de backup por hora do rsnapshot

Você pode fazer backup de diretórios ou arquivos do Linux em vários intervalos. Por padrão, os backups por hora e diários são configurados.

Verifique a configuração de backup por hora.

# rsnapshot -t hourly
echo 6490 > /var/run/rsnapshot.pid
mkdir -m 0700 -p /.snapshots/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /home \
/.snapshots/hourly.0/localhost/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc \
/.snapshots/hourly.0/localhost/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
/usr/local /.snapshots/hourly.0/localhost/
touch /.snapshots/hourly.0/
  1. Verificar a configuração de backup diário do rsnapshot

Verifique se o processo diário de backup do rsnapshot cwrsync está configurado corretamente.

# rsnapshot -t daily
echo 6493 > /var/run/rsnapshot.pid
mkdir -m 0700 -p /.snapshots/
/.snapshots/hourly.5 not present (yet), nothing to copy
  1. Adicionar entrada do Crontab para rsnapshot

Depois de verificar se as configurações de backup por hora e diárias do rsync estão configuradas corretamente no utilitário rsnapshot cwrsync, é hora de configurar esse filhote no crontab, conforme mostrado abaixo.

# crontab -e
0 */4 * * * /usr/local/bin/rsnapshot hourly
30 23 * * * /usr/local/bin/rsnapshot daily

fonte: link

    
por cprofitt 16.11.2011 / 15:28
1

Então tentarei responder a segunda (e terceira) pergunta: --link-dest cria hard links adicionais para arquivos existentes no sistema de arquivos de destino. O número após as permissões de acesso é a "contagem de links", informa quantos links (acho nomes de arquivos) apontam para o arquivo. Por exemplo:

$ touch x
$ ls -l
-rw-rw-r-- 1 frank frank 0 2011-01-07 22:18 x
$ ln x y
$ ls -l
-rw-rw-r-- 2 frank frank 0 2011-01-07 22:18 x

Você pode simplesmente rm -rf backups antigos. rm significa unlink . Diminui a contagem de links de um arquivo. Um sistema de arquivos irá apenas sobrescrever arquivos com uma contagem de links de zero. Se você criar arquivos adicionais com o gzip, eles usarão apenas espaço extra e você perderá a vantagem dos links físicos.

    
por Frank 07.01.2011 / 22:27