Jak przyspieszyć pełny dysk dd?

62

Używam ddtego polecenia na dwóch identycznych dyskach:

 dd if=/dev/sda of=/dev/sdb bs=4096

Oba dyski twarde mają dokładnie ten sam numer modelu i oba mają 1 TB przestrzeni dyskowej. /dev/sda używa rozmiaru bloku 4096. /dev/sdajest dyskiem lokalnym i /dev/sdbjest zdalnym caddy. Mogę być w stanie użyć następujących protokołów:

  • USB2.0 HighSpeed ​​(obecnie plan)
  • Klon Gigabit Over-The-Network (Naprawdę nie chcę nawet tego próbować)
  • USB3.0 (Jeśli znajdę mój drugi dysk)
  • eSATA (jeśli znajdę / kupię kabel)
  • SATA (jeśli znajdę / kupię kabel, muszę pokochać napędy CD z laptopami)

Czy istnieje sposób na uruchomienie tej kopii dysku, która zajmuje mniej niż 96 godzin? Jestem otwarty na używanie narzędzi innych niż dd.

Muszę sklonować następujące partycje (w tym UUID)

  • Partycja EFI Fat32 (*)
  • Partycja Windows NTFS (*)
  • Partycja HFS + OSX
  • Partycja EXT4 Ubuntu (*)
  • Zamień partycję (*)

* Obsługiwane przez Clonezilla


Próbowałem Clonezilla (i było O DUŻO szybciej), ale nie obsługuje inteligentnego kopiowania HFS +, którego potrzebuję. Może najnowsza wersja to obsługuje?

Kiedy zrobiłem mój pierwszy klon, zrobiłem wszystkie partycje oprócz HFS + i poszło bardzo szybko. (Łącznie nie więcej niż 3 godziny)

Kaz Wolfe
źródło
1
Prawdopodobnie lepiej jest użyć czegoś takiego jak clonezilla. ddkopiuje wszystko , w tym wolne miejsce. Wady stają się bardzo widoczne, gdy masz duże dyski, które nie są całkowicie zapełnione.
Boris the Spider
Czy można kupić kabel SATA i tymczasowo podłączyć dysk zewnętrzny do portu SATA na płycie głównej?
Mark Plotnick
Być może ktoś mógłby rozwinąć następujące kwestie: Co powiesz na klonowanie tabeli partycji (za pomocą clonezilla lub dd), użycie Clonezilla do sklonowania wszystkich partycji oprócz HFS + i użycie dd dla tej jednej partycji? Czy byłoby to wykonalne?
Alexander
@Alexander W ten sposób stworzyłem swojego pierwszego klona.
Kaz Wolfe
1
@LuisAlvarado Właśnie rozpocząłem klon, stary!
Kaz Wolfe

Odpowiedzi:

68

Z mojego doświadczenia nie sądzę, że w linii poleceń jest coś szybszego dd. Dostosowanie bsparametru może zwiększyć prędkość, na przykład mam 2 dyski twarde, o których wiem, że mam szybkość odczytu / zapisu większą niż 100 MB / s, więc robię to:

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

Jest też pv(Najpierw musi zostać zainstalowany), który sprawdza najszybszą prędkość na obu dyskach, a następnie kontynuuje klonowanie. Należy to oczywiście zrobić z poziomu roota:

pv < /dev/sda > /dev/sdb

Z PV mam 156 MB / s

Zaletą pvoprócz prędkości jest to, że pokazuje postęp, aktualną prędkość, czas od rozpoczęcia i ETA. Jeśli chodzi o HFS +, nie wiedziałbym, próbuję tylko pomóc w części „szybkości”. Dzięki pvbardzo zoptymalizowanemu bsparametrowi można wykonać dysk 4 TB w mniej niż 7 godzin (6 godzin 50 minut przy aktualnej prędkości 150 MB / s).

wprowadź opis zdjęcia tutaj

Zrobiłem kilka testów z używanymi typami połączeń i innymi, które miałem dostępne. Korzystałem z Asus Z87 Pro i Intel DZ68DP. Takie były moje wyniki, ale najpierw musimy wiedzieć, że teoretyczne prędkości dla wielu prędkości transferu (prędkości surowe) są właśnie teorią . Przeprowadzenie prawdziwych testów wykazało, że stanowią one od 40% do 80% tej surowej prędkości. Te testy mogą się zmieniać w zależności od używanego urządzenia, typu połączenia, płyty głównej, rodzaju kabla połączeniowego, typu systemu plików i innych. Mając to na uwadze, właśnie to otrzymałem (przetestowałem tylko prędkość zapisu do urządzenia, odczyt jest zwykle wyższy):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 
Luis Alvarado
źródło
3
wysłać sygnał USR1, aby uzyskać postęp dd. Wadą dd jest to, że kopiuje wolne miejsce.
jfs
1
Z mojego doświadczenia wynika, że ​​dostosowanie bsparametru może być ddtak szybkie, jak cat. Równie dobrze możesz użyć cat.
Gilles
3
pvsam w sobie działa bardzo dobrze.
Kaz Wolfe
11
Możesz użyć dd do wykonania pracy, ale wstaw pv do łańcucha, aby monitorować szybkość transferu w następujący sposób:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter
4
Zawsze używałem pvmiędzy dds. Nigdy nie wiedziałem, że można go używać samodzielnie!
korylprince
12

Aby skopiować partycję hurtowo, użyj catzamiastdd . Jakiś czas temu uruchomiłem testy porównawcze , kopiując duży plik zamiast partycji między dwoma dyskami (na tym samym dysku względne czasy są różne):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

Wniosek z tego testu porównawczego jest taki, że wybór rozmiaru bloku dla ddspraw (ale nie tak bardzo) i catautomatycznie znajduje najlepszy sposób na szybką kopię: ddmoże tylko spowolnić. Przy małym rozmiarze bloku ddmarnuje czas na utratę drobnych odczytów i zapisów. Przy dużym rozmiarze bloku jeden dysk pozostaje bezczynny, podczas gdy drugi czyta lub pisze. Optymalną szybkość osiąga się, gdy jeden dysk odczytuje, a drugi zapisuje.

Aby skopiować partycję, kopiowanie plików może być szybsze cp -a. Zależy to od liczby plików i ilości wolnego miejsca w systemie plików. Kopiowanie plików ma narzut, który jest mniej więcej proporcjonalny do liczby plików, ale z drugiej strony kopiowanie wolnego miejsca marnuje czas.

Maksymalna szybkość transmisji danych dla USB2 wynosi nieco poniżej 50 MB / s, co przekłada się na 6-7 godzin transferu 1 TB. Zakłada się, że dysk twardy jest wystarczająco szybki, aby nasycić magistralę USB; Myślę, że szybsze dyski o prędkości 7200 obr / min mogą to zrobić, ale 5900 obr / min może nie być tak szybkie (może są to zapisy liniowe?).

Jeśli którykolwiek dysk jest używany równolegle, może to znacznie spowolnić kopię, ponieważ głowice dysków będą musiały się poruszać.

Gilles
źródło
Próbuję jednak skopiować cały dysk.
Kaz Wolfe
Oczekuję, że różnica będzie tego samego rzędu, ale uruchom test porównawczy w swoim systemie, aby uzyskać bardziej wiarygodne dane.
Gilles
Może catbyć używany do dd if=ubuntu.iso of=/dev/usb? ddSzybkość robienia tego na USB2 lub USB3 jest frustrująco wolna.
Oxwivi
1
@Oxwivi Tak, cat ubuntu.iso >/dev/usbjest dokładnie równoważny. Nie ma w tym magii dd, to tylko narzędzie do kopiowania danych wejściowych na dane wyjściowe.
Gilles
Komenda cat podana powyżej nie działała na komputerze Mac. Próbowałem sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1oddał "-bash: / dev / Dysk 1: Permission denied"
Nay
12

Problemem jest twój typ połączenia i rozmiar bloku. Aby uzyskać najszybsze wyniki, rozmiar bloku powinien wynosić połowę najniższej prędkości zapisu, jaką zwykle otrzymujesz. Zapewni to bezpieczny margines, ale nadal pozwoli na dużą liczbę; oczywiście musisz mieć wystarczającą ilość pamięci RAM, aby pomieścić również dane.

USB 2.0 to 12 megabitów na sekundę (Mbps), USB 2.0 High Speed ​​to 480 Mbps. To oczywiście czysta prędkość; z 8 bitami w bajcie i narzutem na ramkę, użyteczna prędkość w MB / s jest zwykle po przecinku. Na przykład 480 raw, staje się użytecznym 48 MB. Pamiętaj, że jest to matematyka najlepsza, w prawdziwym świecie będzie nieco niższa. W przypadku szybkich połączeń USB 2.0 należy spodziewać się prędkości zapisu około 30-35 MB, pod warunkiem, że rzeczywiste urządzenie pamięci masowej może zrównać lub przekroczyć prędkości połączenia.

Facet
źródło
6
Pouczanie jednostek: USB2.0 High Speed ​​to 480 Mbit / s = 60 MByte / s, raw raw. Użyteczna prędkość nie jest przecinkiem dziesiętnym, ale raczej około 80% prędkości pierwotnej. Obowiązuje jednak zasada „rzeczywista prędkość w MByte / s wynosi 1/10 prędkości surowej w Mbit / s”.
jpa
5

Zgadzam się, że surowa prędkość dobrze dostrojonego polecenia dd(„pv”) lub „cat” jest trudna do pokonania, ale jeśli występuje problem z kopiowaniem (zły sektor, awaria zasilania, błąd użytkownika itp.), Musisz zacząć koniec.

Chciałbym zasugerować ddrescue - narzędzie FOSS, które ma całą prędkość dd, ale obejmie błędy dysku i wznowi później, jeśli wystąpi awaria.

dan_linder
źródło
2

Przenoszę Windows 7 z HDD na SSD i znalazłem to i kilka innych odpowiedzi ... Coś, czego się nauczyłem, co może pomóc innym. W moim przypadku dysk źródłowy jest większy, w przeciwnym razie pracowałbym na poziomie urządzenia / dev / sda -> / dev / sdb.

Win7 i jego 3 partycje ... Użyłem Xbuntu 14.04 live cd na usb. Wyjęto płytę DVD z wygranym komputerem i umieściło dysk SSD na swoim miejscu. Zainstalowałem partclone i wypróbowałem to:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone rzygnął na NTFS wymagającym uruchomienia programu chkdisk w systemie Windows, więc szybka poprawka uszczęśliwiła partclone:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

Wszystkie polecenia działają jako root. Interfejs ncurses firmy Partclone (opcja -N) powiedział, że transfer wynosił 7 GB / min, a skończył na 5 GB / min, co odpowiada 83 MB / s. Największą zaletą jest to, że partclone nie kopiuje nieużywanego miejsca, dzięki czemu klon jest niezwykle szybki.

Dodatkowe potencjalne gotchy:

  • jeśli dysk, na który przenosisz, był wcześniej używany, może zawierać resztki GPT. Instalacje fabryczne systemu Windows 7 to zazwyczaj tabele partycji msdos / mbr. Musisz usunąć fragmenty GPT z dysku docelowego. Ta kontrola jakości systemów Unix i Linux pomogła mi w tym. Musisz użyć gdiskna urządzeniu, użyj x, a następnie z i tak, aby zapchać dane GPT i upewnić się, że UTRZYMASZ MBR.

  • I nie zapomnij, jeśli nie wykonasz dd na poziomie urządzenia, musisz skopiować MBR, używając
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    sdb jako źródła lub starego dysku, a sda jako miejsca docelowego lub nowego dysku ( źródła )

Chris K.
źródło
1

Ostatnio tworzyłem obraz partycji 100 GB (HDD) i zapisałem go na nowym dysku SSD.

Oto wskazówka, która może radykalnie przyspieszyć proces :)

Podziel plik na mniejsze części (im większy plik, tym wolniej działa)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

Podczas tego procesu możesz sprawdzić prędkość za pomocą (w osobnym terminalu)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Następnie, gdy masz katalog pełen plików wyników (maindisk.img000, maindisk.img001 itd.), Użyj

sudo cat maindisk.img* | sudo dd of=/dev/sda1

„wypalić” obraz na nowej partycji SSD (partycja musi być tego samego rozmiaru co stara)

Dla mnie zadziałało to szybciej niż zwykle (bez podziału). Średnia prędkość tworzenia obrazu wynosiła ~ 13 MB / s. Kiedy używam „normalnego” sposobu, zaczyna się on od ~ 15 MB / s, a następnie zmniejsza się do 1 MB / s.

matowc1991
źródło
1
Dlaczego pisanie jednego dużego pliku byłoby wolniejsze niż wielu mniejszych? Jaki był typ docelowego systemu plików i jego flagi montowania?
David Foerster,
conv=syncJest również szkodliwy dla wydajności i raczej bezużyteczny w tym przypadku użycia.
David Foerster,
0

Dla każdego, kto znajdzie ten wątek, o wiele łatwiej i szybciej jest po prostu użyć narzędzia zaprojektowanego do odzyskiwania danych, takiego jak ddrescue . Najpierw próbuje uratować dobre części w przypadku błędów odczytu. Możesz także przerwać ratunek w dowolnym momencie i wznowić go później w tym samym momencie.

Uruchom to dwukrotnie:

Pierwsza runda, skopiuj każdy blok bez błędu odczytu i zaloguj błędy do rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

W drugiej rundzie skopiuj tylko złe bloki i spróbuj 3 razy przeczytać źródło, zanim się poddasz.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Teraz możesz zamontować nowy dysk i sprawdzić, czy system plików nie jest uszkodzony.

Więcej informacji:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html

Goetzc
źródło
0

Zalecam, aby plik wejściowy / do odczytu / dysk znajdował się na SATA, aby zwiększyć prędkość odczytu. USB 2.0 High Speed ​​jest również dobra, ponieważ otrzymuję średnie prędkości 33816 kb / s z ddrescue w porównaniu do tego, kiedy ustawiono USB 2.0 na SATA przy 2014 kb / s

NateNjugush
źródło
0

Użyj innego rozmiaru bloku. Jest to ilość danych ddodczytywanych jednocześnie. Jeśli czytanie za mało, większa część czasu jest poświęcana logice programu, a jeśli jest za dużo, dużo czasu zajmuje przenoszenie dużych danych.

Aby zmierzyć prędkość przy różnych rozmiarach bloków, użyj następującego bashskryptu:

  • ustawiony $devna urządzeniu
  • napraw, cbtotalaby wynosić co najmniej 5-krotność oczekiwanej prędkości odczytu
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

Wynik może być tendencyjny do większego rozmiaru ze względu na odczyt dysku przed nim - dlatego ważne jest, aby ustawić cbtotalwystarczająco duży.

ivan_pozdeev
źródło