Dd (Data Duplicate) is een zeer krachtig en handig programma, maar bij verkeerd gebruik ook zeer destructief (vandaar zijn bijnaam Data Destroyer). Zijn taak bestaat uit het converteren en kopiëren van bestanden. In Linux (en andere Unix-achtige besturingssystemen) wordt bijna alles behandeld als een bestand, zelfs blok apparaten zoals opslagmedia. Dit maakt dat dd kan ingezet worden om schijven te klonen of te wissen.
In de meeste distributies is dd standaard geïnstalleerd.
In de kracht van dd schuilt een groot gevaar. Even niet opletten kan fatale gevolgen hebben. Zo kan het omwisselen van de bron en het doel ervoor zorgen dat alle gegevens op een schijf onherroepelijk vernietigd worden.
Als voorbeeld gebruiken we een USB-stick met MBR indeling. Maar hoe weet je of de USB-stick MBR of GPT geformatteerd is? Wel de volgende opdracht toont ons een overzicht van de op een computer aanwezige opslagmedia met hun kenmerken:
dany@pindabook:~> sudo fdisk -l
[sudo] wachtwoord voor root:
Schijf /dev/sda: 238,47 GiB, 256060514304 bytes, 500118192 sectoren
Disk model: SAMSUNG MZ7TD256
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: gpt
Schijf-ID: 4377B292-5385-4B4B-8FDA-FA94290B7512
Apparaat Begin Einde Sectoren Grootte Type
/dev/sda1 2048 2050047 2048000 1000M Windows recovery-omgeving
/dev/sda2 2050048 2582527 532480 260M EFI-systeem
/dev/sda3 2582528 19357695 16775168 8G Linux wisselgeheugen
/dev/sda4 19357696 187131903 167774208 80G Linux bestandssysteem
/dev/sda7 187131904 500117503 312985600 149,2G Microsoft basisgegevens
Schijf /dev/sdb: 3,64 GiB, 3909091328 bytes, 7634944 sectoren
Disk model: USB DISK 2.0
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: dos
Schijf-ID: 0xf94e6308
Apparaat Op. Begin Einde Sectoren Grootte ID Type
/dev/sdb1 8192 7634943 7626752 3,6G b W95 FAT32
Op mijn laptop gebruikt de ingebouwde schijf (/dev/sda) de GPT indeling, zie de eigenschap Schijflabeltype: gpt
.
De USB-stick (/dev/sdb) heeft als Schijflabeltype: dos
, m.a.w. gebruikt de MBR indeling.
Standaard leest dd gegevens van het standaard invoer apparaat (toetsenbord) en schrijft het die gegevens naar de standaard uitvoer (terminal).
We kunnen zelf een alternatief invoerapparaat en uitvoerapparaat opgeven met de opties if
en of
.
Dd-opties schrijf je echter zonder - ervoor, wat bij Linux opdrachten zeer uitzonderlijk is.
Een typisch gebruik van de dd opdracht is het maken van een back-up van de Master Boot Record: de eerste sector van een schijf met MBR indeling. De lengte van deze sector is meestal 512 bytes (zie fdisk opdracht hierboven) en bevat de startcode (stage 1)) van de grub bootloader en de partitietabel. Om een back-up van de MBR te maken, gebruik je de volgende opdracht:
dany@pindabook:~> sudo dd if=/dev/sdb bs=512 count=1 of=mbr.img
[sudo] wachtwoord voor root:
1+0 records gelezen
1+0 records geschreven
512 bytes gekopieerd, 0,00146347 s, 350 kB/s
Om rechtstreeks toegang te krijgen tot het opslagmedium, heb je root rechten (systeembeheerder) nodig, vandaar dat dd door sudo
wordt voorafgegaan en dat je het root wachtwoord moet ingeven.
Met de optie bs
(BlockSize) geven we aan hoeveel bytes een blok (sector) bevat en met de count
optie hoeveel blokken gelezen moeten worden.
De uitvoer op het scherm toont ons hoeveel records gelezen en geschreven werden.
Daarna volgt het totaal aantal gekopieerde bytes, in hoeveel tijd en met welke snelheid.
De gekopieerde bytes (MBR gegevens) werden opgeslagen in het bestand mbr.img.
Het gebruik van het achtervoegsel .img
is in Linux van geen belang en mag je zelf kiezen (bijv: .dd).
Er zijn gevallen waarbij we een aantal blokken niet willen lezen en/of schrijven.
Daarvoor gebruiken we de opties skip
en seek
, ze worden gebruikt om een aantal blokken aan het begin van de invoer of uitvoer over te slaan.
Als je bijvoorbeeld de verborgen gegevens tussen de MBR en de eerste partitie wilt back-uppen of herstellen. De eerste partitie op een schijf start dikwijls op 2048 (op mijn USB-stick op 8192) (zie fdisk opdracht hierboven). De verborgen gegevens bevatten meestal de grub bootloader programmacode (stage 1.5). Om enkel de verborgen gegevens zonder de MBR op mijn USB-stick te back-uppen, gebruik je een dd opdracht met de skip optie:
dany@pindabook:~> sudo dd if=/dev/sdb of=verborgen.img bs=512 count=8191 skip=1
[sudo] wachtwoord voor root:
8191+0 records gelezen
8191+0 records geschreven
4193792 bytes (4,2 MB, 4,0 MiB) gekopieerd, 0,327754 s, 12,8 MB/s
Deze opdracht kopieert 8191
blokken met 512
bytes van de /dev/sdb
schijf, beginnend bij de tweede blok naar het bestand verborgen.img
.
Als we in de omgekeerde situatie de verborgen gegevens willen herstellen, gebruiken we de seek
optie om de gegevens op dezelfde plaats op de schijf te plaatsen:
dany@pindabook:~> sudo dd if=verborgen.img of=/dev/sdb bs=512 seek=1
[sudo] wachtwoord voor root:
8191+0 records gelezen
8191+0 records geschreven
4193792 bytes (4,2 MB, 4,0 MiB) gekopieerd, 1,2677 s, 3,3 MB/s
Deze opdracht schrijft de gegevens uit het bestand verborgen.img
naar de /dev/sdb
schijf vanaf de tweede blok.
Met dd kan je perfect een schijf klonen. Daarbij kopieert het byte per byte waardoor een schijf van 160 GB een back-up bestand aanmaakt van 160 GB. Door de gegevens voor het opslaan door te geven (pipe) aan een compressie opdracht zoals gzip kunnen we de bestandsgrootte beperken. Om een gecomprimeerde back-up te maken van de volledige USB-stick (/dev/sdb), gebruiken we:
dany@pindabook:~>sudo dd if=/dev/sdb bs=1M | gzip -c -9 > sdb.img.gz
[sudo] wachtwoord voor root: 3728+0 records gelezen 3728+0 records geschreven 3909091328 bytes (3,9 GB, 3,6 GiB) gekopieerd, 274,293 s, 14,3 MB/s dany@pindabook:~>ls -lh sdb.img.gz
-rw-r--r-- 1 dany users 1,1G 9 jul 16:16 sdb.img.gz
In het voorbeeld leest dd de gegevens van de /dev/sdb schijf.
We hebben de blokgrootte aangepast naar 1 MB (bs=1M
), wat zorgt voor een betere compressie en hogere snelheid.
De door dd gelezen data wordt doorgegeven aan gzip
om het te comprimeren en uiteindelijk op te slaan in het bestand sdb.img.gz
.
De -9
optie van gzip zorgt voor een maximale, maar ook tragere compressie.
De ls opdracht toont uiteindelijk dat het back-up bestand van de 4 GB USB-stick slechts 1,1 GB groot is.
Een andere toepassing van dd is het wissen van een schijf. Als je bijvoorbeeld een schijf wilt verkopen, doorgeven, enz. dan kan je uit privacy overwegingen de gegevens erop volledig wissen. Of je wilt de schijf volledig wissen om deze daarna de versleutelen. In het eerste geval volstaat het de schijf te overschrijven met nullen:
dany@pindabook:~> sudo dd if=/dev/zero bs=1M of=/dev/sdb
[sudo] wachtwoord voor root:
dd: fout bij schrijven van '/dev/sdb': Geen ruimte meer over op apparaat
^C3729+0 records gelezen
3728+0 records geschreven
3909091328 bytes (3,9 GB, 3,6 GiB) gekopieerd, 1077,56 s, 3,6 MB/s
Deze opdracht leest gegevens van het virtuele /dev/zero apparaat, dat enkel nullen levert en schrijft deze naar het apparaat tot het volgeschreven is.
De foutmelding is normaal, het /dev/zero apparaat blijft namelijk oneindig lang nullen leveren.
Ook als de USB-stick al vol met nullen is beschreven.
Je kunt na het verschijnen van de Geen ruimte meer over op apparaat
foutmelding de opdracht afbreken met de sneltoets Ctrl+c.
Voor je een schijf wilt versleutelen, kan je de schijf met willekeurige gegevens vullen. Zo zorg je dat sectoren met versleutelde gegevens niet opvallen tussen de sectoren die geen gegevens bevatten. Willekeurige gegevens kan je halen uit het virtuele /dev/random of /dev/urandom apparaat:
dany@pindabook:~> sudo dd if=/dev/urandom bs=1M of=/dev/sdb
dd: fout bij schrijven van '/dev/sdb': Geen ruimte meer over op apparaat
^C3729+0 records gelezen
3728+0 records geschreven
3909091328 bytes (3,9 GB, 3,6 GiB) gekopieerd, 1068,38 s, 3,7 MB/s
Beide hierboven vermelde opdrachten hebben tijd nodig om de schijf te vullen. Ook bij het afbreken ervan na de foutmelding. Deze uitvoertijd is onder andere afhankelijk van de grootte en het type van het blokapparaat en de gebruikte brongegevens. Zo wordt een harde schijf trager beschreven dan een SSD. Brongegevens worden sneller afgeleverd door /dev/urandom, dan door /dev/random. Daar tegenover staat dat de kwaliteit van de willekeurige gegevens van /dev/random hoger is dan van /dev/urandom.
Vanzelfsprekend zullen beide wisopdrachten ervoor zorgen dat de schijf onbruikbaar wordt. Je zult deze dus opnieuw moeten formatteren. De USB-stick uit het voorbeeld kan je terug formatteren met de opdrachten en het script in het artikel USB Stick formatteren.
De conv opties van dd worden gebruikt om gegevens aan een bepaalde situatie aan te passen. De opties worden aangeboden met waarden gescheiden door komma's. Een paar veel gebruikte conv opties:
Een veel voorkomende situatie is het klonen van een schijf met defecte sectoren.
Bij het gebruik van de optie conv=sync,noerror
zal dd defecte sectoren overslaan (noerror
) en de niet leesbare gegevens vervangen door nullen (sync
) zodat de positie van alle leesbare gegevens behouden blijft.