dd (Unix)

Z Wikipedii, wolnej encyklopedii

dduniksowy program do niskopoziomowego kopiowania i konwersji surowych danych (ang. raw data). dd jest używane do kopiowania określonej liczby bajtów lub bloków danych wraz z opcjonalnym konwertowaniem kopiowanych danych (np. zmianą kolejności bajtów, konwersją z EBCDIC do ASCII). Powszechnym wykorzystaniem dd jest do tworzenia kopii boot sektora dysku, odczyt danych ze specjalnych plików takich jak /dev/zero albo /dev/random. Sprawdza się również przy odczycie i zapisie urządzeń blokowych takich jak taśmy magnetyczne.

Ponieważ dd potrafi operować na partycjach lub na całych dyskach, jest często wykorzystywane przy gromadzeniu „cyfrowych dowodów”, gdzie niezbędne jest odczytanie dysku „bit po bicie”. Użycie komendy cp byłoby tu niewystarczające, gdyż dane z usuniętych plików, które nie zostały jeszcze „nadpisane”, nie są widoczne dla systemu plików, do którego odwołuje się cp, a który dd pomija.

W GNU/Linuksie jest częścią pakietu GNU Coreutils.

Pochodzenie nazwy[edytuj | edytuj kod]

  • convert and copy” → „cc” → „dd

część podręcznika systemu UNIX z 1975 r. opisująca dd była zatytułowana „dd - convert and copy a file”. Ponieważ skrót „cc” od pierwszych liter wyrażenia „copy and convert” był już zajęty przez kompilator języka C (ang. C Compiler), stąd zdaniem niektórych użyto kolejnych liter alfabetu.

  • „dd” jest akronimem wyrażenia „data definition” pochodzącego z języka JCL firmy IBM, jednak jego składnia nie ma związku z poleceniem uniksowym.
  • niektórzy mówią żartobliwie, że dd to skrót od „destroy disk” lub „delete data”, ponieważ omyłkowa zamiana wartości parametru „of” (ang. output file - plik wyjściowy) może zniszczyć dane (nadpisując dane z dysku źródłowego nieopatrznie użytego jako docelowy).

Składnia polecenia dd[edytuj | edytuj kod]

np. dd if=nazwa_pliku_wejściowego of=nazwa_pliku_wyjściowego

W rodzinie systemów UNIX obowiązuje zasada, aby stosować jednakową składnię dla wszystkich poleceń linii poleceń. Twórcy dd złamali tę zasadę[potrzebny przypis], rzekomo wzorując składnię dd na składni języka JCL. Zamiast uniksowej składni „-opcja wartość” dd używa składni „opcja=wartość”. Ponadto wejście programu dd oznaczamy opcją „if” (ang. input file - plik wejściowy), podczas gdy większość komend pobiera nazwę wejścia bez dodatkowych oznaczeń. W przypadku wyjścia programu „of” (ang. output file - plik wyjściowy) sytuacja jest analogiczna. Innymi słowy w dd stosowane są parametry kluczowe, a nie pozycyjne. Nadmiarowa składnia zapobiega pomyleniu i bezpowrotnej destrukcji danych.

Przykłady wykorzystania[edytuj | edytuj kod]

dd if=/dev/cdrom of=/home/użytkownik/obraz_plyty.iso

gdzie /dev/cdrom jest plikiem urządzenia odczytującego CD-ROM, a /home/użytkownik/obraz_plyty.iso plikiem wynikowym.

  • Nagrywanie obrazu dyskietki na dyskietkę:
dd if=obraz_dyskietki.img of=/dev/fd0

obraz_dyskietki.img - nazwa pliku zawierającego obraz dyskietki. /dev/fd0 - napęd dyskietek

  • Tworzenie kopii MBR dysku:
dd if=/dev/hda of=kopia_mbr bs=512 count=1

zapisze kopię MBR pierwszego dysku (hda) w pliku kopia_mbr

  • Kasowanie całego dysku (wraz z MBR i wszystkimi partycjami) przez nadpisanie losowymi danymi:
dd if=/dev/urandom of=/dev/sdb
  • Secure Erase HDD
dd if=/dev/zero of=dysk
  • Enhanced Secure Erase HDD
export hdd=dysk
for n $(seq 1 2); do dd if=/dev/urandom of=$hdd; done; dd if=/dev/zero of=$hdd

/dev/sdb - nazwa dysku, który chcemy skasować (dyski można sprawdzić #fdisk -l).

  • Tworzenie pliku o rozmiarze 1 GB wypełnionego losowymi danymi.
dd if=/dev/urandom of=duzy_plik bs=512 count=2097152

Ponieważ 1GB to 1024⋅1024⋅1024 = 1 073 741 824 B, a parametrem bs=512 określiliśmy pożądany rozmiar bloku danych na 512 B, stąd liczba kopiowanych bloków danych musi wynosić: 1 073 741 824 / 512 = 2 097 152, co określa parametr count=2097152.

  • Przegranie wszystkich bajtów z partycji /dev/sdb2 do pliku, poza pierwszymi 29 997 563 904 (=288⋅1024⋅101 717) bajtami - komenda bash
disk='/dev/sdb2'
tape='reszta1Linux'
(dd bs=288k skip=101717 count=0 && dd bs=1) < $disk> $tape

512 bajtów jest domyślnym rozmiarem bloku.

  • Przeglądanie (lub przeszukiwanie z „/”) zawartości pamięci.
dd if=/dev/mem | hexdump -C | less
  • Czyszczenie wolnej przestrzeni nośnika w celu zwiększenia kompresowalności jego obrazu.
$ dd if=/dev/zero bs=4096 count=1000 of=p1; dd if=/dev/zero of=p2; rm -f p1; rm -f p2
  • Przesyłanie z kompresją obrazu całego dysku komputera A (wszystkie partycje) na komputer B lokalnej sieci. Kompresja i łączenie przez nc jest parę razy szybsze niż przez popularne ssh, jednak nie chroni danych przed podsłuchem, dlatego niebezpieczne poza siecią pod kontrolą.
A # dd if=/dev/cciss/c0d0 |gzip |nc 192.168.1.30 5555
B $ nc -l 5555 > zapasSerwera.img.gz

W przykładzie /dev/cciss/c0d0 to macierz dyskowa HP. Do wejścia 'if=' może być skierowane również dowolne urządzenie: dysk /dev/sda macierz programowa /dev/md1, pojedyncza partycja np/dev/sdp6 lub logiczny volumen /dev/vgrupa2/lvol4. Jeżeli uruchomimy komputer A z linuksowego Live CD można będzie podobnie zabezpieczyć system dowolnego Windows cały pierwszy twardy dysk z partycją C: będzie wtedy /dev/hda lub /dev/sda.

  • Tworzenie kopii dysku z dokładnością do jednego bita:
# dd if=/dev/sdb of=dysk.img 

Gdzie /dev/sdb to dysk którego chcemy zrobić kopię, a dysk.img to plik obrazu dysku (w wypadku określenia urządzenia zamiast pliku, zostanie on sklonowany)

  • Tworzenie kopii uszkodzonego dysku z dokładnością do jednego bita.
# dd if=/dev/hdb of=uszkodzony_dysk.img conv=noerror


Gdzie /dev/hdb to uszkodzony dysk którego chcemy zrobić kopię, a uszkodzony_dysk.img to plik obrazu dysku.

Linki zewnętrzne[edytuj | edytuj kod]