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):
[bash]dd if=/dev/sda of=/mnt/backup/mbr.img bs=512 count=1[/bash]
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.
[code lang=”bash”]dd if=/mnt/backup/dysk.img of=/dev/sda[/code]
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ć.
można też użyć prostego "Redo backup" bądź też clonezilli.
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.
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.
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).
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.
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.
Nie znam kompletnie tego fsarchiver. Może być opisał to i owo o nim. Ja chętnie tutaj o tym poczytam :) Zaciekawiłeś mnie.
Lokalnie mozna i catem ;)
Obraz dysku:
cat /dev/sda > blabalbla.img
Obraz partycji"
cat /dev/sda1 > blabalbla_part1.img
@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 :)
No ja jestem chętny na poczytanie :)
Tekst mam gotowy. Po pracy jeszcze do niego zajrzę i wieczorem będę mógł przesłać :)
[…] możemy posłużyć się wieloma narzędziami: od tego co mamy dostępne "out of the box", np. dd czy cp po prawdziwy kombajn, jakim jest Clonezilla (która w istocie jest tylko interfejsem dla […]
vBHvXQ fhqhhojnqent
[…] posłużyć się wieloma narzędziami: od tego co mamy dostępne “out of the box”, np. dd czy cp po prawdziwy kombajn, jakim jest Clonezilla (która w istocie jest tylko interfejsem dla […]
Rozumiem, że taki dysk nie może być zamontowany do wykonywania kopii?
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 #
chciałbym zrobić backup partycji na dysku zewnętrznym na dysk wbudowany, jak wtedy powinna wyglądać komenda?