Crmgo Blog

Kopia zapasowa plików za pomocą rdiff-backup

Kopia zapasowa plików za pomocą rdiff-backup

Jednym z moich ulubionych tematów jest tworzenie systemów kopii zapasowych. Tak się złożyło, że szczerze wierzę, że przy poprawnie skonfigurowanej kopii zapasowej życie administratora systemu znacznie się upraszcza. rdiff-backup to system pozwalający na zapisywanie zmian i przywracanie dowolnego zapisanego pliku do jego stanu z…

Kopia zapasowa plików za pomocą rdiff-backup

Jednym z moich ulubionych tematów jest tworzenie systemów kopii zapasowych. Tak się złożyło, że szczerze wierzę, że przy prawidłowo skonfigurowanej kopii zapasowej życie administratora systemu znacznie się upraszcza. rdiff-backup to system pozwalający zachować zmiany i przywrócić dowolny zapisany plik do dowolnego momentu, w którym wykonano kopię zapasową. Już z samej nazwy rdiff-backup wynika, że system ten oparty jest na zasadach działania rdiff. Sam rdiff-backup przechowuje historię zmian, dzięki czemu można przywrócić stan z dowolnego momentu. Główną zaletą jest to, że rdiff-backup umożliwia wykonywanie kopii zapasowych na zdalny serwer.
Podsumowując, rdiff-backup to stosunkowo prosty system, pozbawiony zbędnej skomplikowania, a jednocześnie funkcjonalny.
Zbudujemy system zdalnego backupu, a mianowicie serwer1 będzie backupowany na serwer2.

Zacznijmy od instalacji rdiff-backup

yum install rdiff-backup (wymagane repozytorium epel), albo można pobrać rpm z pkgs.org

zależności:

Installed:
rdiff-backup.x86_64 0:1.2.8-5.el6

Dependency Installed:
librsync.x86_64 0:0.9.7-15.el6          pylibacl.x86_64 0:0.5.0-1.el6
pyxattr.x86_64 0:0.5.0-1.el6

 

Instalacja przebiega bez zbędnych pytań. I jeszcze jedna uwaga – rdiff-backup, jeśli będziesz wykonywać kopie zapasowe na zdalny serwer, to również na tym zdalnym serwerze trzeba go zainstalować.
Następnym etapem w budowie systemu kopii zapasowych jest utworzenie specjalnego użytkownika, od którego będzie działać cały system backupu. Ten użytkownik wcale nie musi logować się za pomocą hasła. Dlatego na pytanie adduser Use password-based authentication? [yes]: odpowiadamy no
Ogólnie dialog dodawania wygląda tak:

adduser backup

Użytkownika należy dodać na obu serwerach. Identycznie.
Następny etap. Ponieważ rdiff-backup działa przez ssh, wygenerujemy klucze autoryzacyjne.
O tym, jak generować klucze ssh do bezhasłowej autoryzacji, pisałem w artykule SSH, bezhasłowy dostęp, ale dla przejrzystości przejdziemy ten etap w pełni.
Na serwerze server1, tym, z którego będziemy robić backup, wygenerujemy klucze.
Najpierw przełączmy się na użytkownika backup:

su backup

I wykonajmy ssh-keygen:

ssh-keygen

Teraz wyjdź z su, naciskając CTRL-D.
A klucz publiczny skopiujmy na serwer server2:

scp /home/backup/.ssh/id_rsa.pub hilik@server2.hilik.org.ua:

I teraz na serwerze server2 skopiujmy lub dodajmy (jeśli to nie pierwszy klucz) klucz publiczny do /home/backup/.ssh/authorized_keys:

cat ~/id_rsa.pub >> /home/backup/.ssh/authorized_keys

Pozostał już ostatni etap, konfiguracja samego backupu. Przede wszystkim na zdalnym serwerze (server2) przygotujmy katalog na kopie zapasowe:

mkdir /storage/backup

Do backupu używam skryptu /root/bin/rdiff-backup.sh, który kopiuje wszystko na serwer backupu. Wygląda on tak:

#!/bin/sh
#Определяем имя сервера который бекапим, нужно для создания иерархии в бекап директории на удаленном сервере
HOST_NAME=`/bin/hostname -s`
#Адрес сервера на который будем бекапить
REMOTE_HOST='server2'
#Пользователь от имени которого будем бекапить
USER='backup'
#Директория на удаленном сервере в которой создаются бекапы
PREFIX='/storage/backup'
#Директории которые необходимо бекапить
WHAT='/etc /usr/local/etc /root /var/cron /sys/i386/conf /usr/local/www'
#Главный цикл бекапа
for i in $WHAT
do
        `/usr/local/bin/rdiff-backup --remote-schema 'ssh -i /home/$USER/.ssh/id_rsa -C %s rdiff-backup --server' --create-full-path --exclude-device-files --exclude-fifos --exclude-sockets --exclude-symbolic-links -b $i $USER@$REMOTE_HOST::/$PREFIX/$HOST_NAME$i`
        echo "/usr/local/bin/rdiff-backup --remote-schema 'ssh -i /home/$USER/.ssh/id_rsa -C %s rdiff-backup --server' --create-full-path --exclude-device-files --exclude-fifos --exclude-sockets --exclude-symbolic-links -b $i $USER@$REMOTE_HOST::/$PREFIX/$HOST_NAME$i"
done

Pozostaje teraz ustawić ten skrypt w cronie. Należy go uruchamiać z poziomu roota:

0 1 * * * /root/bin/rdiff-backup.sh

To na tym etapie kończy się proces tworzenia kopii zapasowej. Kopia zapasowa zostanie zapisana na zdalnym serwerze w katalogu, który wskazałeś do jej przechowywania. W tym katalogu zostanie utworzony podkatalog o nazwie serwera, a w nim umieszczona zostanie kopia zapasowa. Znajdują się tam pliki z bieżącym stanem, stanem z ostatniego momentu tworzenia kopii zapasowej oraz dzienniki zmian.
Aby dodać nowe serwery, wystarczy utworzyć użytkownika, wygenerować klucze i umieścić skrypt.

Teraz wróćmy do kwestii przywracania. Jeśli chcesz uzyskać pliki w ich bieżącym stanie, możesz je po prostu skopiować z kopii zapasowej. Jeśli jednak potrzebujesz przywrócić stan z określonego momentu, należy skorzystać z narzędzia rdiff-backup w trybie przywracania.
Na przykład przywróćmy katalog /etc serwera server1 do stanu z 5 dni temu do katalogu /home/hilik/restore/etc.old.

rdiff-backup --remote-schema 'ssh -i /home/backup/.ssh/id_rsa -C %s rdiff-backup --server' -r 5D backup@server2::/usr/local/share/backup/server1/etc /home/hilik/restore/etc.old

Ten proces można oczywiście zautomatyzować w skrypcie lub zdefiniować jako alias dla części tej komendy, ale na szczęście nie muszę zbyt często przywracać plików do stanu sprzed kilku dni.
Na tym można zakończyć konfigurację rdiff-backup. Mój system działa już od dość dawna i nie napotkałem żadnych problemów w jego użytkowaniu.

Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.