Wiele osób słyszało o takim narzędziu jak Norton Ghost. Pod Linuksa znajduje się jego odpowiednik o nazwie G4L. Jednak żeby wykonać kopię dysku wcale nie potrzeba do tego specjalistycznych programów oraz skryptów. Wystarczą do tego podstawowe polecenia jakie udostępnia nam system Linux. Jednym z takich narzędzi jest polecenie dd, które jest częścią pakietu GNU Coreutils. Łącząc to polecenie z innymi programami, możemy zbudować własne narzędzie do wykonywania pełnego obrazu dysku twardego nawet poprzez sieć.

Kopiowanie dysku

Program dd służy do niskopoziomowego kopiowania i konwersji surowych danych (ang. raw data). Dzięki niemu, możemy skopiować określoną ilość bajtów, bloków. Program bardzo chętnie wykorzystywany jest w gromadzeniu “cyfrowych dowodów”, gdzie niezbędne jest odczytanie dysku “bit po bicie”. Klasyczne kopiowanie plików za pomocą polecenia cp jest w tym wypadku niewystarczające, gdyż dane z usuniętych plików, które nie zostały jeszcze “nadpisane” nie są widoczne dla systemu plików, do którego odwołuje się cp.

Korzystając z tego polecenia możemy bardzo szybko wykonać obraz dysku twardego:

dd if=/dev/sda of=/mnt/backup/dysk.img

Możemy wykonać kopię dowolnej partycji lub MBR (ang. Master Boot Record):

dd if=/dev/sda of=/mnt/backup/mbr.img bs=512 count=1

Powstały w ten sposób obraz możemy spakować poleceniem gzip a następnie zarchiwizować w bezpiecznym miejscu. Odtworzenie dysku jest równie proste co wykonanie jego kopii.

dd if=/mnt/backup/dysk.img of=/dev/sda

Spowoduje to zapis zawartości pliku dysk.img na dysk /dev/sda. Odtworzone zostaną wszelakie partycje oraz dane.

Backup poprzez sieć

Jeżeli posiadamy serwer z dużym dyskiem twardym, możemy wykonać kopię danych na serwerze poprzez sieć. Nie potrzebne są do tego żadne specjalne serwery, które umożliwią transfer plików, lecz malutki program GNU Netcat, który znajduje się w każdej dystrybucji.

Netcat jest to uniwersalne narzędzie skanująco-monitorujące oraz prosty serwer, odpowiednik polecenia cat, uzupełniony o komunikację TCP/IP (stąd net-cat, sieciowy cat). Dzięki tej aplikacji możemy szybko i w prosty sposób przesłać dane pomiędzy maszynami.

Na serwerze uruchamiamy program, który będzie nasłuchiwał na odpowiednim porcie, a odebrane dane od razu zapisał na dysk.

[root@solkar /]# nc -l 5000 | dd of=/dev/sdb

Dzięki temu odbierzemy dane z komputera i zapiszemy je od razu na drugim dysku. Następnie będziemy mogli go zamontować, wraz ze wszystkimi partycjami jakie są na źródłowej maszynie. Po stronie maszyny, której chcemy wykonać kopię zapasową, również uruchamiamy program netcat, który wyśle kopię zapasową dysku:

[root@ashley /]# dd if=/dev/sda | nc solkar 5000

Po zakończonym kopiowaniu na ekranie pojawi się wynik polecenia dd, a połączenie zostanie zakończone.

10484997+1391 records in
10485760+0 records out
5368709120 bytes (5.4 GB) copied, 1136.88 s, 4.7 MB/s

Urozmaicenia

Podczas kopiowania dużej ilości danych przydałaby się kompresja. Możemy do znanych nam już poleceń wplątać program gzip. Wydajemy polecenia odpowiednio na maszynach: docelowej oraz źródłowej.

[root@solkar /]# nc –l 5000 | gzip –df | dd of=/dev/sdb
[root@ashley /]# dd if=/dev/hda | gzip -cf | nc solkar 5000

Ponieważ polecenie dd kopiuje każdy sektor dysku, wolne miejsce w systemie plików skopiuje również. Sektory takie zawierać będą różne dane, typowy bałagan. Ponieważ jego kompresja będzie bardzo niewydajna, warto puste miejsce na dysku zapisać samymi zerami, które mają zdecydowanie lepszy współczynnik kompresji. Posłuży nam do tego polecenie:

dd if=/dev/zero of=/tmp/plik-z-zerami; rm /tmp/plik-z-zerami

Plik taki zapełni całe dostępne wolne miejsce na partycji (zapisze puste sektory samymi zerami).

Dzięki aplikacji Pipe Viewer, możemy obejrzeć postęp kopiowania danych z maszyny na maszynę.

[root@solkar /]# nc -l 5000 | pv -bp | dd of=/backup/backup.iso                                ]
 4.6GB [                         <=>                                                           ]

Dzięki poleceniu dd oraz nc, możemy w prosty sposób wykonać kopię dysków oraz partycji poprzez sieć.

  • mazdac

    można też użyć prostego "Redo backup" bądź też clonezilli.

  • markO

    a nie powinno być nc -l -p 5000?

    na debianie -l jest bezargumentowe i trzeba podać -p z portem :)

  • Na Red Hatowych można bez -p ;-) Z manuala:

    <pre>-p source_port

    Specifies the source port nc should use, subject to privilege restrictions and availability. It is an error to use this option in conjunction with the -l option.</pre>

  • Do wykonania kopii zapasowej systemu nie trzeba kopiować całego urządzenia – zwykle wystarczy kopia samych plików (cp, tar, rsync). Zaletą takiego podejścia jest to, że nie będą kopiowane puste (zawierające jednak pozostałości po skasowanych plikach) sektory dysku. Po co marnować miejsce na dysku na taki obraz albo moc procesora przy kompresji niepotrzebnych danych?

  • Widzisz, ja wykorzystuję taki obraz do klonowania systemów ew. szybkiego odtwarzania. Potem szybko z obrazu odtwarzam dane po sieci lub klonuję maszyny.

  • Greg

    A dla mnie artykuł jest bardzo ciekawy. Pokazuje potęgę Linuksa i jego małych programów do konkretnych zadań. Zresztą taka kopia co coś więcej niż zwykłe cp. Możesz zrobić dokładny obraz dysku. Przydaje się to do analizy powłamaniowej. Robisz szybko klona dysku, stawiasz system a na obrazie szukasz tak naprawdę co się stało.

  • Ok, do takiego scenariusza jak podał Greg to dd jak najbardziej ma sens, ale w przypadku robienia typowego backupu nie ma to IMO większego sensu, bo w przypadku gdy masz dysk 20 gigowy, na którym danych jest ze 6GB, mija się kompletnie z celem robienie takiego obrazu z uwagi na to, że dd inaczej niż Norton Ghost nie analizuje tego co jest na filesystemie, tylko jedzie z całym urządzeniem. Na końcu dostaniesz 20 gigowy obraz, który wcale nie będzie szybciej się odtwarzał, niż mke2fs + tar zxfp.

  • Greg

    Wcale nie… czytaj ze zrozumieniem. Robisz plik zapisany samymi zerami i kompresujesz wszystko bardzo ładnie. Zresztą dzięki dd możesz robić dokładny backup offlinowy. Potem tak samo łatwo możesz odtworzyć dane. Bootujesz coś dzięki PXE a potem zamazujesz wsio co jest na dysku i gotowe.

    Odtworzenie w Twój sposób trwa dlużej bo musisz odpalić system który ma tara i inne, odtworzyć pliki i modlić sie, że dziala. Tar kiepsko nadaje się do robienia backupu onlinowego.

  • Greg: Czytam Twój komentarz po raz 10, i nadal nie za bardzo rozumiem co miałeś na myśli :)

    Klonowanie systemu przy pomocy tara robiłem dziesiątki razy (bez modlenia się, żeby zadziałało – zawsze działało) więc nie kumam, jaka to straszna różnica jest pomiędzy wykonywaniem fikołka w postaci nc -l 2000 | dd of=/dev/dysk a mke2fs /dev/dysk && mount /dev/dysk /mnt && nc -l 2000 | tar zxfp – (pomijając mnogość komend)? W końcu system odpalany z pendrive czy PXE i tak zwykle ma coreutils + e2fsprogs.

    Takie podejście ma, rzecz jasna, swoje plusy i minusy:

    + mniejsze ilości danych przewalasz przez sieć

    + mniejsze archiwa trzymasz na dyskach

    + szybkość

    – więcej czynności trzeba wykonać (partycjonowanie, filesystem, instalacja bootloadera)

    Uważam, że nie zawsze potrzebne jest kopiowanie całych partycji czy dysków, zwłaszcza w sytuacji, gdy dyski (źródłowy i docelowy) różnią się między sobą pojemnością (wtedy trzeba dodatkowo zmieniać rozmiar partycji co nie jest trywialne, jeśli nie można sobie pozwolić na utratę danych).

  • Bishop

    Ha, z tego rozwiązania dawno korzystam w mojej pracowni komputerowej. Jestem informatykiem w liceum i taka metoda bardzo się przydaje. Komputery są jednakowe (dostarczone przez MEN). U mnie scenariusz wygląda tak:

    1. System (Ubuntu) instaluję na jednym komputerze.

    2. Na każdym kompie bootuję małego Linuksa poprzez PXE.

    3. Ten z Ubuntu wysyła poprzez sieć dane do reszty systemów, które zapisują dyski.

    4. Po 10 minutach w pracowni mam systemy gotowe.

    Instalacja z kickstartów trwa dłużej, a w tym wypadku zawsze mam na serwerze obraz systemu. Jak coś się rozwali to każdy uczeń może zrestartować komputer, wybrać z BootMenu opcję Restore i już. Odpali mu się systemik poprzez PXE i zamaże dysk systemem źródłowym.

  • Infro

    Ja za to jakiś czas temu "odkryłem" fsarchiver. Potrzebowałem w pracy darmowego programu do backupu, a stosowana przeze mnie dotąd Clonezilla nie radziła sobie z odtwarzaniem obrazów na dyskach mniejszych niż źródłowe. Fsarchiver radzi sobie z tym znakomicie, a do tego jest w SystemRescueCD :) Nie jest co prawda demonem szybkości, ale wspomniana zaleta to dla mnie jego przewaga nad innymi narzędziami jakie znam.

  • Greg

    Nie znam kompletnie tego fsarchiver. Może być opisał to i owo o nim. Ja chętnie tutaj o tym poczytam :) Zaciekawiłeś mnie.

  • lucas

    Lokalnie mozna i catem ;)

    Obraz dysku:

    cat /dev/sda > blabalbla.img

    Obraz partycji"

    cat /dev/sda1 > blabalbla_part1.img

  • Infro

    @Greg:

    Oto strona domowa programu: http://www.fsarchiver.org/Main_Page. Mogę trochę posiedzieć i zrobić jakiegoś krótkiego manuala z przykładami, ale zajęłoby mi to parę dni, bo musiałbym potestować rzeczy, których nie używam na co dzień.

    W skrócie: program działa w konsoli, nie ma żadnego pseudo-graficznego interfejsu (jak Clonezilla) więc wszystko trzeba wystukać.

    Umie zrobić obraz jednej lub kilku partycji, odtworzyć dowolną z nich (także na dysk mniejszy od źródłowego, o ile oczywiście jest dość miejsca na dane), podzielić obraz na kawałki zadanej wielkości (np. do nagrania na płytach) — tyle pamiętam w tej chwili.

    Po niedzieli może udostępnię gdzieś coś większego.

  • Infro, jeżeli znajdziesz troszkę czasu to chętnie umieścimy taki artykuł a i prezent podeślemy w ramach wdzięczności :)

  • Greg

    No ja jestem chętny na poczytanie :)

  • Infro

    Tekst mam gotowy. Po pracy jeszcze do niego zajrzę i wieczorem będę mógł przesłać :)

  • Pingback: FSArchiver czyli backup z konsoli | thecamels.org()

  • lrorua

    vBHvXQ fhqhhojnqent

  • Pingback: FSArchiver, czyli backup z konsoli - OSWorld.pl()

  • Rozumiem, że taki dysk nie może być zamontowany do wykonywania kopii?

  • x

    Nie da się

    x@os ~ $ dd if=/dev/sda of=/mnt/backup/dysk.img
    dd: nie udało się otworzyć ‘/dev/sda’: Brak dostępu
    x@os ~ $ su
    Hasło:
    os x # dd if=/dev/sda of=/mnt/backup/dysk.img
    dd: nie udało się otworzyć ‘/mnt/backup/dysk.img’: Nie ma takiego pliku ani katalogu
    os x # dd if=/dev/sda of=/mnt/backup/mbr.img bs=512 count=1
    dd: nie udało się otworzyć ‘/mnt/backup/mbr.img’: Nie ma takiego pliku ani katalogu
    os x #

  • Kacper Antoniuk

    chciałbym zrobić backup partycji na dysku zewnętrznym na dysk wbudowany, jak wtedy powinna wyglądać komenda?