dd

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

dd - uniksowy 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 komendą unixową.
  • 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 komend linii poleceń. Twórcy dd złamali tę zasadę[potrzebne źródło] 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 io i bezpowrotnej destrukcji danych.

Przykłady wykorzystania[edytuj | edytuj kod]

dd if=/dev/cdrom of=/home/user/obraz_plyty.iso

gdzie /dev/cdrom jest plikiem urządzenia odczytującego CD-ROM, a /home/user/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

/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 = 1073741824 B, a parametrem bs=512 określiliśmy pożądany rozmiar bloku danych na 512 B, stąd ilość kopiowanych bloków danych musi wynosić: 1073741824 / 512 = 2097152 co określa parametr count=2097152.

  • Przegranie wszystkich bajtów z partycji /dev/sdb2 do pliku, poza pierwszymi 29997563904 (=288*1024*101717) 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 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.

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]