Po co określać rozmiar bloku przy kopiowaniu urządzeń o skończonym rozmiarze?


14

W samouczkach online często zaleca się użycie następującego polecenia, aby skopiować CDROM do obrazu ISO:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Dlaczego należy podać rozmiar bajtu? Zauważam, że w rzeczywistości 2048 jest standardowym rozmiarem bajtów dla obrazów CDROM, ale wydaje się, że ddbez określenia bs=lub też count=działa.

W jakich okolicznościach byłoby problematyczne nie określić bs=czy count=przy kopiowaniu z urządzenia skończonej wielkości?

Odpowiedzi:


12

Kiedy dd nadaje się do kopiowania danych? (lub, gdy są czytane () i write () częściowe) wskazuje na ważne zastrzeżenie podczas używania count: ddmoże kopiować częściowe bloki, więc po podaniu countzatrzyma się po określonej liczbie bloków, nawet jeśli niektóre z nich są niekompletne. Dlatego możesz skończyć z bs * countskopiowaniem mniej niż bajtów, chyba że podasz inaczej iflag=fullblock.

Domyślny rozmiar bloku dla dd wynosi 512 bajtów. countjest granicą; jak sugeruje twoje pytanie, nie jest wymagane podczas kopiowania urządzenia o skończonych rozmiarach, a jego celem jest skopiowanie tylko części urządzenia.

Myślę, że należy wziąć pod uwagę dwa aspekty: wydajność i odzyskiwanie danych.

Jeśli chodzi o wydajność, idealnie chcesz, aby rozmiar bloku był co najmniej równy i wielokrotność podstawowego rozmiaru bloku fizycznego (stąd 2048 bajtów podczas czytania płyty CD-ROM). W rzeczywistości w dzisiejszych czasach możesz równie dobrze określić większe rozmiary bloków, aby umożliwić bazowym systemom buforowania buforowanie różnych rzeczy. Ale zwiększenie rozmiaru bloku oznacza, że ddmusi zużywać o wiele więcej pamięci, a może to przynieść efekt przeciwny do zamierzonego, jeśli kopiujesz przez sieć z powodu fragmentacji pakietów.

Jeśli chodzi o odzyskiwanie danych, możesz odzyskać więcej danych z uszkodzonego dysku twardego, jeśli używasz mniejszych rozmiarów bloków; właśnie takie programy dd-rescuerobią automatycznie: początkowo czytają duże bloki, ale jeśli blok zawiedzie, ponownie go czytają przy mniejszych rozmiarach. ddnie zrobi tego, po prostu zawiedzie cały blok.


2
Szczególnie wydajność; zapisz obraz partycji na karcie SD, na przykład, używając dd bs=4m iflag=fullblockvs dd bs=1111i zwróć uwagę na znacznie wyższe prędkości transmisji danych, które da ci ta pierwsza. Dzieje się tak, ponieważ pierwszy z nich wyrównuje się z naturalnymi rozmiarami bloków na karcie SD, podczas gdy drugi wymaga, aby kontroler SD wykonał wiele odczytu, kopiowania i ponownego flashowania, aby zapisać częściowe bloki fizyczne. Znaczenie fullblocknie należy lekceważyć, nawiasem mówiąc, jak bez niej, bsjest tylko częściowe i odczytuje maksymalnie może doprowadzić do trwałych kolejnych niedopasowania.
Jason C

6

Wokół jest kult kultu dd. Początkowo występowały dwa błędy, cpktóre powodowały problemy: błędnie wykrywało pliki jako rzadkie, gdy zgłaszane były z blokiem innym niż 512 (Linux używał rozmiaru bloku 1024) i nie usuwał pustych bloków z miejsca docelowego podczas kopiowania z rzadki plik do urządzenia blokowego.

Niektóre odniesienia do tego można znaleźć we wczesnych archiwach list dyskusyjnych systemu Linux .

Więc ludzie przyzwyczaili się do tego, że dd jest właściwym sposobem radzenia sobie z obrazami dysków, a cp poszło na marne. A ponieważ dd używa domyślnego rozmiaru bloku 512, jest powolny (wolniejszy niż cp w nowoczesnych systemach). Ale nie jest oczywiste, jakiego rozmiaru bloku należy użyć. Prawdopodobnie w twoim przypadku ktoś przeczytał, że 2048 jest „naturalnym” rozmiarem bloku na CD-ROM (to znaczy, CD-ROMy są podzielone na 2352 bajty sektorów zawierające 2048 bajtów danych wraz z informacjami korygującymi błędy) i zdecydował, że to jest „właściwym” rozmiarem do użycia z dd, gdy w rzeczywistości prawdopodobnie uzyskałbyś szybsze wyniki, gdybyś użył (umiarkowanie) większego rozmiaru bloku. W rzeczywistości z tego powodu GNU cp używa domyślnego rozmiaru bloku 64k.

tl; dr: cp /dev/dvd foobar.iso powinno działać dobrze. Domyślny rozmiar bloku ddto 512. Jedynym efektem pozostawienia go w spokoju w większości nowoczesnych okolicznościach jest spowolnienie procesu kopiowania.


mogło się to zmienić, w każdym razie GNU cp domyślnie używa rozmiaru bloku 128k (nie 64k), patrz eklitzke.org/fficient-file-copying-on-linux
apurkrt

5

Zmiana rozmiaru bloku jest dobrym sposobem na zmianę wielkości bufora lub odczytu / zapisu na raz.

Naprawdę nie odnosi się do tego, czy jest to prawdziwe urządzenie blokowe czy nieskończone / wirtualne. Chodzi o to, ile chcesz przechowywać w pamięci, zanim ddpójdzie ją zapisać. bs=ustawia zarówno ibs=(ile danych jest odczytywanych jednocześnie), jak i obs=(ile danych jest zapisywanych jednocześnie). Im wyższa, tym obs=więcej iteracji ibs=będzie wymaganych, zanim będziesz mieć wystarczającą ilość danych, ddaby rozpocząć zapis do miejsca docelowego.

count=nie zależy również od niczego innego niż to, co chcesz zrobić. Kontroluje, ile „bloków” (mierzonych według ibs=) będzie wymaganych, ddaby uznać, że jego zadanie zostało wykonane.


Uwaga Punkt Stephena ddkopiowania częściowych bloków - nie zawsze bs * count.
Drav Sloan,

Zauważ, że w niektórych systemach uniksowych musisz odczytać wielokrotność natywnego rozmiaru bloku; ddbez bs=2048lub kilka ich wielokrotności spowodowałoby błąd podczas odczytu z urządzenia cdrom urządzenia blokowego.
wurtel

2

Użycie opcji blockize na ddefektywnie określa, ile danych zostanie skopiowanych do pamięci z podsystemu wejścia / wyjścia przed próbą zapisu z powrotem do podsystemu wyjścia / wejścia. Dane wyjściowe są takie same (podczas kopiowania całego dysku), fragmenty są po prostu odczytywane w innym określonym rozmiarze (większość ddimplementacji ma domyślny rozmiar 512 bajtów).

Jeśli masz dużą ilość wolnej pamięci i zwiększasz blokowany rozmiar, to kolejne większe porcje danych można odczytywać kolejno, buforować i opróżniać do miejsca docelowego. Mniejszy rozmiar bloku wymaga większego obciążenia w odniesieniu do każdego pojedynczego wyszukiwania, zestawu pamięci itp.

Może się wahać w zależności od tego, gdzie if=i of=są ustawione, i jaki sprzęt przechodzicie, jeśli masz mało pamięci i tak dalej.


1

W bs = reprezentuje wielkość bloku czytać lub pisać. Pozostawienie pola nienaruszonego lub nieokreślenie go może wydawać się wykonywać tę samą operację kopiowania, ale podczas korzystania z niego ukryty jest fakt. Na przykład,

  • Posiadanie 1000000000000000 plików z każdym tylko 1 ~ 10 kb.
  • Posiadanie jednego pliku na 10 GB

W pierwszym przypadku stwierdzono, że użycie mniejszego rozmiaru bloku zwiększa prędkość kopiowania. Podczas gdy w tym drugim przypadku, większy rozmiar bloku był lepszą opcją, ponieważ zwiększa rozmiar sektora, pozostawiając mniejszą liczbę sector changepoleceń, co zwykle skutkuje szybszymi operacjami We / Wy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.