Podgląd pojedynczego posta
Stary 23.11.2012, 18:05   #59
sobrus
Jukebox Hero
 
Avatar użytkownika sobrus
 
Data rejestracji: 17.09.2004
Lokalizacja: Back for the Attack
Posty: 10,800
sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>sobrus ma z czego być dumnym <1000 - 1499 pkt>
To jest główny skrypt do backupów rsyncem.

Wystarczy go uruchamiać cyklicznie co jeden dzień i sam zatroszczy się o backup i trzymanie kopii przez 3 miesiące.

Użycie jest proste:

Kod:
_backup katalog_źródłowy katalog_docelowy [FSL]
Trzeci parametr FSL (follow symbolic links) - powoduje że kopiowane są docelowe obiekty dowiązań symbolicznych, czasem się może przydać

W katalogu docelowym tworzone są katalogi na kopie oraz trzy pliki "timestampy" które zawierają informację kiedy był ostatni backup.
Skrypt sam "postarza" kopie i usuwa najstarszą.

W sekcjach exclude dla rsynca trzeba wypisać katalogi których nie chcemy backupować (u mnie np. /a, /nas itp).

Kod jest może nieoptymalny i brzydki ale przecież nigdy nie miał być prezentowany


Kod:
#!/bin/bash
DIR="$2";

#parametry
if [ -z "$1" ];
then
  echo "Brak katalogu źródłowego";
  exit;
fi;

if [ -z "$2" ];
then
  echo "Brak katalogu docelowego";
  exit;
fi;

if [ "$3" == "FSL" ];
then
  PAR="--copy-dirlinks";
fi;

#utwórz katalogi
if [ ! -d $DIR/D3 ];
then
  mkdir $DIR/D0;
  mkdir $DIR/D1;
  mkdir $DIR/D2;
  mkdir $DIR/D3;
  mkdir $DIR/T0;
  mkdir $DIR/T1;
  mkdir $DIR/T2;
  mkdir $DIR/T3;
  mkdir $DIR/M0;
  mkdir $DIR/M1;
  mkdir $DIR/M2;
  mkdir $DIR/M3;
fi;

#dzienny
CD=$(date +%y%m%d);
GO='NIE';

if [ ! -e $DIR/daystamp ];
then
  GO='TAK';
else
  LD=$(cat $DIR/daystamp | head -1);
  if [ "$CD" \> "$LD" ];
    then GO='TAK'
  fi;
fi;

if [ "$GO" == "TAK" ];
then
  mv $DIR/D3 $DIR/DX
  mv $DIR/D2 $DIR/D3
  mv $DIR/D1 $DIR/D2
  mv $DIR/D0 $DIR/D1
  mv $DIR/DX $DIR/D0
  cp -al $DIR/D1/. $DIR/D0
  rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/D0
  echo $CD > $DIR/daystamp
fi;

#tygodniowy

CD=$(date --date="tomorrow" +%Y%W);
GO='NIE';

if [ ! -e $DIR/weekstamp ];
then
  GO='TAK';
else
  LD=$(cat $DIR/weekstamp | head -1);
  if [ "$CD" \> "$LD" ];
    then GO='TAK'
  fi;
fi;

if [ "$GO" == "TAK" ];
then
  mv $DIR/T3 $DIR/TX
  mv $DIR/T2 $DIR/T3
  mv $DIR/T1 $DIR/T2
  mv $DIR/T0 $DIR/T1
  mv $DIR/TX $DIR/T0
  cp -al $DIR/D0/. $DIR/T0
  rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/T0
  echo $CD > $DIR/weekstamp
fi;

#miesieczny

CD=$(date --date="tomorrow" +%Y%m);
GO='NIE';

if [ ! -e $DIR/monthstamp ];
then
  GO='TAK';
else
  LD=$(cat $DIR/monthstamp | head -1);
  if [ "$CD" \> "$LD" ];
    then GO='TAK'
  fi;
fi;

if [ "$GO" == "TAK" ];
then
  mv $DIR/M3 $DIR/MX
  mv $DIR/M2 $DIR/M3
  mv $DIR/M1 $DIR/M2
  mv $DIR/M0 $DIR/M1
  mv $DIR/MX $DIR/M0
  cp -al $DIR/D0/. $DIR/M0
  rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/T0
  echo $CD > $DIR/monthstamp
fi;
_temp i _untemp są prostsze.
"/d/.backup/qbit/#temp" to mój katalog do trzymania kopii, trzeba to zmienić na coś swojego, podobnie jak usera w /home i swoje wyjątki w rsync

PS. nie testujcie tego na maszynie roboczej, u mnie działa ale u Was od razu nie musi .
_untemp ma rsync z delete na / i teretycznie gdyby coś poszło źle może wszystko ładnie skasować... ja testowałem to początkowo na virtualboxie.

Kod:
#!/bin/bash

#SRC1 - katalog ze zrodlem do skopiowania
#DST1 - podstawowy katalog do trzymania danych
#DST2 - katalog docelowy dla danej akcji czyli DST1+(root/home)

DST1="/d/.backup/qbit/#temp" 

GO="NIE"

if [ -z "$1" ];
then
  echo "Brak źródła";
  exit;
fi;

if [ "$1" == "root" ]
then 
  SRC1="/";
  DST2=$DST1"/root";
  GO="TAK";
fi;

if [ "$1" == "home" ]
then 
  SRC1="/home/user";
  DST2=$DST1"/home";
  GO="TAK";
fi;

if [ $GO == "NIE" ]
then
  echo "Niepoprawny parametr";
  exit;
fi;

if [ $GO == "TAK" ]
then
  mkdir $DST2;
  rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $SRC1 $DST2
fi;
_untemp
Kod:
#!/bin/bash
SRC1="/d/.backup/qbit/#temp";
if [ -z "$1" ];
then
  echo "Brak źródła";
  exit;
fi;

if [ "$1" == "root" ]
then 
  DST="/";
  SRC2=$SRC1"/root/*";
fi;

if [ "$1" == "home" ]
then 
  DST="/home/user";
  SRC2=$SRC1"/home/user/*";
fi;

rsync -aAX --delete $SRC2 $DST

if [ "$1" == "root" ]
then 
  update-grub;
fi;

Ostatnio zmieniany przez sobrus : 23.11.2012 o godz. 18:18
sobrus jest offline   Odpowiedz cytując ten post