0xcafebabe -- per aspera ad astra

Dokument pobrany z: http://www.anadoxin.org/blog/planowanie-backupow-wedlug-informacji-ze-smart

Planowanie backup'ów wg informacji ze SMART
Tagi:  •    •    •    •  

Zgodnie ze znanym przysłowiem, ludzie dzielą się na dwie grupy: na tych, którzy regularnie robią backup i na tych, którzy będą go robić. Wychodzę z założenia, że lepiej samemu przystąpić do jakichkolwiek grup społecznych, zamiast być ich częścią z przymusu, dlatego (dobrowolnie) myślałem ostatnio nad stworzeniem jakiejś polityki co do backupowania swoich danych.

Utratę danych można zminimalizować w dość dużym stopniu, wiedząc, ile życia pozostało sprzętowi, z którego korzystamy. Zanim zaczniemy szukać pomocy w postaci firm odzyskujących dane, należałoby przede wszystkim podjąć prewencyjne kroki mające na celu ochronę danych. Do oszacowania jakości dysku twardego z systemem (lub partycją użytkownika) można posłużyć się sugestią na temat ilości bad blocków, które znajdują się na dysku. Im większa jest ich ilość, prawdopodobnie krótszy jest czas życia dysku, więc byłby to dobry moment na rozpoczęcie poszukiwań dobrych rozwiązań backup'u – czy to przy wykorzystaniu chmur (np. popularny ostatnimi czasy Dropbox), czy bardziej naziemnych technologii, czyli np. kupno dedykowanego dysku twardego ;).

Codzienne skanowanie dysku w poszukiwaniu bad blocków jednak nie jest optymalnym rozwiązaniem, wręcz przeciwnie – byłby to zbyt duży narzut formy nad treścią. Na szczęście wartości nas interesujące można odczytać z tablic SMART, które każdy dysk wyprodukowany w czasach nowożytnych ;) powinien udostępniać. Codzienne sprawdzanie tych tablic i szukanie odpowiednich wartości nadal jednak nie jest optymalnym rozwiązaniem, dlatego postanowiłem trochę zautomatyzować ten proces, zmieniając model pracy pomysłu – dokonując w myśli inwersji kontroli (Inversion of Control) i „separacji interesów” (Separation of Concerns) ;) doszedłem do wniosku, że skrypt, który będzie powiadamiał mnie o interesujących danych (interrupt), zamiast sytuacji w której ja ciągle sprawdzam dane w poszukiwaniu interesujących sytuacji (polling), będzie o wiele lepszy i przyjemniejszy w użyciu.

Jak skrypt miałby mnie powiadamiać? „Sky is the limit” ;), choć w moim przypadku będzie to powiadomienie przez SMS. Swojego czasu napisałem inny skrypt do automatycznego wysyłania SMS'ów przez bramkę Orange mBox (dostępną po zalogowaniu się do ich portalu), tak więc będzie pełnił on dobrą rolę czynnika powiadamiającego ;).

W nieco większych szczegółach, skrypt (napisany w Ruby) korzysta z programu smartctl do odczytania tablic SMART. smartctl wchodzi w skład pakietu smartmontools, który powinien znajdować się w repozytoriach prawie każdej dystrybucji (jest w Ubuntu, OpenSuSE, być może też i w Fedorze). Do periodycznego sprawdzania stanu dysku wykorzystany jest po prostu cron, z uwagi na to, że jest to narzędzie stworzone do takich rzeczy ;). Skrypt zapisuje historię odczytanych atrybutów do katalogu /var/log/smart-track, by możliwe było potem np. narysowanie histogramu propagacji bad blocków na wybranej przestrzeni czasowej.

Instalacja ogranicza się do:

1. Upewnienia się, że smartctl -a /dev/<twój pierwszy dysk> wypisuje na ekranie tablicę SMART.

2. Instalacji skryptu orangesms, np. z mojej poprzedniej notki, dla użytkownika root (lub użytkownika, z którego uruchamiany będzie skrypt odpalony przez cron'a); to znaczy, że katalog z ustawieniami, wykorzystywany przez skrypt, powinien znajdować się w /root/.orangesms.

3. Upewnienia się, że skrypt działa ;).

4. Skopiowania skryptu smart-track.rb do katalogu /etc/cron.hourly (lub innego, odsyłam do manuala cron w celu wybrania innego katalogu) i ustawieniu atrybutu +x, by cron mógł uruchomić skrypt (ustawianie można uzyskać przez np. chmod +x smart-track.rb).

W zależności od dystrybucji (jeśli cron korzysta ze skryptu run-parts do uruchomienia wszystkich skryptów z katalogu /etc/cron.hourly), być może trzeba zmienić nazwę ze smart-track.rb na smart-track, ponieważ każda nazwa pliku nie będąca kombinacją znaków [a-zA-Z0-9_-] zostanie pominięta. Warto zauważyć, że dopuszczalne znaki nie uwzględniają kropki ;). Wiem na pewno, że Ubuntu Maverick korzysta z run-parts, o reszcie mi w sumie nie wiadomo.

Podczas działania skryptu, do wyżej podanego katalogu będą zapisywane kolejne pliki z np. taką zawartością:

  1. # cat state_00009
  2. /dev/sdb,win7,0,41,0
  3. /dev/sdc,system,0,37,0
  4. /dev/sda,home,1,37,0

Każda linijka opisuje jeden dysk. Kolejne wartości oddzielone są przecinkami i przedstawiają informacje o (kolejno):

- ścieżki do urzadzenia,
- etykiety (lokalnej dla skryptu, cele czysto informacyjne dla użytkownika),
- ilości bad blocków,
- wysokości temperatury,
- wartości „current pending sector” z tablic smart.

Dane z pliku są ściśle powiązane z tablicą globalną $disks, którą można znaleźć w kodzie źródłowym skryptu. Tablica ta jest asocjacją :symbolu z języka Ruby ze stringiem. Symbol zostanie potem również zamieniony na strumień i zapisany do pliku jako etykieta.

Przy okazji czytania dokumentacji smartctl, w późniejszym co prawda terminie, dotarła do mnie informacja o istnieniu programu smartd, który teoretycznie powinien potrafić zrobić to, co napisany przeze mnie skrypt (jak też i prawdopodobnie co najmniej tysiąc innych rzeczy), ale tego już niestety nie wiem ;).

smart-track.rb: tutaj. Przed instalacją warto też zmienić ścieżkę do skryptu "sms" (na samym dole skyptu), no chyba, że twój login to `antek' :p.