Używanie DD do klonowania dysku

182

Pojawiło się wiele pytań dotyczących narzędzi do klonowania dysku i ddzostało zasugerowane przynajmniej raz. Już rozważałem używanie ddsiebie, głównie ze względu na łatwość użycia i to, że jest łatwo dostępny w prawie wszystkich startowych dystrybucjach Linuksa.

Jaki jest najlepszy sposób ddna klonowanie dysku? Przeprowadziłem szybkie wyszukiwanie w Google, a pierwszy wynik był najwyraźniej nieudaną próbą . Czy jest coś, co muszę zrobić po użyciu dd, tj. Czy jest coś, czego NIE MOŻNA odczytać za pomocą dd?

falstro
źródło
Wiem, jak działa dd, moje pytanie dotyczyło bardziej znanych problemów związanych z dd podczas klonowania dysków (jak opisano w linku), być może nie było to bardzo jasne. Jego odpowiedź zawiera, a twoja nie zawiera: „Nigdy nie miałem z tym żadnych problemów”. Poparłem również twoją odpowiedź, ponieważ zdecydowanie przedstawiłeś kilka interesujących kwestii (podoba mi się ta o braku wskazania postępu).
falstro
1
Wygląda na to, że dostałeś Spolsky Bump: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin
nie widziałem tego tutaj, kiedy zadałem (i odpowiedziałem) podobne pytanie na superużytkowniku - superuser.com/questions/11453/…
warren
3
To ironiczne, że Joel podał to pytanie jako dobry przykład błędu serwera, chociaż żadna z odpowiedzi nie była dobra. Nie było jednej odpowiedzi wśród 25 (z wyłączeniem komentarzy) z odpowiednimi ddopcjami pomijania złych bloków - co jest niezbędne podczas klonowania dysków w celu odzyskania. Dodałem lepszą odpowiedź, która może klonować dyski ze złymi blokami:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins,
Myślę, że przywracanie dd może się nie powieść, jeśli mówimy o systemach plików zależnych od geometrii dysku, a przywracanie odbywa się na nie identycznych dyskach twardych? Wystąpiły pewne błędy podczas przywracania dd i myślę, że to był problem w moim przypadku.
Marco

Odpowiedzi:

160

dd jest z pewnością najlepszym narzędziem do klonowania, stworzy 100% replikę po prostu za pomocą następującego polecenia. Nigdy nie miałem z tym żadnych problemów.

dd if=/dev/sda of=/dev/sdb bs=32M

Należy pamiętać, że podczas klonowania każdego bajtu nie należy go używać na używanym napędzie lub partycji. Zwłaszcza aplikacje, takie jak bazy danych, nie radzą sobie z tym bardzo dobrze i może dojść do uszkodzenia danych.

Adam Gibbins
źródło
12
Oczywiście, o ile / dev / sdb jest co najmniej tak duży jak / dev / sda ...
Eddie
22
dodaj „bs = 100M conv = notrunc” i według mnie jest to znacznie szybsze.
Tim Williscroft
127
bądź bardzo ostrożny z literami „i” i „o” ...
bandi
17
Wydaje się, że nikt nie zna tej sztuczki ... dd to asymetryczny program do kopiowania, co oznacza, że ​​najpierw przeczyta, potem napisze, a potem wróci. Można rury dd do siebie i zmusić go do wykonywania kopii symetrycznie w następujący sposób: dd if=/dev/sda | dd of=/dev/sdb. W moich testach uruchomienie polecenia bez potoku dało mi przepustowość ~ 112 kb / s. Z rurą mam ~ 235kb / s. Nigdy nie spotkałem się z żadnymi problemami z tą metodą. Powodzenia!
Mistiry,
13
@ Mistiry, to nie jest znaczenie słowa symetryczny.
psusi
113

Aby zaoszczędzić miejsce, możesz skompresować dane wygenerowane przez dd za pomocą gzip, np .:

dd if=/dev/hdb | gzip -c  > /image.img

Możesz przywrócić dysk za pomocą:

gunzip -c /image.img.gz | dd of=/dev/hdb

Aby zaoszczędzić jeszcze więcej miejsca, wcześniej defragmentuj dysk / partycję, którą chcesz sklonować (w razie potrzeby), a następnie wyzeruj całe pozostałe nieużywane miejsce, ułatwiając kompresji gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Poczekaj chwilę, dd ostatecznie nie powiedzie się z komunikatem „dysk pełny”, a następnie:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Możesz również uruchomić proces dd w tle, aby zgłosić stan, wysyłając mu sygnał za pomocą polecenia kill, np .:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Sprawdź swój system - powyższa komenda dotyczy Linuksa, OSX i BSD Komendy dd różnią się sygnałami, które akceptują (używa OSX SIGINFO- możesz nacisnąć Ctrl+, Taby zgłosić status).

David Hicks
źródło
2
Czy działa to również z „nowoczesnymi” fs, takimi jak BTRFS, NILFS, [cokolwiek możesz sobie wymarzyć]?
Steve Schnepp
DD działa na urządzeniach blokowych, poziom abstrakcji niższy niż system plików, więc powinien, tak. Jednak tak naprawdę tego nie próbowałem. Hmm, NILFS wygląda interesująco, muszę na to rzucić okiem.
David Hicks
4
+1 za kill -SIGUSR1 %1, a polecenie dd OSX z radością przyjmuje SIGUSR1 ... bardzo przydatne, dzięki!
stuartc
1
+1, bo Kill -SIGUSR1 1234tego szukałem.
hot2use,
2
Czy powinno być dd if=/dev/hdb | gzip -c > /image.img.gz:?
Mike Causer,
37

UWAGA : uruchomienie systemu plików na żywo może uszkodzić pliki. Powód jest prosty, nie rozumie, co może się dziać w systemie plików i nie próbuje go złagodzić. Jeśli zapis jest częściowo w toku, otrzymasz zapis częściowy. Zwykle nie jest to dobre dla rzeczy i ogólnie fatalne dla baz danych. Ponadto, jeśli zepsuć typo-skłonnej jeśli i od parametrów, biada wam. W większości przypadków rsync jest równie skutecznym narzędziem napisanym po nadejściu wielozadaniowości i zapewni spójne widoki poszczególnych plików.

Jednak DD powinien dokładnie uchwycić stan bitów odmontowanego napędu. Programy ładujące, woluminy lvv, identyfikatory UUID i etykiety partycji itp. Upewnij się tylko, że masz dysk zdolny do dublowania docelowego bitu dysku przez bit.

jldugger
źródło
7
Podejrzewam, że syncnie jest to odpowiedź na problemy z uszkodzeniem plików. Co się stanie, jeśli diamon lub coś zapisze więcej plików syncpodczas ddoperacji?
Usunięte
5
Dobrym pomysłem jest podłączenie dysku jako pierwszego (lub ponowne zamontowanie jako tylko do odczytu), ale nie zawsze jest to możliwe
Alex Bolotov,
1
W takim przypadku używasz rsync i pozwalasz magii obsługiwać pliki, aby uzyskać spójny plik i pozwolić semantyce kopiowania na zapis obsługiwać przychodzące zapisy.
jldugger
4
Chciałbym dodać, że uruchomienie dd na zamontowanym systemie plików NIE SPORZĄDZA plików na zamontowanym systemie plików, ale chodzi tutaj o to, że kopia systemu plików będzie musiała być w znanym dobrym stanie.
3molo
1
Użycie rsynczapewni spójność danych wewnętrznych w docelowym systemie plików. Nie zapewni to spójności danych w plikach - aby to zrobić, musisz zablokować pliki, a wszelkie programy, które zapisują do plików, będą musiały przestrzegać tych blokad.
Martin Geisler,
26

Używając dd do klonowania dysku, który może zawierać uszkodzone sektory, użyj „conv = noerror, sync”, aby upewnić się, że nie zatrzyma się po napotkaniu błędu i wypełni brakujące sektory bajtami zerowymi. Zazwyczaj jest to pierwszy krok, który podejmuję, gdy próbuję odzyskać dane z uszkodzonego lub uszkodzonego dysku - pobierz kopię przed wykonaniem jakichkolwiek prób odzyskania, a następnie wykonaj odzyskiwanie na dobrym (sklonowanym) dysku. Zostawiam to narzędziu do odzyskiwania, aby poradziło sobie z pustymi sektorami, których nie można skopiować.

Może się również zdarzyć, że na szybkość dd może mieć wpływ ustawienie bs (rozmiar bloku). Zwykle próbuję bs = 32768, ale możesz przetestować go na własnych systemach, aby sprawdzić, co działa najszybciej. (Zakłada się, że nie musisz używać określonego rozmiaru bloku z innego powodu, np. Jeśli piszesz na taśmę.)

TimB
źródło
13
Jeśli masz dysk z uszkodzonymi sektorami, naprawdę powinieneś używać „ddrescue” zamiast dd. Jest znacznie bardziej wydajny i ma znacznie większą szansę na odzyskanie większej ilości danych. (Nie
myl
3
nie powinien używać dużego rozmiaru bloku przy próbie pominięcia złych bloków, w przeciwnym razie przeskoczy za dużo. 4096 jest wystarczająco duży.
Sam Watkins,
17

Aby sklonować dysk, wystarczy podać dane wejściowe i wyjściowe do dd:

dd if=/dev/hdb of=/image.img

Oczywiście, upewnij się, że masz odpowiednie uprawnienia do odczytu bezpośrednio z / dev / hdb (polecam działać jako root) i że / dev / hdb nie jest zamontowany (nie chcesz kopiować, gdy dysk jest zmieniane - dopuszczalne jest również montowanie jako tylko do odczytu). Po zakończeniu image.img będzie klonem bajt po bajcie całego dysku.

Istnieje kilka wad używania dd do klonowania dysków. Po pierwsze, dd skopiuje cały dysk, nawet pustą przestrzeń, a jeśli zrobione na dużym dysku może spowodować bardzo duży plik obrazu. Po drugie, dd nie zapewnia absolutnie żadnych wskazań postępu, co może być frustrujące, ponieważ kopiowanie zajmuje dużo czasu. Po trzecie, jeśli skopiujesz ten obraz na inne dyski (ponownie, używając dd), muszą one być tak duże lub większe niż oryginalny dysk, ale nie będziesz w stanie wykorzystać dodatkowego miejsca na dysku docelowym, dopóki nie zmień rozmiar swoich partycji.

Możesz także wykonać bezpośrednią kopię dysku na dysk:

dd if=/dev/hdb of=/dev/hdc

ale nadal obowiązują powyższe ograniczenia dotyczące wolnego miejsca.

Jeśli chodzi o problemy lub problemy, dd, w przeważającej części, wykonuje doskonałą robotę. Jednak jakiś czas temu miałem dysk twardy, który miał wkrótce umrzeć, więc użyłem dd, aby spróbować skopiować informacje, które mogłem z niego wyłączyć, zanim całkowicie zmarł. Dowiedzieliśmy się wtedy, że dd nie radzi sobie dobrze z błędami odczytu - na dysku było kilka sektorów, których dd nie mógł odczytać, powodując, że dd zrezygnował i zatrzymał kopiowanie. W tym czasie nie mogłem znaleźć sposobu, aby powiedzieć dd, aby kontynuował pomimo napotkania błędu odczytu (choć wygląda na to, że ma takie ustawienie), więc spędziłem sporo czasu, ręcznie określając pominięcie i próbując przeskoczyć nieczytelne sekcje.

Spędziłem trochę czasu szukając rozwiązań tego problemu (po zakończeniu zadania) i znalazłem program o nazwie ddrescue , który według strony działa jak dd, ale kontynuuje czytanie, nawet jeśli napotka błąd. Nigdy tak naprawdę nie korzystałem z programu, ale warto to rozważyć, zwłaszcza jeśli dysk, z którego kopiujesz, jest stary, co może mieć złe sektory, nawet jeśli system wygląda dobrze.

Kyle Cronin
źródło
7
... dd nie podaje absolutnie żadnych wskazań postępu ... - cóż, to nie jest prawda - istnieje pewien trudny sposób pokazania postępu - musisz znaleźć pid procesu dd ('ps -a | grep dd'), a następnie wyślij sygnał USR1 do tego procesu - „kill -USR1 <dd_pid_here>” (bez <>), który zmusza dd do wyświetlenia informacji o postępie.
Michal Bernhard
4
„kilka sektorów na dysku, których dd nie mógł odczytać”: Myślę, że to conv=sync,noerrorby pomogło.
Gauthier
2
Te conv=sync,noerroropcje są niezbędne, pozwalają dd pominąć uszkodzone bloki i wyzerować je na obrazie więc rzeczy są ustawione prawidłowo. Rekwizyty dla niewielu osób, które coś o tym skomentowały.
Sam Watkins,
1
GNU ddrescuezapewnia wskaźnik postępu bez żadnych specjalnych opcji, możesz zatrzymać kopiowanie i wznowić od miejsca, w którym zostało przerwane.
endolith,
2
Mniej trudnym sposobem na uzyskanie postępu w dd jest dodanie opcjistatus=progress
James
11

Jeśli napęd źródłowy jest uszkodzony w ogóle, będziesz miał więcej szczęścia korzystając dd_rhelpz dd_rescue(moje osobiste preferencje) lub GNU ddrescue.

Powodem tego jest to, że przy błędach odczytu ddciągle próbuje i próbuje i próbuje - potencjalnie długo czeka na przekroczenie limitu czasu. dd_rescuerobi mądre rzeczy, takie jak odczytanie błędu, a następnie wybranie miejsca na dysku i odczytanie wstecz do ostatniego błędu, i dd_rhelpjest w zasadzie dd_rescuemenedżerem sesji - sprytne uruchamianie i wznawianie dd_rescueuruchomień, aby znów było szybsze.

Efektem końcowym dd_rhelpjest odzyskanie maksymalnych danych w minimalnym czasie. Jeśli przestaniesz dd_rhelpdziałać, ostatecznie wykona dokładnie to samo zadanie, co ddw tym samym czasie. Jeśli jednak ddwystąpią błędy odczytu w bajcie 100 dysku 100 Gb, będziesz musiał długo czekać, aby odzyskać pozostałe 9 999 900 bajtów *, podczas gdy dd_rhelp+ dd_rescueznacznie odzyska większość danych.

Ben Williams
źródło
1
Pomoc w wyborze między dd_rescue a ddrescue: askubuntu.com/a/211579/50450
Johann
7

Dysk źródłowy nie może mieć żadnych zamontowanych systemów plików. Jako użytkownik będący w stanie odczytać urządzenie blokowe (działa root), uruchom „dd if = / dev / sda ....”

Jedną z ciekawszych rzeczy jest to, że tworzysz strumień bajtów ... i możesz z tym wiele zrobić: skompresuj go, wyślij przez sieć, podziel na mniejsze bloby itp.

Na przykład:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Ale mocniej:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Powyższe kopiuje skompresowany obraz źródłowego dysku twardego do zdalnego systemu, gdzie przechowuje go w ponumerowanych porcjach 2G, używając nazwy hosta źródłowego, jednocześnie informując Cię o postępach.

Zauważ, że w zależności od rozmiaru dysku, prędkości procesora na źródle, prędkości procesora na miejscu docelowym, prędkości sieci itp. Możesz pominąć kompresję lub wykonać kompresję po stronie zdalnej lub włączyć kompresję ssh.

retracile
źródło
+1 Piping przez gzip może zaoszczędzić dużo czasu i przepustowości!
M. Dudley,
Powinienem również zauważyć, że dodanie „bs = 1M” do polecenia dd zwykle znacznie poprawia prędkość.
retracile
6

Aby sklonować dysk, wystarczy podać dane wejściowe i wyjściowe w celu dd:

dd if=/dev/hdb of=hdb.img

Oczywiście, upewnij się, że masz odpowiednie uprawnienia do odczytu bezpośrednio z /dev/hdb(zalecam uruchomienie jako root), a /dev/hdbto nie jest zamontowane (nie chcesz kopiować podczas zmiany dysku). Po zakończeniu hdb.imgbędzie klonem bajt po bajcie całego dysku.

ddKlonowanie dysków ma kilka wad . Najpierw ddskopiuje cały dysk, nawet puste miejsce, a jeśli zostanie wykonane na dużym dysku, może spowodować bardzo duży plik obrazu. Po drugie, nie ddzawiera absolutnie żadnych wskazówek dotyczących postępu, co może być frustrujące, ponieważ kopiowanie zajmuje dużo czasu. Po trzecie, jeśli skopiujesz ten obraz na inne dyski (ponownie, używając dd), muszą one być tak duże lub większe niż oryginalny dysk, ale nie będziesz w stanie wykorzystać dodatkowego miejsca na dysku docelowym, dopóki nie zmień rozmiar swoich partycji.

Możesz także wykonać bezpośrednią kopię dysku na dysk:

dd if=/dev/hdb of=/dev/hdc

ale nadal obowiązują powyższe ograniczenia dotyczące wolnego miejsca.

Pierwszą wadę można rozwiązać, gzipując dane podczas tworzenia kopii. Na przykład:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Drugą wadę można rozwiązać za pomocą narzędzia pipeview ( pv). Na przykład:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Nie znam sposobu na przezwyciężenie trzeciej wady.

Ponadto można przyspieszyć czas kopiowania, mówiąc ddo pracy z większymi porcjami danych. Na przykład:

dd if=/dev/hdb of=hdb.img bs=1024
James Sumners
źródło
1
Powiedziałeś już, jak pokonać trzecią wadę ... zmienić rozmiar partycji. Powiększanie partycji jest na ogół bezpieczną i szybką operacją (w porównaniu do zmniejszania lub przenoszenia, która jest powolna i bardziej niebezpieczna, ponieważ przenosi dane).
davr
gzipping nie będzie działał z dyskiem, który był używany przez pewien czas, ponieważ będzie wypełniony bieżącymi lub usuniętymi danymi. gzip będzie działał tylko wtedy, gdy puste miejsce jest zerowane, co ma miejsce tylko w przypadku zupełnie nowego dysku.
Tozz
3
@Tozz: Możesz poprawić ściśliwość obrazu systemu plików, wypełniając system plików plikiem wypełnionym zerami, synchronizując go z dyskiem, a następnie usuwając. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Modulo dodatkowa inteligencja w warstwie systemu plików.)
retracile
5

Kolejną przyjemną rzeczą, którą możesz zrobić z dyskami dd i ratunkowymi, jest kopiowanie danych przez sieć:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Możesz włożyć gzip do obu tych potoków, jeśli sieć nie jest lokalna. Aby uzyskać postęp, użyj pv. Aby netcat local_machine zakończył pracę po zakończeniu kopiowania, możesz dodać -w 5lub coś takiego.

użytkownik5692
źródło
9
To nie jest całkiem poprawne. Polecenie „komputer_zdalny” brakuje czegoś, takich jak > disk_backup.imglub |dd of=/dev/sdbczy coś innego, w zależności od tego, co chcesz zrobić. Zgaduję, że nie chcesz zrzucić obrazu dysku na standardowe wyjście.
davr
1
Dodaj gzip na obu końcach, aby dodatkowo zminimalizować wysyłane dane.
3molo
4

Należy pamiętać, że dd tworzy dokładną kopię , w tym całą pustą przestrzeń.

To znaczy:

  1. Drugi dysk musi być co najmniej tak duży jak pierwszy
  2. Jeśli drugi dysk jest większy, dodatkowe miejsce zostanie zmarnowane (system plików można rozbudować)
  3. Jeśli dysk źródłowy nie jest pełny, dd zmarnuje dużo czasu na kopiowanie pustego miejsca.
  4. W ten sposób możesz skopiować cały dysk lub pojedynczą partycję.
  5. Jeśli jest to dysk rozruchowy, jestem prawie pewien, że musisz zainstalować program ładujący po użyciu dd

Mam nadzieję, że to jest pomocne

Brent
źródło
8
Jeśli klonujesz cały dysk twardy, klonujesz także moduł ładujący.
Cristian Ciupitu
Welll, tylko myśl, ale czy nie możesz użyć gparted, aby przeżyć kopiowanie partycji / dysku do tego, co jest używane - a następnie upuścić dd? Zakładając, że jest to obraz jednorazowy, powinien złagodzić ten problem.
bbqchickenrobot
3

Na przyszłość warto sprawdzić ddrescue . Kilka razy uratowało mi to dzień.

Anders Hansson
źródło
3

Kolejną wielką funkcją jest kopiowanie MBR, tabel partycji i rekordów rozruchowych.

Właśnie

dd if=/dev/sda of=parttable bs=512 count=1

i odwrotnie, kiedy piszesz. Polski z fdiskpóźniej.

Czujesz się znacznie bezpieczniej, gdy masz kopię zapasową tabeli partycji.

Również migracja na inny dysk twardy (przy zmianie struktury partycji) sprawia przyjemność.

Alamar
źródło
3

Jest to rodzaj taniego włamania, ale jest to szybki i brudny sposób monitorowania procesu DD.

Uruchom polecenie dd. Otwórz nową powłokę i wykonaj ps awx, aby znaleźć PID procesu dd. Teraz w nowym typie powłoki obserwuj -n 10 kill -USR1 {pid twojego procesu DD}

To nie zrobi nic w oknie wyjściowym zegarka, ale z powrotem w oryginalnej powłoce DD, DD zacznie generować raporty stanu co 10 sekund. Oczywiście możesz zmienić -n 10 w poleceniu watch na dowolny inny przedział czasowy.

Tachyon


źródło
OS X nie ma watchdostępnych i -USR1zabija dd. Działa jednak następujące polecenie: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco
Nie sądzę, że jest to bardzo praktyczne dla początkującego, mogą być lepiej obsłużone z pvpoleceniem.
Robbie Mckennie,
Odkryłem, że możesz również wysłać SIGINFO za pomocą CTRL-T w dd. Jest to łatwiejsze niż pętla while i płyta OSX 10.6, którą mam, nie ma killall. Nauczył się tego od en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler
3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Spowoduje to skopiowanie dysku i pominięcie bloków z błędami, co jest bardzo ważne.

Są to podstawowe i niezbędne opcje używania dd do klonowania lub ratowania dysku.

Nie chciałem publikować kolejnej odpowiedzi, ale nie było dobrych odpowiedzi z podstawowymi opcjami „conv = sync, noerror” wśród 25 już opublikowanych.

Sam Watkins
źródło
1
Właściwie zostało to wspomniane wcześniej, w jednej odpowiedzi i co najmniej dwóch komentarzach.
Michael Hampton
1
@Michael odpowiedź, którą podłączyłeś, nie zawiera pełnego przykładowego polecenia i ma inne błędy - nie jest dobrym pomysłem stosowanie dużych rozmiarów bloków, conv=sync,noerrorponieważ pomija zbyt dużo danych dla każdego złego bloku. Te opcje są niezbędne do „klonowania odzyskiwania” i nie trzeba szukać ich w komentarzach. Najbardziej popularna odpowiedź jest odpowiednia, jeśli dyski nie mają złych bloków, np. Do klonowania nieskazitelnego dysku, ale nie do odzyskiwania.
Sam Watkins,
@Michael podany przykład to polecenie, którego kilkakrotnie użyłem do profesjonalnego odzyskiwania dysku. Chociaż istnieją inne narzędzia, które mogą wykonać nieco lepszą pracę, podany przeze mnie przykład jest lepszy w klonowaniu odzyskiwania dysku niż każdy inny ddprzykład tutaj, a jednocześnie nadaje się do klonowania dysku wolnego od błędów. Dlatego uważam, że moja odpowiedź jest najlepsza w tym, jak „używać DD do klonowania dysku”. Nie dodałem informacji o monitorowaniu postępów, kompresji itp., Ponieważ chciałem to uprościć i skupić się na udzieleniu krótkiej odpowiedzi, która dobrze opisuje podstawy.
Sam Watkins,
3

Możesz spróbować czegoś takiego

dd if = / dev / sda2 of = / dev / sdb2 bs = 4096 conv = sync, noerror

aby pominąć wszystkie błędy i mieć dokładny klon partycji lub dysku twardego

Sam Watkins
źródło
Powinno to być conv = sync, noerror Opcja synchronizacji jest potrzebna, w przeciwnym razie bloki z błędami zostaną usunięte, a nie skopiowane jako zera.
Sam Watkins,
2

dd dostarcza informacji o postępie - cóż, większość wersji w systemie Linux. Widziałem niektóre, które nie przypominają jednak uniksowego smaku.

Strona podręcznika mówi: Wysłanie sygnału USR1 do działającego procesu „dd” powoduje, że drukuje statystyki we / wy do standardowego błędu, a następnie wznawia kopiowanie.

Korzystam z tej funkcji regularnie.

Steven
źródło
Choć przydatny, wątpię w jego praktyczność dla początkującego.
Robbie Mckennie,
2

Ktoś musiał to powiedzieć: wypróbuj Clonezilla (http: // clonezilla.org/)

Co dostajesz? Aby skopiować tylko używane części systemu plików. Clonezilla używa dd, grub, sfdisk, parted, partimage, ntfsclone i / lub partclone. W zależności od wybranych opcji.

Przyzwoitą dokumentację można znaleźć na stronie: http: // clonezilla.org/clonezilla-live/doc/


źródło
Uważam, że dokumentacja jest trochę szorstka, a klonowanie dysku PATA z Linuksem na dysk SATA nie pozostawiło mi czegoś, co mógłbym uruchomić (jeszcze). Ale znacznie szybciej do tego samego wyniku, co dd, i działało świetnie w przypadku aktualizacji mojego laptopa.
jbdavid
2

Jak kopiować za pomocą dd (w tym przypadku na zdalnym komputerze, ale ta sama zasada dotyczy kopii lokalnej), która pokazuje postęp.

Działa poprzez zapisanie pid poprzez deskryptor pliku 3 w / tmp / pid, który jest następnie wykorzystywany do kolejnych zabójstw z sygnałem USR1. Zmarszczką było przefiltrowanie wyniku postępu na stderr do tylko jednej linii poprzez filtrowanie stderr przez podpowłokę.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
Edward Groenendaal
źródło
Nie bardzo istotne dla pytania, ale jest to fajna sztuczka powłoki przy użyciu podpowłoki i wysokich deskryptorów plików (wyższych niż stderr) do przesyłania z niej danych, +1
falstro
Odnosząc się do tej strony, szukałem różnych opcji dd podczas klonowania dysków, więc wydawało się, że to odpowiednie miejsce, aby umieścić końcowy wynik tego, czego użyłem do klonowania, zwłaszcza, że ​​myślałem, że to było raczej schludne :)
Edward Groenendaal
2

Najwięcej informacji opisano w poprzednich wstawionych przepisach, ale nie wszystkie zostały opisane.

W systemie Linux możesz sklonować dysk twardy lub partycję za pomocą polecenia dd. Uwaga, gdy popełnisz błąd, stracisz wszystkie swoje dane.

Po pierwsze, miejsce docelowe nie powinno być używane, po drugie źródło nie powinno być używane lub ponownie zamontowane w trybie tylko do odczytu. W przeciwnym razie kopia zostanie uszkodzona. Jeśli ponowny montaż jest niemożliwy, należy ustawić dysk rozruchowy (hdd / ssd / pendrive) na dowolną dystrybucję linux na żywo. Prever knoppix, ale to jest twój wybór. Jeśli jest to możliwe, możesz uruchomić system lub zmienić poziom systemu na 1, dla trybu pojedynczego użytkownika, lub możesz bezpośrednio zrestartować system w trybie pojedynczego użytkownika, jest to zależne od dystrybucji. Jeśli sklonujesz tylko jedną partycję, ta partycja powinna zostać odmontowana lub ponownie zamontowana w RO:

umount /mountpoint_or_device

lub

remount -o,ro /mountpoint_or_device

Jeśli chcesz sklonować cały dysk twardy, musisz podłączyć lub ponownie zamontować wszystkie partycje.

Musisz zidentyfikować urządzenie źródłowe i docelowe. proszę spojrzeć na dmesg, tutaj są przechowywane wszystkie potrzebne informacje o urządzeniu, z dostawcą itp. Alternatywnie identyfikacja może być oparta na wielkości urządzenia, jeśli jest inna. Następnie miejsce docelowe powinno być takie samo lub większe niż źródło. musisz obliczyć źródło, na przykład: fdisk -l / dev / sda oprócz geometrii partycji (może istnieć GPT), pobierzesz: 1. całkowity rozmiar dysku wigh GB i bajty 2. geometria historyczna i całkowity numer sektora, bardzo ważne informacje 3. rozmiar bloku w bajtach, zwykle jest to 512.

na przykład:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

następnie spróbujmy większy niż 512 dzielnik, mamy 41943040 sektorów fizycznych:

41943040/256 = 163840, bardzo dobrze, możemy wykonać zbiorczą kopię 256 sektorów. możemy więcej? spróbujmy: 41943040/1024 = 40960, myślę, że to wystarczy, wybierzemy ten. Policzmy rozmiar grupy sektorów: 512 (rozmiar sektora) * 1024 = 524288 bajtów eq 512K. Następnie możemy użyć parametru bs = 512 K lub mniej, ale podzielmy to przez 2 ^ x. Jest to dość praktyczne w przypadku nowoczesnych dysków twardych z dużą pamięcią podręczną. w przypadku starszych dysków ze znacznie mniejszą pamięcią podręczną wystarczy wartość 32 KB lub mniej.

Następnie po przygotowaniu możemy wykonać kopię: dd if = / dev / source_devide of = / dev / destination_device bs = 32K i kopiowanie zostanie wykonane. Zwróć uwagę, każdy błąd zastąpi importowane dane. W miejscu docelowym wszystko zostanie zastąpione.

Jeśli spróbujesz uratować dane na uszkodzonym dysku źródłowym, lepiej użyj rodzimego rozmiaru sektora, zwykle jest to 512 bajtów i dodaj opcję conv = notrunc. w przeciwnym razie dziury w źródle upuszczone przez uszkodzone sektory zostaną połączone przez przesunięcie sektora w miejscu docelowym. Spowoduje to uszkodzenie kopii z niewielką szansą na naprawę. wtedy polecenie będzie:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

i długo czekaj, aż napęd i system zrezygnują i przejdą sektor po sektorze do końca.

dd to przydatne narzędzie do przenoszenia partycji w nowe miejsce. Po prostu stwórz partycję, zmień dd na nową partycję (może być większa, znacznie większa), a jeśli to możliwe, rozwiń skopiowany system plików do wypełnienia całej nowej partycji, ext3 / ext4 / xfs / zfs / btrfs mają tę funkcję. Na koniec musisz zmienić / etc / fstab, następnie umount / mount, jeśli to możliwe, lub zrestartować system.

Oczywiście możesz sklonować dowolny typ partycji. Polecenie dd nie sprawdza typu systemu plików, nie robi nic ze swoją strukturą. to polecenie może być przydatne do klonowania NTFS lub innych typów partycji.

Jest jakaś sztuczka. Jeśli nie ustawiłeś parametru, to dd umieści dane wyjściowe na swoim standardowym wyjściu. następnie możesz wykonać skompresowaną surową kopię dysku lub partycji, na przykład:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Oczywiście należy to zrobić offline. możesz to przywrócić:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, wówczas wszystkie dyski twarde sda ​​zostaną zastąpione przez tę kopię zapasową, a wszystkie bieżące dane zostaną utracone. Możesz to zrobić również przy użyciu partycji Windows NTFS i używanego przez nią dysku twardego. Oczywiście możesz użyć innego polecenia kompresji, zależnie od twojego wyboru.

Znik
źródło
1

Możesz utworzyć skompresowany plik obrazu partycji (lub dysku) w locie za pomocą bzip2lub gzipzamiast dd. Jest to przydatne do przechowywania obrazów na nośnikach wymiennych:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Jeśli dysk był wcześniej intensywnie używany, można zwiększyć kompresję, wypełniając całe nieużywane miejsce zerami przed obrazowaniem:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Aby przywrócić obraz na inny dysk, wystarczy:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
JCCyC
źródło
Popierano sztuczkę polegającą na wypełnieniu pozostałego miejsca zerami. Mądry!
Zamieszanie,
Potrzebowałem tego! Karta SD była wcześniej używana do przechwytywania wideo i była pełna bzdur, kompresja wcale nie pomogła.
Cody Smith
0

Z jakiegoś powodu dd kończy się niepowodzeniem podczas obrazowania płyt CD ze ścieżkami audio. Musisz użyć cdrdao lub czegoś podobnego, aby uzyskać obraz + plik TOC.

Matt
źródło
0

Uwaga na temat prędkości: z mojego doświadczenia wynika, że ​​dd jest dwa razy szybszy, jeśli podasz bs = 1024 zamiast domyślnego bs = 512. Zastosowanie jeszcze większego rozmiaru bloku nie daje zauważalnego przyspieszenia powyżej bs = 1024.


źródło
4
klastry dyskowe są obecnie na ogół około 4k, więc użycie 4096 jest prawdopodobnie dobrą opcją, a nawet 8192, jeśli chcesz czytać 2 klastry jednocześnie. Nie
bądź
0

Jedną rzeczą, o której musisz wiedzieć, gdy dodajesz pełny dysk, jest to, że spowoduje to zastąpienie głównego rekordu rozruchowego dysku odbierającego. Zawiera tablicę partycji i inne istotne informacje. Jeśli nowy dysk nie jest taki sam jak stary dysk, może to tworzyć wszelkiego rodzaju tabele. Kopiowanie na partycje jest ogólnie bezpieczniejsze (a partycji wymiany nie trzeba kopiować)

Paul de Vrieze
źródło
0

Od wielu lat nie pełnię roli administratora, ale wiem, że „dd” jest odpowiednie. Z tej techniki korzystałem regularnie pod koniec lat 80. na komputerach Sun Sparc i 386i. Miałem jedno zamówienie klienta na ponad 30 systemów 386i z oprogramowaniem CAD, które było dystrybuowane na wielu taśmach QIC.

Zainstalowaliśmy na pierwszym komputerze, skonfigurowaliśmy aplikację, uruchomiliśmy sys-unconfig systemu SunOS, umieściliśmy dysk w pudełku na buty o innym adresie SCSI, a następnie przełączyliśmy na „dd” na pozostałe 30 dysków.

pbrooks100
źródło
0

Jak inni wspomnieli powyżej, jednym z problemów związanych z klonowaniem zamontowanego systemu plików jest potencjalne uszkodzenie danych. To oczywiście nie dotyczy klonów z pełnym dyskiem, ale jeśli używasz LVM, możesz wykonać migawkę LogicalVolume i dd z migawki, aby uzyskać spójny obraz.

Ophidian
źródło
0

Tylko ostrzeżenie dla początkujących, które należy powiedzieć: przynajmniej w niektórych wersjach bs = X oznacza, że ​​pamięć do wielkości X zostanie dosłownie przydzielona. bs = 2 GB w systemie z 1 GB pamięci RAM i niewystarczającą zamianą spowoduje, że coś złego się stanie.

rackandboneman
źródło