dd

Kopiuje i konwertuje dane na poziomie bloków (pliki, dyski, obrazy).

dd to narzędzie do kopiowania i konwersji danych na poziomie bloków. Zamiast operować na plikach jak cp, czyta surowe bajty ze źródła (if) i zapisuje je do celu (of) porcjami o zadanym rozmiarze. Dzięki temu kopiuje nie tylko zwykłe pliki, ale też całe dyski, partycje czy obrazy ISO. Bywa nazywane „disk destroyer”, bo jeden literówka w of= potrafi nadpisać niewłaściwy dysk bez pytania o zgodę.

Składnia i najważniejsze opcje

Podstawowa forma to dd if=ŹRÓDŁO of=CEL [bs=...] [count=...]. Argumenty podaje się jako opcja=wartość, bez myślników.

  • if= — plik wejściowy (input file); domyślnie standardowe wejście.
  • of= — plik wyjściowy (output file); domyślnie standardowe wyjście.
  • bs= — rozmiar bloku odczytu i zapisu naraz (np. bs=4M); większy blok zwykle przyspiesza kopiowanie.
  • count= — ile bloków skopiować; przydatne, gdy nie chcesz całego źródła.
  • skip= — pomiń N bloków na wejściu przed startem.
  • seek= — przeskocz N bloków na wyjściu przed zapisem.
  • conv= — konwersje, np. noerror (nie przerywaj na błędzie odczytu), sync (dopełnij bloki zerami), fsync (wymuś zapis na dysk przed końcem).
  • status=progress — pokazuje postęp na bieżąco (GNU coreutils; na macOS/BSD tej opcji nie ma).

Przykłady użycia

  • dd if=/dev/sda of=/dev/sdb bs=64M status=progress — klonuje cały dysk sda na sdb blokami po 64 MB.
  • dd if=debian.iso of=/dev/sdc bs=4M conv=fsync status=progress — wypala obraz ISO na pendrive i wymusza zrzut bufora na nośnik.
  • dd if=/dev/zero of=test.img bs=1M count=100 — tworzy pusty plik o rozmiarze 100 MB wypełniony zerami.
  • dd if=/dev/sda of=mbr.bak bs=512 count=1 — robi kopię pierwszego sektora dysku (MBR) do pliku.
  • dd if=uszkodzony.iso of=ratunek.iso conv=noerror,sync bs=4M — próbuje odzyskać dane z uszkodzonego obrazu, pomijając błędne sektory.

Częste błędy i pułapki

Najgroźniejsza pomyłka to zamiana if z of albo wskazanie złego urządzenia w of=dd nie pyta o potwierdzenie i bezpowrotnie nadpisze cel. Zawsze sprawdź nazwy dysków przez lsblk przed startem. Pamiętaj też o różnicy: kopiuj urządzenie blokowe (/dev/sdb), a nie partycję (/dev/sdb1), jeśli chcesz cały dysk. Na Linuksie podejrzysz postęp przez status=progress, ale na macOS i BSD tej opcji brak — tam wyślij sygnał SIGINFO skrótem Ctrl+T, żeby zobaczyć ile już przeleciało. Zbyt mały bs (np. domyślne 512 bajtów) potrafi drastycznie spowolnić kopiowanie dużych dysków, więc ustaw rozsądny rozmiar bloku. I uważaj na jednostki: bs=1M to 1 MiB, a bs=1MB to 1 000 000 bajtów.

Powiązane komendy: cp, lsblk, sync, pv, cat, mkfs, fdisk.