Bezpieczny dom - Automatyczne kopie zapasowe na nośnikach zewnętrznych

Niedawno wykonana kopia zapasowa jest znacznie bezpieczniejsza niż jakikolwiek system odzyskiwania utraconych danych. W praktyce jednak wielu użytkowników nie decyduje się na wykonywanie kopii zapasowych, często dlatego że proces ten wydaje im się zbyt trudny.
Najprostszą metodą wykonania kopii zapasowej jest skopiowanie danych na nośnik taki jak pendrive czy zewnętrzny dysk twardy. Tego rodzaju kopię zapasową możemy wykonać, używając menedżera plików bądź np. polecenia cp:

cp -a katalog_źródłowy katalog_docelowy

Polecenie to wykorzystuje opcję archiwizacji -a, by rekursywnie skopiować pliki, zachowując odpowiednie prawa dostępu. Jeśli katalog docelowy nie istnieje, polecenie to utworzy go, kopiując do niego zawartość katalogu źródłowego. Jeśli natomiast katalog docelowy już istnieje, po operacji kopiowania będzie zawierał podkatalog o nazwie katalogu źródłowego wraz z jego zawartością.

Listing 1: Kopiowanie danych za pomocą Rsynca

$ rsync -aXAHSx <źródło>

$ rsync -aXAHSx <źródło>/

Polecenie cp z jedną opcją łatwo zapamiętać, jednak rozwiązanie to ma szereg wad. Polecenie cp nie poradzi sobie z bardziej egzotycznymi plikami i atrybutami. Co więcej, proces ten jest mało wydajny, ponieważ kopiowane są wszystkie pliki źródłowe. Poza tym wynik działania tego polecenia nie jest w żaden sposób weryfikowany. Dlatego też administratorzy używają bardziej złożonych poleceń, takich jak te przedstawione na Listingu 1, stosując Rsync, który domyślnie instalowany jest w każdej dystrybucji. Również w tym wypadku korzystamy z opcji archiwizacji (-a). Pozostałe opcje odnoszą się do atrybutów rozszerzonych (-X) i specjalnych, takich jak listy kontroli dostępu (-A), dowiązań twardych (-H) i plików rzadkich (sparse files, -S). Dodatkowo polecenie to nie kopiuje plików między partycjami (-x). b01-gparted Rysunek 1: Za pomocą GParteda możemy szybko podzielić dysk na partycje, które sformatujemy i którym przypiszemy nowe etykiety.

Listing 2: Formatowanie pendrive’a jako Ext4

$ lsblk /dev/sd?

$ sudo mkfs.ext4 -L "BACKUP" /dev/sd

b02-lsblk
 
Rysunek 2: Wynik działania polecenia lsblk: pendrive’a łatwo zidentyfikować po rozmiarze. Jeśli katalog docelowy nie istnieje, zostanie utworzony. Ukośnik po nazwie katalogu źródłowego służy do tego, by Rsync nie skopiował samego katalogu (wiersz 1), lecz jedynie jego zawartość, łącznie z podkatalogami (wiersz 2). Jeśli uruchomimy takie polecenie więcej niż raz, Rsync skopiuje jedynie zmodyfikowane pliki. Sprawdzi też, czy kopiowanie się powiodło. Jeśli dodamy opcję --delete, polecenie usunie nawet pliki, których już nie ma w katalogu źródłowym, dzięki czemu uzyskamy doskonałą kopię jeden do jednego. Zwykła kopia nie wystarczy Problem z przedstawioną wyżej metodą wykonywania kopii zapasowych polega na tym, że zwykła replikacja danych kopiuje również niepożądane pliki, np. uszkodzone bądź zainfekowane. W Linuksie problemem zwykle nie są wirusy, lecz użytkownik siedzący przed komputerem: jeśli szybko usuniemy lub przez pomyłkę zmodyfikujemy plik, możemy zauważyć swój błąd dopiero po wykonaniu kopii zapasowej, kiedy to stara wersja zostanie utracona. Dobre rozwiązanie powinno więc objąć archiwizację starszych wersji. W tym momencie zaczynają się komplikacje i wielu użytkowników się poddaje. Na szczęście jednak istnieje wiele projektów, które powstały z myślą o rozwiązaniu tego rodzaju problemów. W większości przypadków wiąże się to z pewnym narzutem czasowym na początku, później jednak codzienne wykonywanie kopii zapasowych staje się łatwiejsze i mniej podatne na błędy. Podczas instalacji Rsnapshota musimy wykonać dwie główne czynności: przygotować miejsce docelowe oraz zainstalować oprogramowanie i odpowiednio je skonfigurować. Nie powinno to jednak zająć dłużej niż kwadrans. Gdzie przechowywać kopie zapasowe? Jeśli chodzi o nośnik na kopie zapasowe, może to być pendrive o odpowiedniej pojemności lub zewnętrzny dysk USB. Na dokumenty i inne niewielkie pliki wystarczy 8-gigabajtowy pendrive, natomiast pokaźna kolekcja multimediów może wymagać wieloterabajtowego dysku twardego. W dalszej części artykułu będziemy używali terminu „nośnik” w odniesieniu do pendrive’a lub dysku zewnętrznego.

Listing 3: Instalacja pakietów rsync, git i rsnapshot

$ sudo apt install rsync git rsnapshot

$ git clone https://github.com/bablokb/autobackup-service.git

$ cd autobackup-service

$ sudo tools/install

$ sudo cp /etc/rsnapshot.conf.autobackup-service /etc/rsnapshot.conf

b03-udev-monitor
Rysunek 3: Polecenie udevadm monitor --property pozwala nam w czasie rzeczywistym obserwować zdarzenia zachodzące pod maską Udeva. Dyski USB i pendrive’y są zwykle sformatowane jako systemy plików FAT32, NTFS lub exFAT. Żadna z tych opcji, popularnych w świecie Windows, nie nadaje się do wykonywania kopii plików linuksowych. W przypadku pendrive’a musimy też sprawdzić, czy istnieje na nim partycja. Jeśli mamy wątpliwości, partycjonujemy pendrive’a w taki sposób, by zawierał dokładnie jedną partycję. Większość dystrybucji zawiera odpowiednie narzędzie do partycjonowania dysku, możemy też użyć popularnego GParteda [1]. Po podłączeniu nośnika musimy sprawdzić w menedżerze plików, czy system linuksowy automatycznie zamontował znajdującą się na nim partycję. Jeśli tak się stanie, odmontowujemy partycję i formatujemy ja jako Ext4. Można to zrobić w GUI, np. za pomocą GParteda (Rysunek 1) lub w wierszu poleceń, używając polecenia przedstawionego w drugim wierszu Listingu 2. Zamiast /dev/sd wpisujemy nazwę urządzenia nośnika (np. /dev/sdb1). Jeśli mamy wątpliwości, najlepiej jest sprawdzić nazwę urządzenia narzędziem lsblk, zanim go sformatujemy (wiersz 1). Polecenie to wyświetla partycje, ich rozmiary oraz odpowiednie punkty montowania, jeśli takie istnieją (Rysunek 2). Jak widzimy na Rysunku 2, nośnik łatwo zidentyfikować po rozmiarze (niemal 8 GB). Listing 2 przypisuje również etykietę partycji. Zamiast BACKUP możemy tu umieścić dowolny inny ciąg alfanumeryczny. Identyfikator ten będzie nam potrzebny później, ponieważ chcemy, by kopie zapasowe zostały wykonane tylko wtedy, gdy system wykryje odpowiedni nośnik. W GPartedzie funkcję tę znajdziemy w menu Partition | Label. Adaptacja Po skonfigurowaniu nośnika kopii zapasowej należy zainstalować i skonfigurować kilka pakietów. Najpierw instalujemy pakiety rsync, git oraz rsnapshot. Wiersz 1 Listingu 3 ukazuje to polecenie w Debianie, Ubuntu i pochodnych. Jeśli w repozytorium naszej dystrybucji brakuje Rsnapshota, możemy pobrać skrypt ze strony projektu [2].

Listing 4: Konfiguracja skryptu autobackup

# /etc/autobackup.conf

LABEL=BACKUP

SYSLOG=0

# czekamy na urządzenie X sekund

WAIT_FOR_DEVICE=2

# jeśli 1: codzienna kopia zawsze po podłączeniu

force_daily=0

# nazwa kopii zapasowej (według /etc/rsnapshot.conf)

daily="day"

weekly="week"

monthly="month"

yearly=""

Listing 5: Modyfikacja /etc/rsnapshot.conf

# /etc/rsnapshot.conf

[...]

#########################################

# Poziomy/interwały kopii zapasowych:

# muszą być unikatowe i w kolejności rosnącej

# np. alfa, beta, gamma itd.

#########################################

retain   day   7

retain   week 4

retain   month 3

#retain  year  3

############################

# Miejsca/skrypty kopii zapasowych

############################

# LOCALHOST

backup   /etc/    ./

backup   /home    ./

Potrzebny nam będzie też skrypt autobackup i pliki konfiguracyjne [3], które pobieramy i instalujemy poleceniami w wierszach 2–4 Listingu 4. Jeśli korzystamy z systemu opartego na Debianie, takiego jak Ubuntu czy Mint, polecenie z wiersza 4 zainstaluje również pakiety rsync i rsnapshot. Jeśli tego nie chcemy, powinniśmy zakomentować polecenie install_packages na końcu pliku tools/install. Kiedy później podłączymy do systemu odpowiedni nośnik, jądro go wykryje i utworzy zdarzenie Udev (Rysunek 3). Stale działający demon Udev uruchomi wtedy skrypt /usr/local/sbin/autobackup. Sprawdzi on, czy pendrive został faktycznie podłączony i czy istnieje już kopia zapasowa bieżącego dnia, tygodnia bądź miesiąca. Jeśli nie, uruchomiony zostanie rsnapshot z właściwymi parametrami. Aby wszystko to zadziałało, musimy skonfigurować skrypt autobackup, tak jak pokazaliśmy to na Listingu 4. Plik konfiguracyjny to /etc/autobackup.conf. Zwykle wystarczy wprowadzić nazwę etykiety, czyli LABEL, którą w naszym przykładzie jest BACKUP. Wartość SYSLOG możemy ustawić na 1, dzięki czemu skrypt będzie zapisywał szczegółowe informacje w pliku dziennika, co pomoże w ewentualnej diagnostyce. Domyślnie skrypt będzie wykonywał kopię zapasową raz dziennie; ustawienie to można zmienić za pomocą force_daily=1. Wprowadzając jakiekolwiek zmiany, powinniśmy być ostrożni, by były zgodne ze składnią skryptów powłoki – należy zwłaszcza uważać, by nie umieszczać żadnych spacji przed znakiem równości i po nim. Drugim krokiem jest utworzenie pliku /etc/rsnapshot.conf. Podczas instalacji Rsnapshota i skryptu autobackup możemy skorzystać z przykładowego pliku konfiguracyjnego. Kopiujemy plik /etc/rsnapshot.conf.autobackup-service do /etc/rsnapshot.conf (Listing 3, wiersz 5). Modyfikacje musimy wprowadzić w części środkowej i na samym końcu pliku (Listing 5). W środkowej części powinniśmy określić, ile generacji należy przechować dla danego okresu. Identyfikatory (dnia, tygodnia, miesiąca oraz roku, przy czym ten ostatni jest zakomentowany) muszą odpowiadać wartościom z ostatnich 4 wierszy Listingu 4. Pod koniec pliku określamy, które katalogi powinny zostać zachowane. Rsnapshot oferuje możliwość pomijania plików na różne sposoby, w praktyce jednak opcje te są rzadko używane. Powinniśmy zwrócić uwagę na jedną pułapkę w /etc/rsnapshot.conf: poszczególne słowa powinny być oddzielone znakami tabulacji, nie spacjami. Po edycji wywołujemy polecenie sudo rsnapshot check. Weryfikuje ono składnię i sprawdza, czy edytor nie zamienił niejawnie tabulatorów na spacje. Cała naprzód Po zakończeniu przygotowań restartujemy system. Proces instalacji instaluje nową regułę demona Udev; restart gwarantuje, że reguła ta zostanie uaktywniona. Jeśli podłączymy teraz nośnik do napędu USB, powinno rozpocząć się automatyczne wykonywanie kopii zapasowej. Kiedy dioda LED na pendrivie lub zewnętrznym dysku twardym przestaje mrugać, oznacza to, że proces tworzenia kopii został zakończony, nośnik zostaje zaś odmontowany. Jeśli teraz, zamiast wyjąć, zamontujemy go ponownie, w menedżerze plików ujrzymy pierwszą kopię zapasową w katalogu day.0 (Rysunek 4). b04-nautilus Rysunek 4: Skrypt autobackup tworzy nowy katalog dla każdej kopii zapasowej, zatem zawsze mamy pod ręką różne wersje swoich danych. Skrypt tworzy dodatkowe kopie zapasowe każdego kolejnego dnia. Drugiego dnia zawartość day.0 jest przenoszona do day.1, a najświeższa kopia znajduje się w day.0. Trwa to siedem pełnych dni, nawet jeśli któregoś dnia pominiemy wykonywanie kopii zapasowej. Następnie skrypt tworzy kopię tygodniową: day.6 staje się week.0. Dzieje się tak raz na (kalendarzowy) tydzień; po czterech tygodniach schemat powtarza się, tyle że z miesięczną kopią zapasową. Jeśli korzystamy z Rsnapshota do tworzenia kopii zapasowych plików znajdujących się na serwerze, który działa całą dobę, odpowiednie zadania Crona zadbają o to, by cały proces przebiegał, jak należy: cotygodniowa kopia zapasowa wykonana zostanie w sobotę wieczorem, miesięczna zaś – pierwszego dnia każdego miesiąca. W przypadku laptopów i komputerów stacjonarnych, z których stale nie korzystamy, takie podejście nie zadziała. Dlatego właśnie proces tworzenia kopii zapasowej uruchamiany jest przy każdym podłączeniu nośnika do komputera. Jeśli zastanawiamy się, dlaczego – począwszy od drugiego dnia – wykonywanie kopii zapasowych przebiega tak szybko, przestrzeń zajmowana przez kopie zapasowe powiększa się zaś tak wolno, rozwiązanie zagadki jest proste: to magia Rsynca, który kopiuje jedynie te pliki, które zostały zmodyfikowane. W przypadku plików, które nie zostały zmienione, Rsync tworzy jedynie dowiązanie twarde. Zatem plik, który wygląda jak day.1/home/bablokb/old-text.odt, jest w istocie jedynie wskaźnikiem do pliku day./home/bablokb/old-text.odt na nośniku. Takie rozwiązanie ma szereg zalet. Zamiast kopiować przez USB wiele dużych plików, Rsync tworzy jedynie odpowiednie wpisy, co przebiega bardzo szybko i pozwala oszczędzić dużo miejsca. Mimo to każda kopia z danego dnia zawiera pełny zestaw plików i katalogów, których kopia została wykonana. Jeśli chcemy sprawdzić, co się zmieniło między dziś a przedwczoraj, wystarczy porównać day./[...]/ z day.2/[...]/. Wnioski Metoda opisana w niniejszym artykule nie wymaga wielu przygotowań, a mimo to umożliwia zautomatyzowanie codziennego wykonywania kopii zapasowych. Można ją polecić zwłaszcza tym, którzy już mają nawyk kopiowania istotnych danych na zewnętrzny nośnik, lecz nie jest to czynność regularna. Jak to zwykle w świecie open source bywa, możemy dostosować cały proces do własnych potrzeb. Moglibyśmy np. zamienić zdarzenie powodujące utworzenie kopii zapasowej (podłączenie nośnika do komputera) na coś innego, np. zalogowanie się do domowej sieci WLAN – wtedy kopia zapasowa mogłaby zostać utworzona na udziale sieciowym. Po niewielkiej modyfikacji opisanej procedury, np. zastąpieniu Crona Anacronem, proces ten zadziała również w przypadku komputerów, które nie działają 24 godziny na dobę. Bez względu na to, którą metodę wybierzemy, najważniejsze jest, by kopie zapasowe wykonywać regularnie. Nie wolno również zapominać o tym, by od czasu do czasu sprawdzić, czy kopia faktycznie zawiera to, co powinna. Spotkałem się z przypadkami codziennego wykonywania kopii zapasowych na tych samych taśmach magnetycznych o ograniczonej liczbie cykli zapisu, która w pewnym momencie została przekroczona. Odzyskanie danych z takiego nośnika mogłoby się okazać niemożliwe. W przypadku nowoczesnych nośników, takich jak pamięć flash, taki scenariusz jest mało prawdopodobny, mimo to jednak warto od czasu do czasu testować kopie zapasowe. Info [1] GParted: https://gparted.org [2] Rsnapshot: http://www.rsnapshot.org [3] Skrypt autobackup: https://github.com/bablokb/autobackup-service


Bernhard Bablok

Zaloguj się, aby dodać komentarz

Nie masz konta? Zarejestruj się »

Zobacz także

Skuteczne narzędzia do wykrywania uszkodzonych podzespołów

pobierz

Wykrywanie i usuwanie niechcianych programów

pobierz

Polecane artykuły

Array ( [docId] => 50146 )

Array ( [docId] => 50146 )
Array ( [docId] => 50146 )