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
: dd
może kopiować częściowe bloki, więc po podaniu count
zatrzyma się po określonej liczbie bloków, nawet jeśli niektóre z nich są niekompletne. Dlatego możesz skończyć z bs * count
skopiowaniem mniej niż bajtów, chyba że podasz inaczej iflag=fullblock
.
Domyślny rozmiar bloku dla dd wynosi 512 bajtów. count
jest 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 dd
musi 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-rescue
robią automatycznie: początkowo czytają duże bloki, ale jeśli blok zawiedzie, ponownie go czytają przy mniejszych rozmiarach. dd
nie zrobi tego, po prostu zawiedzie cały blok.
dd bs=4m iflag=fullblock
vsdd bs=1111
i 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. Znaczeniefullblock
nie należy lekceważyć, nawiasem mówiąc, jak bez niej,bs
jest tylko częściowe i odczytuje maksymalnie może doprowadzić do trwałych kolejnych niedopasowania.Wokół jest kult kultu
dd
. Początkowo występowały dwa błędy,cp
któ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 blokudd
to 512. Jedynym efektem pozostawienia go w spokoju w większości nowoczesnych okolicznościach jest spowolnienie procesu kopiowania.źródło
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
dd
pójdzie ją zapisać.bs=
ustawia zarównoibs=
(ile danych jest odczytywanych jednocześnie), jak iobs=
(ile danych jest zapisywanych jednocześnie). Im wyższa, tymobs=
więcej iteracjiibs=
będzie wymaganych, zanim będziesz mieć wystarczającą ilość danych,dd
aby 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ługibs=
) będzie wymaganych,dd
aby uznać, że jego zadanie zostało wykonane.źródło
dd
kopiowania częściowych bloków - nie zawszebs * count
.dd
bezbs=2048
lub kilka ich wielokrotności spowodowałoby błąd podczas odczytu z urządzenia cdrom urządzenia blokowego.Użycie opcji blockize na
dd
efektywnie 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śćdd
implementacji 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=
iof=
są ustawione, i jaki sprzęt przechodzicie, jeśli masz mało pamięci i tak dalej.źródło
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,
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 change
poleceń, co zwykle skutkuje szybszymi operacjami We / Wy.źródło