Dlaczego dd trwa zbyt długo?

18

Muszę skopiować jeden dysk na inny. Próbowałem z poniższym poleceniem i skopiowanie 1 TB dysku w federo zajmuje prawie dzień.

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

Próbowałem tego samego na systemie Unix (HP-UX) z poniższym poleceniem i wykonuje się to w ciągu kilku godzin

dd if=/dev/sda of=/dev/rdsk

Jakiej alternatywy mogę użyć do szybszego kopiowania z dysku na dysk?

KKD
źródło
2
cp /dev/sda /dev/sdblub ( pv /dev/sda > /dev/sdb aby uzyskać pasek postępu) byłoby znacznie szybsze. Dlaczego miałbyś ddtu skorzystać ? ddbyłoby użyteczne tylko z rzeczy, jak conv=sync,noerrorna dyski uchwyt z błędami, ale nawet wtedy byłoby więcej sensu używać rzeczy jak ddrescuezamiast (patrz także pv„s -Eopcja).
Stéphane Chazelas,
1
@ StéphaneChazelas catmoże być jeszcze szybszy, ale różnica nie jest aż tak dramatyczna (może większa w przypadku urządzenia z urządzeniem niż pliku z plikiem, jak w moim eksperymencie).
Gilles „SO- przestań być zły”
8
„Próbowałem tego samego na systemie uniksowym” - Więc na jakim systemie próbowałeś tego pierwszego, jeśli nie na Uniksie? Ponadto, jaki sprzęt itp., Yaddayadda.
marcelm
Witamy w ddpułapce nr 1
Dmitrij Grigoryev,
Używany jako pierwszy w HP-UX (Integrity blade), a także wcześniej używany komputer Solaris.
KKD

Odpowiedzi:

28

ddma wiele (dziwnych) opcji, patrz dd (1) .

Powinieneś jawnie podać rozmiar bufora, więc spróbuj

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

IIRC, domyślny rozmiar bufora to tylko 512 bajtów. Powyższe polecenie ustawia go na 16 megabajtów. Możesz spróbować czegoś mniejszego (np. bs=1M), Ale powinieneś użyć więcej niż domyślny (szczególnie na najnowszym sprzęcie dyskowym z sektorami 4K bajtów, tj. Advanced Format ). Naiwnie zalecam moc dwóch, która jest co najmniej megabajt.

Przy domyślnym rozmiarze bufora 512 bajtów (ale mogę się bardzo mylić) sprzęt wymaga od jądra przesłania 4K dla każdego bloku 512 bajtów.

W związku z tym strony rdskpodręcznika sd (4) mówią:

W tej chwili dostępne są tylko urządzenia blokowe. Surowe urządzenia nie zostały jeszcze zaimplementowane.

Zwiększenie rozmiaru bufora dd zapewni większą wydajność operacji odczytu i zapisu. Teraz wszystkie dyski mają sprzętowy bufor odczytu / zapisu. Ale jeśli zwiększysz rozmiar bufora dd bardziej niż bufor sprzętowy, jego wydajność spadnie, ponieważ dd będzie czytać z pierwszego dysku do bufora, gdy drugi dysk zapisze wszystko z własnego bufora sprzętowego. Musisz ustawić bsopcję polecenia dd za każdym razem inną wartość dla różnych urządzeń.

Basile Starynkevitch
źródło
Czy rdsk jest dostępny w systemach Linux? Użyłem w systemach Unix.
KKD
1
Pamięć podręczna strony prawdopodobnie poradzi sobie w blokach 4Kb, niezależnie od tego, co zrobisz, ale możesz kontrolować, ile syscalls dd używa do odczytu tego 4Kb. Jestem pewien, że istnieje pewien rozmiar odczytu, powyżej którego koszt przeciągania zapisów jest droższy niż zaoszczędzone wywołania systemowe, ale nie mam pojęcia, gdzie jest najsłodszy punkt.
Bezużyteczne
Rozmiar bloku wynoszący kilka MB jest lepszy niż domyślny 512B, ale kiedy przeprowadziłem test porównawczy , okazało się, że catto samo zrobiło (w przypadku transferu systemu plików do systemu plików bezpośredni blok do bloku może mieć inną charakterystykę wydajności). Różnica jednak nie była dramatyczna.
Gilles „SO- przestań być zły”
1
Co ciekawe, w macOS (certyfikowany przez SUS, btw) jest szybszy w użyciu/dev/rdiskX jako cel podczas wykonywania dd.
adib
1
na wypadek gdybyś zastanawiał się, co się dzieje (tak jak ja), dodaj również, status=progressże wydrukuje cały postęp operacji.
Aleksander Lech
17

Wiele lat temu w Unix-land ddbył wymagany sposób na skopiowanie urządzenia blokowego. Jest to wiedza kultowa, mimo że (przynajmniej w systemach opartych na Linuksie) catjest prawie zawsze szybsza niż dd.

Jednak nawet w przeszłości przyzwoity rozmiar bloku pomógł zmniejszyć liczbę (powolnych) wywołań systemowych, biorąc pod uwagę, że każde wywołanie systemowe wyzwalało operację We / Wy. Domyślny rozmiar bloku to 512 bajtów (jeden sektor dysku). Zebranie wielu bloków dysku razem w jednym odczycie było - i jest - również dopuszczalne. W tym przykładzie użyto bloku o wielkości 32 MB:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Jednak w obecnych systemach opartych na systemie Linux dyski można najskuteczniej skopiować za pomocą prostego cat

cat /dev/source >/dev/target

(Jak zauważono w komentarzach do twojego pytania, pvmożna je zastąpić cati da ci wskazanie postępu i przepustowości.)

roaima
źródło
3
W szczególności powodem, dla którego dd musiał być użyty, był błąd w GNU cp i błąd w jądrze Linuksa na początku lat 90. Powody używania dd na historycznych systemach uniksowych były bardzo różne, a chęć skopiowania całego urządzenia blokowego była czymś niezwykłym.
Random832,
1
@ Random832, chcąc skopiować cały dysk, byłby niezwykły, ale pamiętam, że potrzebowałem skopiować partycje (duże - 150 lub nawet 200 MB)
roaima,
3
(Specyfika błędów: jądro niepoprawnie zgłosiło rozmiary użycia dysku [prowadząc cp do wniosku, że każdy plik źródłowy był plikiem rzadkim], a cp nie wyzerował bloków podczas kopiowania z rzadkiego pliku do miejsca docelowego urządzenia. Więc dowolne zero blok w twoim źródle miałby wszystkie śmieci, które zdarzyły się już na dysku)
Random832
Uwielbiam tego rodzaju odpowiedzi. Dzięki za informację. Oto twoja aktualizacja.
catbadger,
7

Zasadniczo ddmożna tego uniknąć na korzyść niektórych alternatyw. Istnieje kilka dobrych powodów, aby ddrescuezamiast tego używać GNU . W Ubuntu możesz zainstalować go za pomocą:

sudo apt-get install gddrescue

i po prostu ddrescuew użyciu. Zauważ, że inaczej niż nazwa pakietu, plik wykonywalny nie ma inicjału g.

Korzystanie z niego jest tak proste, jak:

ddrescue inputFile outputFile logFile

Plik dziennika (o dowolnej nazwie) umożliwia wstrzymywanie / zatrzymywanie i ponowne uruchamianie bez ponawiania poprzedniej pracy, co jest przydatne podczas wykonywania dużych klonów lub odzyskiwania dysków. Domyślnie wyświetla postęp, aktualną prędkość kopiowania, średnią prędkość kopiowania i liczbę znalezionych uszkodzonych bloków.

Wykorzystuje rozsądne wartości domyślne dla rozmiaru bloku, więc szybkość kopiowania jest zawsze tak duża, jak to urządzenie może obsłużyć, przynajmniej według mojego doświadczenia (sklonowałem przy nim setki dysków, wszystkich rozmiarów i typów).

Często dyski, które zaczynają ulegać awarii, mają problemy z prędkością, takie jak sporadyczne spowolnienia, niska średnia prędkość, nagłe długie przerwy (złe sektory) lub całkowite resetowanie (poważne błędy powierzchni). ddrescuemoże pomóc zidentyfikować wszystkie powyższe i zrestartować klon (pod warunkiem, że podałeś plik dziennika), nawet jeśli dysk sam się resetuje.

blok techniczny
źródło
6

Bardzo miłe pytanie. Surowy interfejs jest zaimplementowany w niektórych systemach uniksowych (tru64, hpux, solaris), ale nie w Linuksie. Surowy interfejs przyspiesza przesyłanie, ponieważ uniksowe operacje we / wy są pomijane. Interfejs blokowy ( /dev/dsklub /dev/disk) jest wolniejszy, ponieważ wykorzystuje system unix I / O. Aby przyspieszyć dd(gnu dd can) użyj bs=30Mlub w bs=20Mzależności od twojego sprzętu. Krótka odpowiedź brzmi: NIE, nie jest ona wdrożona, przynajmniej o ile mi wiadomo. Używam Linuksa od czasów jądra 2.2 i nigdy wcześniej nie był rdskużywany w Uniksie.

Elbarna
źródło
6
Dlaczego sugerujesz rozmiar bloku, który nie jest potęgą dwóch?
Basile Starynkevitch
2
@Basile wystarcza wielokrotność rozmiaru bloku dysku, więc 20MiB byłoby w porządku.
roaima,