Tips en Trucs 2010

MBR Backup

Naast het maken van een backup van de gegevens op een harde schijf, kan een backup van de MBR van een harde schijf ook zijn nut hebben. Het master boot record (MBR of partitiesector) is de bootsector van de PC (IBM PC architectuur). De MBR is de allereerste sector van een harde schijf. Er staan een reeks opdrachten in die nodig zijn om het besturingssysteem te laden (booten). Het MBR van een schijf bevat normaliter de partitietabel, die de PC dan gebruikt om het bootrecord op de partitie die gemarkeerd is met de active flag te laden en uit te voeren. M.a.w. een belangrijk onderdeel van de harde schijf.

Op de volgende manier maak je een backup van de MBR van het apparaat /dev/sda:
dany@linux-lno5:~> sudo dd if=/dev/sda of=/tmp/sda.mbr count=1 bs=512
root's password:
1+0 records gelezen
1+0 records geschreven
512 bytes (512 B) gekopieerd, 3,6266e-05 s, 14,1 MB/s

De dd opdracht is een zeer eenvoudig programma om een image (exacte kopie) te maken. Het kopieert enkel de pure binaire gegevens. Daar we niet de volledige schijf willen kopiëren, gebruiken we de argumenten count=1 en bs=512 om de eerste blok van 512 bytes van de schijf te kopiëren.

Om een backup naar een beschadigde of foutieve MBR terug te zetten, gebruik je de volgende opdracht:
sudo dd if=/tmp/sda.mbr of=/dev/sda

De opdracht om de MBR terug te zetten is nog eenvoudiger dan de opdracht om de backup te maken. Aangezien het backup bestand maar 512 bytes groot is, worden er maar 512 bytes teruggezet. Standaard begint dd aan het begin van de schijf te schrijven.

Nu we weten hoe het maken van een MBR backup in elkaar steekt, kunnen we het maken van MBR backups automatiseren voor alle soorten apparaten en computers. Dit kan met wat logica in een bash script. Eerst het script, daarna de bespreking.

#!/bin/bash
declare -a disks=($(echo /dev/[hs]d?))

for disk in "${disks[@]}" 
do 
	dd if=$disk of=/tmp/$(basename $disk).mbr count=1 bs=512
done

In de tweede regel maken we een array met de naam disks. Een array is een plaatshouder (variabele) waar we meerdere waarden in kunnen opslaan. De array wordt opgevuld met de resultaten van ($(...)) van de opdracht echo /dev/[hs]d?. Deze opdracht somt de bestanden in de map /dev/ op die beginnen met h of s, het tweede teken een d is en gevolgd wordt door één enkel willekeurig teken. De lijst kan dus bestaan uit sda, sdb, hda, enz. Maar bevat geen partities zoals sda1.

Deze opdracht toont op een computer met een SATA harde schijf en een IDE DVD speler het volgende:
dany@linux-lno5:~> echo /dev/[hs]d?                                                                                                     
/dev/hdc /dev/sda
De informatie van de opdracht wordt opgeslagen in het array, waardoor deze in dit voorbeeld twee waarden krijgt:

De for lus behandelt elke waarde van de array, waarbij van elke schijf een MBR backup gemaakt wordt. De opdracht basename haalt de bestandsnaam uit het volledige pad, m.a.w. /dev/sda wordt sda.

Het uitvoeren van het script toont ons het volgende:
dany@linux-lno5:~> sudo ./backup.sh 
root's password:
dd: openen van ‘/dev/hdc’: Geen medium gevonden                                                                                         
1+0 records gelezen
1+0 records geschreven
512 bytes (512 B) gekopieerd, 8,5452e-05 s, 6,0 MB/s

De DVD speler bevat geen DVD waardoor er geen MBR backup van gemaakt werd. Mocht er toevallig toch een DVD in de DVD speler aanwezig zijn, dan wordt een naar mijn mening overbodige MBR backup van de DVD genomen (in een bestand van slechts 512 bytes).