Backup dysku przez sieć przy pomocy dd i netcat

Spis treści

Dyski talerzowe mają to do siebie, że zawierają elementy mechaniczne, np. ramię głowicy czy też sam napęd dysku. Te ruchome elementy się zużywają podczas eksploatacji dysku i trzeba mieć na uwadze, że prędzej czy później taki dysk ulegnie awarii. Statystycznie rzecz biorąc, około 5% dysków rocznie zdycha. Oczywiście to tylko statystyka i w sporej części przypadków dyski twarde ulegają awarii znacznie wcześniej. Niekoniecznie musimy mieć tutaj do czynienia z planowanym postarzaniem sprzętu i zwyczajnie możemy trafić na trefny model, którego wada fabryczna wyjdzie po 2-3 miesiącach użytkowania. Poza tym, producenci dysków implementują w nich te energooszczędne rozwiązania, które znacznie skracają żywotność nośników. Można o tym przekonać się analizując 193 parametr SMART (Load/Unload Cycle) odpowiadający za parkowanie głowicy w dyskach firmy Western Digital. Także na dobrą sprawę nie możemy być pewni kiedy nam ten dysk zwyczajnie odmówi posłuszeństwa. Dlatego też powinniśmy się zabezpieczyć na taką ewentualność robiąc kopię bezpieczeństwa (backup) danych zawartych na dysku. W tym wpisie postaramy się zrobić kompletny obraz dysku laptopa przy pomocy narzędzi dd i nc (netcat). Nie będziemy przy tym rozkręcać urządzenia czy też podłączać do portu USB zewnętrznego nośnika. Dane prześlemy zwyczajnie przez sieć.

Dlaczego backup będziemy robić za pomocą dd i nc

By zrobić backup sporej ilości danych przez sieć, niekoniecznie musimy korzystać z pomocy dd i nc. Moglibyśmy do tego celu zaprzęgnąć SSHFS albo też rsync za pośrednictwem SSH, NFS czy SMB. Moglibyśmy też skorzystać z protokołu FTP, SFTP, lub FTPS. Na dobrą sprawę, to nie ma jednego rozwiązania, a to, którą opcję wybierzemy zależeć będzie od konkretnego przypadku.

Przede wszystkim, jeśli robimy backup w zaufanej sieci, to prawdopodobnie nie potrzebujemy nawet szyfrować danych, których kopię chcemy wykonać. Jeśli w takim przypadku zaprzęgniemy do roboty SSH, to dane przed wysłaniem będzie trzeba zaszyfrować na jednej maszynie, no i też trzeba będzie je odszyfrować na drugim komputerze. To pociąga za sobą znaczą utylizację procesora.

Możemy naturalnie skorzystać z rsync . Trzeba jednak mieć na uwadze fakt, że wykonanie backup'u za jego pomocą może być dramatycznie wolne w przypadku NFS. Chodzi o to, że tutaj rsync musi wykonać szereg wywołań systemowych. Na każde takie wywołanie musi być udzielona odpowiedź od zdalnego hosta. Te zapytania nie są wysyłane zbiorczo i odpowiedź na każde z nich musi przyjść osobno. To z kolei zajmuje cenny czas równy RTT (droga pakietu w obie strony). Wyobraźmy sobie teraz, że przesyłamy 100K plików o średnim rozmiarze paru KiB. Nie wygląda to zachęcająco, prawda? Trochę lepiej wygląda sprawa, gdy zrezygnujemy z NFS na rzecz SSH. W tym przypadku wywołania systemowe są dokonywane lokalnie na każdej z maszyn, a przez sieć wędrują jedyne dane pliku. Odpada nam, co prawda, czas potrzebny na przesłanie odpowiedzi na wywołania systemowe ale z kolei dochodzi overhead związany z szyfrowaniem.

Przesyłanie plików za pomocą protokołu FTP nie pociąga za sobą problemu wynikającego z szyfrowania danych. Jako, że dane można przechwycić, to nie powinniśmy używać tej metody do przesyłania plików przez internet. Podstawowy problem z protokołem FTP jest taki, że nie respektuje on uprawnień do plików i zwyczajnie przepisuje je. Nie nadaje się więc on do robienia backup'u plików systemowych.

Problematyczne może być także pełne szyfrowanie dysku. Tutaj sytuacja wygląda mniej więcej tak samo jak w przypadku robienia kopi przez SSH. No chyba, że ślemy ten backup przez internet przez SSH. Wtedy dane są deszyfrowane w celu ich odczytania z dysku. Następnie szyfrowane przed przesłaniem ich przez sieć. Na drugim końcu połączenia dane są deszyfrowane po odebraniu, no i szyfrowane przed zapisem na dysk. Jest to bardzo nieefektywne zachowanie i sporą cześć zasobów zjadają operacje szyfrowania i deszyfrowania danych.

W przypadku, gdy robimy binarną kopię dysku, to narzędzie dd pomija zupełnie system plików i nie interesuje go to czy dane znajdujące się na tym nośniku trzeba odszyfrować po odczycie albo zaszyfrować przed zapisem. Bit to bit i dlatego właśnie będziemy korzystać z dd i nc . To rozwiązanie oferuje niewielkie zużycie procesora, a ogranicza nas zwykle przepustowość sieci.

Tworzenie i przesyłanie backup'u przez sieć

Procedura backup'u nie jest zbytnio skomplikowana. Niemniej jednak, musimy zdać sobie sprawę, że nieodpowiednie posługiwanie się takimi narzędziami jak dd czy nc może nam przynieść tylko więcej szkody niż pożytku. Prawdopodobnie będziemy musieli doinstalować na obu maszynach netcat'a. Jest on dostępny standardowo w repozytorium debiana w pakiecie netcat-traditional .

Jako, że będziemy tworzyć kopię binarną dysku znajdującego się w laptopie, to mamy do wyboru z grubsza trzy opcje. Możemy skopiować cały dysk w jednym podejściu i zapisać go w pliku na dysku NAS. Zamiast całego dysku, możemy też skopiować poszczególne partycje i również je zapisać w osobnych plikach na dysku NAS. Możemy także na tym dysku NAS stworzyć partycję, której wielkość odpowiada rozmiarowi backup'owanej partycji i to tam bezpośrednio wgrać kopiowany obraz. My zdecydujemy się na skorzystanie z tej ostatniej opcji. Głównie dlatego, że do danych tak utworzonego backup'u będziemy mieli prostszy dostęp.

Na docelowej maszynie, tj. tam gdzie obraz dysku ma zostać zapisany, uruchamiamy demona nc :

# nc -l -s 192.168.1.166 -p 19000 | dd bs=32M of=/dev/sda5

Opcja -l odpowiada za nasłuch na porcie określonym przez -p . Z kolei parametr -s to adres, na którym netcat ma nasłuchiwać. Dalej mamy pipe ( | ), za pomocą którego wszystkie dane otrzymane przez netcat zostaną przesłane do dd , a ten zacznie zapisywać piątą partycję głównego dysku.

Mając uruchomionego demona nc , na laptopie musimy jeszcze rozpocząć transfer danych. Robimy to wpisując do terminala to poniższe polecenie:

# dd bs=32M if=/dev/sda6 | pv -s 142G | nc 192.168.1.166 19000

Tutaj z kolei rozpoczynamy od dd , który czyta szóstą partycję dysku. Następie strumień danych przesyła do pv , dzięki któremu będziemy widzieć postęp przesyłu. Następnie dane trafiają już do nc , który przesyła je na określony adres i port, gdzie powinien nasłuchiwać demon nc . Po wklepaniu tego polecenia, transfer danych zostanie rozpoczęty.

W przypadku dysków sporych rozmiarów, ten powyższy sposób nie jest zbytnio praktyczny. Raczej nikomu nie chciałoby się przesyłać kilku TiB danych za każdym razem, gdy ten ktoś chciałby dokonać backup'u. Dlatego też dobrze jest rozważyć dokonać takiej wstępnej synchronizacji partycji wyżej opisanym sposobem, a później już tylko jechać na rsync .

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.