dd (Unix) - dd (Unix)

dd
Pierwotny autor (autorzy) Ken Thompson
( AT&T Bell Laboratories )
Deweloper(zy) Różne open-source i komercyjnych deweloperów
Pierwsze wydanie czerwiec 1974 ; 47 lat temu ( 1974-06 )
Magazyn git .savannah .gnu .org /cgit /coreutils .git /
System operacyjny Unix , uniksopodobny , plan 9 , piekło
Platforma Wieloplatformowy
Rodzaj Komenda
Licencja podstawowe narzędzia : GPLv3+

dd jest z linii poleceń narzędzie dla Unix i uniksopodobnych systemów operacyjnych , głównym celem jest przekształcenie i kopiowanie plików.

W systemie Unix sterowniki urządzeń (takich jak dyski twarde ) i specjalne pliki urządzeń (takie jak /dev/zero i /dev/random ) pojawiają się w systemie plików tak jak zwykłe pliki; dd może również odczytywać i/lub zapisywać z/do tych plików, pod warunkiem, że funkcja ta jest zaimplementowana w odpowiednim sterowniku. W rezultacie dd może być używany do takich zadań, jak tworzenie kopii zapasowej sektora rozruchowego dysku twardego i uzyskiwanie stałej ilości losowych danych. Program dd może również wykonywać konwersje na kopiowanych danych, w tym zamianę kolejności bajtów i konwersję do iz kodowania tekstowego ASCII i EBCDIC .

Historia

Nazwa dd jest aluzją do rachunku DD znaleźć w IBM „s Job Control Language (JCL), w której jest skrótem od«Definicja danych». Składnia polecenia przypomina bardziej instrukcję JCL niż inne polecenia uniksowe, do tego stopnia, że Eric S. Raymond powiedział: „projekt interfejsu był wyraźnie żartem”. Interfejs został przeprojektowany w poleceniu dd Planu 9 , aby używać stylu opcji wiersza polecenia. ddjest czasami żartobliwie nazywany „Disk Destroyer” ze względu na jego możliwości wymazywania dysku.

Pierwotnie przeznaczony do konwersji między ASCII i EBCDIC , dd po raz pierwszy pojawił się w wersji 5 Unix . Polecenie dd jest określone od wydania 2 przewodnika X/Open Portability Guide z 1987 roku. Jest ono dziedziczone przez normę IEEE Std 1003.1-2008 ( POSIX ), która jest częścią specyfikacji Single UNIX Specification .

Wersja dddołączona do GNU coreutils została napisana przez Paula Rubina, Davida MacKenzie i Stuarta Kempa.

Stosowanie

Linii poleceń składnia dd różni się od wielu innych programów uniksowych. Używa składni opcja = wartość dla swoich opcji wiersza polecenia zamiast bardziej standardowe - wartość opcji lub - opcja = wartość formatach. Domyślnie dd czyta z stdin i zapisuje na stdout , ale można to zmienić za pomocą opcji if (plik wejściowy) i of (plik wyjściowy).

Niektóre funkcje dd będą zależeć od możliwości systemu komputerowego, na przykład możliwość implementacji przez dd opcji bezpośredniego dostępu do pamięci. Wysłanie sygnału SIGINFO (lub sygnału USR1 w Linuksie) do działającego procesu dd powoduje, że wypisuje on statystyki We/Wy do standardowego błędu raz, a następnie kontynuuje kopiowanie. dd może czytać standardowe wejście z klawiatury. Po osiągnięciu końca pliku (EOF), dd zakończy działanie. Sygnały i EOF są określane przez oprogramowanie. Na przykład, narzędzia Unix przeniesione do Windows różnią się co do EOF: Cygwin używa Ctrl+ D(zwykły uniksowy EOF), a MKS Toolkit używa Ctrl+ Z(zwykły Windows EOF).

Niestandardowe części wywołania dd różnią się w zależności od implementacji.

Komunikaty wyjściowe

Po zakończeniu, dd wypisuje do strumienia stderr statystyki transferu danych. Format jest znormalizowany w POSIX. Strona podręcznika dla GNU dd nie opisuje tego formatu, ale podręczniki BSD tak.

Każdy z wierszy „Records in” i „Records out” pokazuje liczbę przesłanych kompletnych bloków + liczbę bloków częściowych, np. ponieważ nośnik fizyczny zakończył się przed odczytaniem całego bloku lub błąd fizyczny uniemożliwił odczytanie całego bloku.

Rozmiar bloku

Blok jest pomiar liczby jednostka bajtów , które są odczytywane, pisanych lub przekształconych w jednym czasie. Opcje wiersza poleceń mogą określać inny rozmiar bloku dla wejścia/odczytu ( ibs ) w porównaniu z wyjściem/zapisem ( ob ), chociaż opcja rozmiaru bloku ( bs ) przesłoni zarówno ibs, jak i obs . Domyślna wartość zarówno dla rozmiaru bloku wejściowego, jak i wyjściowego to 512 bajtów (tradycyjny rozmiar bloku dysków i wymagany przez POSIX rozmiar "bloku"). Opcja licznika do kopiowania jest mierzona w blokach, podobnie jak licznik pomijania do czytania i licznik wyszukiwania do zapisu. Na operacje konwersji ma również wpływ „rozmiar bloku konwersji” ( cbs ).

Wartość podana dla opcji rozmiaru bloku jest interpretowana jako dziesiętna (podstawa 10) liczba całkowita bajtów. Może również zawierać przyrostki wskazujące, że rozmiar bloku jest całkowitą liczbą jednostek większych niż bajty. POSIX określa tylko sufiksy b (bloki) dla 512 i k ( kibibajty ) dla 1024. Implementacja różni się dodatkowymi sufiksami, które obsługuje: (Wolny) BSD używa małych liter m ( mebibajty ), g ( gibibajty ) itd. dla tebibajtów , exbibytes , pebibytes , zebibytes i yobibytes , podczas gdy GNU używa M i G dla tych samych jednostek, z kB , MB i GB używanymi dla ich odpowiedników w układzie SI ( kilobajtów ). Na przykład, dla GNU dd , bs = 16M wskazuje rozmiar bloku 16 mebibytes (16777216 bajty) i bs = 3kB określa 3000 bajtów.

Ponadto niektóre implementacje rozumieją znak x jako operator mnożenia zarówno dla parametrów rozmiaru bloku, jak i liczby. Na przykład bs=2x80x18b jest interpretowane jako 2 × 80 × 18 × 512 =1 474 560  bajtów , dokładny rozmiar dyskietki o wielkości 1440 KiB . Jest to wymagane w POSIX, ale wydaje się, że GNU go nie obsługuje. W rezultacie łatwiej jest używać składni arytmetycznej powłoki POSIX . bs=$((2*80*18))b

Rozmiar bloku ma wpływ na wydajność kopiowania poleceń dd . Wykonywanie wielu małych odczytów lub zapisów jest często wolniejsze niż wykonywanie mniejszej liczby dużych. Używanie dużych bloków wymaga większej ilości pamięci RAM i może skomplikować odzyskiwanie po błędzie. Gdy dd jest używany z urządzeniami o zmiennym rozmiarze bloku, takimi jak napędy taśmowe lub sieci, rozmiar bloku może decydować o rozmiarze rekordu na taśmie lub rozmiarze pakietu , w zależności od używanego protokołu sieciowego .

Zastosowania

Polecenia dd można używać do różnych celów. W przypadku poleceń zwykłego kopiowania jest zwykle wolniejszy niż alternatywy specyficzne dla domeny, ale wyróżnia się unikalną zdolnością do „nadpisywania lub obcinania pliku w dowolnym momencie lub wyszukiwania w pliku”, dość niskopoziomowego interfejsu do Uniksa API plików.

Poniższe przykłady zakładają użycie GNU dd, głównie w argumencie rozmiaru bloku. Aby uczynić je przenośnymi, zastąp je np. bs=64Mwyrażeniem arytmetycznym powłoki bs=$((64*1024*1024))lub bs=$((64 << 20))(zapisanym równoważnie z przesunięciem bitowym ).

Transfer danych

dd może powielać dane w plikach, urządzeniach, partycjach i woluminach. Dane mogą być wprowadzane lub wyprowadzane z dowolnego z nich; ale istnieją ważne różnice dotyczące wyjścia podczas przechodzenia do partycji. Ponadto podczas przesyłania dane można modyfikować za pomocą opcji conv, aby dopasować je do nośnika. (W tym celu jednak dd jest wolniejsze niż cat .)

Formularze transferu danych dd
blocks=$(isosize -d 2048 /dev/sr0) 
dd if=/dev/sr0 of=isoimage.iso bs=2048 count=$blocks status=progress
Tworzy ISO obraz dysku z na płycie CD-ROM , DVD lub Blu-ray dysku.
dd if=system.img of= /dev/sdc bs=64M conv=brak błędu
Przywraca dysk twardy (lub na przykład kartę SD) z wcześniej utworzonego obrazu.
dd if=/dev/sdb2 of=partition.image bs=64M conv=brak błędu
Utwórz obraz partycji sdb2, używając rozmiaru bloku 64 MB.
dd if=/dev/sda2 of=/dev/sdb2 bs=64M conv=brak błędu
Klonuje jedną partycję do drugiej.
dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=brak błędu
Klonuje dysk twardy „ad0” na „ad1”.

Opcja noerror oznacza kontynuowanie pracy, jeśli wystąpi błąd, podczas gdy opcja sync powoduje dopełnienie bloków wyjściowych.

Modyfikacja w miejscu

dd może modyfikować dane w miejscu. Na przykład nadpisuje to pierwsze 512 bajtów pliku bajtami null:

dd if= /dev/zero of=ścieżka/do/pliku bs=512 count=1 conv=notrunc

W notrunc Nawrócenie oznacza opcja nie obcina pliku wyjściowego - to znaczy, jeśli plik wyjściowy już istnieje, po prostu zastąpić określone bajty i zostawić resztę pliku wyjściowego sam. Bez tej opcji dd utworzy plik wyjściowy o długości 512 bajtów.

Kopia zapasowa i przywracanie głównego rekordu rozruchowego

Powyższy przykład może również służyć do tworzenia kopii zapasowej i przywracania dowolnego regionu urządzenia do pliku, takiego jak główny rekord rozruchowy .

Aby zduplikować pierwsze dwa sektory dyskietki:

dd if=/dev/fd0 of=MBRboot .img bs=512 count=2

Czyszczenie dysku

Ze względów bezpieczeństwa czasami konieczne jest wyczyszczenie dysku wyrzuconego urządzenia. Można to osiągnąć poprzez „przesyłanie danych” ze specjalnych plików Uniksa.

W porównaniu z powyższym przykładem modyfikacji danych , opcja konwersji notrunc nie jest wymagana, ponieważ nie działa, gdy plik wyjściowy dd jest urządzeniem blokowym.

Opcja bs=16M powoduje, że dd odczytuje i zapisuje 16  mebibajtów na raz. W przypadku nowoczesnych systemów nawet większy rozmiar bloku może być szybszy. Należy pamiętać, że wypełnienie dysku losowymi danymi może zająć więcej czasu niż wyzerowanie dysku, ponieważ losowe dane muszą zostać utworzone przez procesor, a tworzenie zer jest bardzo szybkie. Na nowoczesnych dyskach twardych wyzerowanie dysku spowoduje, że większość zawartych w nim danych będzie nie do odzyskania. Jednak w przypadku innych rodzajów dysków, takich jak pamięci flash, wiele danych może nadal być odzyskiwanych przez remanencję danych .

Nowoczesne dyski twarde zawierają polecenie Bezpieczne wymazywanie przeznaczone do trwałego i bezpiecznego usuwania każdej dostępnej i niedostępnej części dysku. Może również działać w przypadku niektórych dysków półprzewodnikowych (dysków flash). Od 2017 r. nie działa na dyskach flash USB ani na pamięciach flash Secure Digital . Gdy jest dostępny, jest to zarówno szybsze niż użycie dd, jak i bezpieczniejsze. Na komputerach z systemem Linux jest dostępny za pośrednictwem opcji --security-erase-enhanced polecenia hdparm .

Program shred oferuje wielokrotne nadpisywanie, a także bezpieczniejsze usuwanie pojedynczych plików.

Odzyskiwanie danych

Odzyskiwanie danych obejmuje odczyt z dysku, którego niektóre części są potencjalnie niedostępne. dd dobrze pasuje do tej pracy dzięki elastycznemu pomijaniu ( search ) i innym niskopoziomowym ustawieniom. Waniliowe dd jest jednak niezręczne w użyciu, ponieważ użytkownik musi przeczytać komunikaty o błędach i ręcznie obliczyć regiony, które można odczytać. Rozmiar pojedynczego bloku ogranicza również szczegółowość odzyskiwania, ponieważ należy dokonać kompromisu: albo użyj małego, aby odzyskać więcej danych, albo użyj dużego, aby uzyskać szybkość.

Program AC o nazwie dd_rescue został napisany w październiku 1999 roku . Usunął funkcjonalność konwersji dd i obsługuje dwa rozmiary bloków, aby poradzić sobie z dylematem. Jeśli odczyt przy użyciu dużego rozmiaru nie powiedzie się, nastąpi powrót do mniejszego rozmiaru, aby zebrać jak najwięcej danych. Może również biegać wstecz. W 2003 roku napisano skrypt dd_rhelp, aby zautomatyzować proces korzystania z dd_rescue , śledząc samodzielnie, które obszary zostały przeczytane.

W 2004 roku GNU napisało oddzielne narzędzie, niezwiązane z dd , o nazwie ddrescue . Ma bardziej wyrafinowany algorytm dynamicznego rozmiaru bloku i śledzi to, co zostało odczytane wewnętrznie. Autorzy zarówno dd_rescue, jak i dd_rhelp uważają go za lepszy od ich implementacji. Aby pomóc odróżnić nowszy program GNU od starszego skryptu, czasami dla ddrescue GNU używane są alternatywne nazwy , w tym addrescue (nazwa na freecode.com i freshmeat.net), gddrescue ( nazwa pakietu Debiana ) i gnu_ddrescue ( nazwa pakietu openSUSE ) .

Inny program o otwartym kodzie źródłowym o nazwie savehd7 wykorzystuje wyrafinowany algorytm, ale wymaga również instalacji własnego interpretera języka programowania .

Wydajność dysku w testach porównawczych

Aby przeprowadzić test porównawczy dysku i przeanalizować sekwencyjną (i zwykle jednowątkową) wydajność odczytu i zapisu systemu dla bloków 1024-bajtowych:

  • Wydajność zapisu: dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
  • Przeczytaj wydajność: dd if=1GB_file_to_read of=/dev/null bs=1024

Generowanie pliku z losowymi danymi

Aby utworzyć plik o 100 losowych bajtach za pomocą losowego sterownika jądra:

dd if= /dev/urandom of=myrandom bs=100 count=1

Konwersja pliku na wielkie litery

Aby przekonwertować plik na wielkie litery:

dd if=nazwa_pliku of=nazwa_pliku1 conv=ucase,notrunc

Wskaźnik postępu

Będąc programem zaprojektowanym głównie jako filtr, dd zwykle nie dostarcza żadnego wskaźnika postępu. Można temu zaradzić, wysyłając sygnał USR1 do działającego procesu GNU dd , co skutkuje wydrukowaniem przez dd bieżącej liczby przesłanych bloków.

Poniższy jeden wiersz powoduje ciągłe wyświetlanie postępu co 10 sekund, aż do zakończenia transferu, gdy dd-pid zostanie zastąpiony identyfikatorem procesu dd :

podczas kill -USR1 dd-pid  ; śpij 10 ; Gotowe

Nowsze wersje GNU dd obsługują opcję status=progress , która umożliwia okresowe drukowanie statystyk transferu na stderr.

Widelce

dcfldd

dcfldd to rozwidlenie GNU dd, które jest ulepszoną wersją, opracowaną przez Nicka Harboura, który w tym czasie pracował dla Laboratorium Informatyki Śledczej Departamentu Obrony Stanów Zjednoczonych . W porównaniu z dd , dcfldd umożliwia więcej niż jeden plik wyjściowy, obsługuje jednoczesne obliczenia wielu sum kontrolnych, zapewnia tryb weryfikacji dopasowywania plików i może wyświetlać procentowy postęp operacji. Ostatnie wydanie miało miejsce w 2020 roku.

dc3dd

dc3dd to kolejny ulepszony GNU dd z Centrum Cyberprzestępczości Departamentu Obrony Stanów Zjednoczonych (DC3). Można go postrzegać jako kontynuację dcfldd, z określonym celem aktualizacji za każdym razem, gdy aktualizowany jest upstream GNU. Jego ostatnie wydanie miało miejsce w 2018 roku.

Zobacz też

Bibliografia

Zewnętrzne linki