Backup plików poprzez rsync

hdd mount backupOpisana niżej metoda przyda się każdemu, kto regularnie chce robić kopie bezpieczeństwa swoich plików. Mimo, że skupię głównie na używaniu narzędzia rsync pod systemem Linux, to wiem, że są gotowe odpowiedniki dla systemu Windows. Przeglądając internet wiele razy natrafiłem na nazwę Cygwin – zainteresowanych odsyłam tam, aby poszperali w tej dziedzinie. Reszta kroków będzie pewnie taka sama jak dla Linux’a.

Idea robienia backupów jest prosta – aby zrobić kopie zapasowe ważnych plików. Najlepiej do tego celu wykorzystać drugi dysk twardy w komputerze, najlepiej jakby był spięty w RAID1, czy coś podobnego. No, ale niestety nie wszystkich na to stać… . I nie w każdym komputerze mieszczą się 2 dyski twarde :P

Dlatego ja od jakiegoś czasu korzystam z serwerów w internecie, gdzie mam nieograniczoną ilość miejsca. Taki serwer (z dostępem SSH) idealnie nadaje się do tego typu celów.
rsync ma tą właściwość, że uploaduje tylko zmienione pliki. Za każdym razem nie wysyłamy więc wszystkich GB danych, a tylko i wyłącznie zmienione pliki. Jest to spora oszczędność łącza internetowego.

Ostatnio korzystałem z DreamHost, ale teraz przeniosłem się do HostNine (o którym napiszę w kolejnym wpisie).
Opisany niżej artykuł jest ujednolicony – będzie działać na każdym z serwerów, nie tylko na jednym z wyżej wymienionych.

Backup plików – rsync

Komenda używana przezemnie do synchronizacji plików:

rsync -avz /var/lib/mysql/ [email protected]:backup/mysql_source/

Oprócz ustawionych opcji wedle własnych preferencji w komendzie rsync musimy podać folder (/var/lib/mysql) który będziemy kopiować, serwer na który pójdą pliki ([email protected]), oraz miejsce docelowe na serwerze (backup/mysql_source/). Jest to metoda znania „popychaniem plików”, gdzie z serwera głównego pchamy pliki na serwer zewnętrzny. Jest też znana druga metoda „ciągnięcia plików” – analogicznie odwrotna do poprzedniej.

Przy wywołaniu tej komendy zostaniemy poproszeni najpierw o autoryzacje serwera (dodanie klucza do bazy kluczy), a następnie o hasło dostępowe użytkownika do serwera. Wszystko jest „cacy” i następuje upload plików, ale nie jest to wygodne rozwiązanie…. należy sobie ułatwiać życie – zróbmy, aby system sam się backupował, bez naszej ingerencji (wywoływaniu tego polecenia i wpisywania hasła)

Automatyczne logowanie

Na komputerze lokalnym (L) musimy wygenerować klucz RSA. Korzystamy więc z polecenia:

ssh-keygen -t rsa

*Mała podpowiedź – jeśli zamierzamy backupować pliki źródłowe MySQL, to aby mieć dostęp do tych plików musimy mieć uprawnienia root. Więc najlepiej będzie jak root będzie przeprowadzać cały proces wysyłania plików na serwer zewnętrzny… a więc także powyższe i poniższe polecenia róbmy jako root.

Powyższe polecenia poprosi o podanie 3 rzeczy – nazwy pliku i „jakieś tam frazy”. Wystarczy, że zaakceptujemy domyślne puste wartości wciskając 3 razy ENTER.

Następnie wygenerowany plik RSA musimy wyeksportować na zewnętrzny backupowy serwer (B).

scp /root/.ssh/id_rsa.pub [email protected]:~/

*Jeśli nie robimy tego na koncie root, to musimy zmienić ścieżkę do domowego katalogu użytkownika.

Po przesłaniu pliku zalogujmy się na serwer (B).

ssh [email protected]

I dodajmy utworzony i przesłany pliki z kluczem RSA jako autoryzowane połączenie.

mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
rm id_rsa.pub

Następnie dla bezpieczeństwa powinniśmy ustawić prawidłowe prawa odczytu/zapisu do pliku.

chmod go-w ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Jeśli wszystko poszło zgodnie z planem. To od tego momentu możemy logować się na konto serwera (B) bez użycia hasła. A dzięki temu nasz rsync będzie działać od razu po jego wywołaniu.

Problemy z rsync – FAQ

1. Jeśli przy uruchomieniu rsync pojawi się w terminalu „stdin: is not a tty
Najszybszym i najprostszym rozwiązaniem tego problemu jest dodanie do pliku .bashrc (w głównym katalogu domowym na serwerze) takich linijek:

if [ $(expr index „$-” i) -eq 0 ]; then
return
fi

2. ssh jest na innym porcie

rsync -avz –rsh=’ssh -p8023′ /var/lib/mysql/ [email protected]:backup/mysql_source/

Uruchomianie w crontab

Edytujemy plik /etc/crontab i dopisujemy taką linijkę:

03 2    * * *   root    /bin/sh /home/blueman/rsync_code >> /dev/null

Skrypt będzie się wywoływał codziennie o 2:03 w nocy z prawami root’a. A w pliku rsync_code mam podane kilka wpisów rsync, które backupują różne części mojego dysku twardego serwera.

W ten sposób mamy w pełni skonfigurowany backup serwera, który będzie wywoływał się automatycznie i pliki wysyłał na serwer w Wielkiej Brytanii HostNine.