Tips en Trucs 2021

Schijfgegevens dupliceren met dd

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.

Waarschuwing

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.

Basisgebruik

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).

Blokken overslaan bij het lezen en schrijven

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.

Door dd gelezen gegevens comprimeren

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 blokapparaat wissen

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.

Conversie

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.

dd