Dd

Aus Linupedia.org
Version vom 14. Juli 2007, 12:38 Uhr von Robi (Diskussion | Beiträge) (Partitionen und Platten Teil 1)
Wechseln zu: Navigation, Suche

einzelne Partitionen und ganze Platten mit dd

Das kopieren, klonen, oder als Image ablegen und wieder zurückschreiben von einzelnen Partitionen und ganzen Platten mittels dd, so wie es in unzähligen Beiträgen beschrieben ist, ist und bleibt eine riskante Angelegenheit, solange man sich nicht bewußt ist, was man da eigentlich genau macht.
Es werden genau genommen jedes Byte der Festplatte oder der Partition genau so gelesen, wie sie derzeit auf der Platte gespeichert sind, und wieder zurückgeschrieben wie sie zum jeweiligen Zeitpunkt des Lesens auf der Festplatte vorhanden waren. (siehe auch die allgemeinen Warnungen) Somit benötigt man ein zweites Medium, das auch groß genug ist, diese Daten auch wirklich aufzunehmen, den ein Image einer 200GB Festplatte ist nun einmal 200GB groß, auch wenn nur 10% davon mit Dateien belegt sind. Pinzipiell ist es demnach umso interessanter, je kleiner die Festplatte oder die Partition ist, und um so mehr Daten darauf aktuell abgelegt sind. Solange man ein solches Image dann auch wieder auf die gleiche Festplatte oder in die gleiche Partition zurück schreibt, ist das auch relativ ungefählich. Wird eine größere Festplatte zum zurückspielen benutzt, dann wird die größere Festplatte auf die Orginalgröße der ursprünglichen Festplatte "herunterkonfiguriert", ein Benutzen des übrigen unbenutzten Festplattenplatzes ist erst einmal ausgeschlossen und Versuche diesen doch noch nutzbar zu machen, sind sehr riskant für die Daten auf dieser Platte. Eine zu kleine Festplatte würde dann mindestens ein unvollständiges Filesystem ergeben, das sich gar nicht mounten läßt. Das selbe gilt für Partitionen analog. Sehr gefährlich ist zB. ein zurückschreiben von erweiterten und logischen Partitionen, wenn sich die Partitionstabelle geändert hat, bzw auf eine andere logische oder erweiterte Partition. Hierbei ist es durchaus möglich, das nach dem nächsten booten ein Teil der Daten auf der Platte gar nicht mehr aufzufinden sind.


Beispiele Clonen, Backup und Sicherung

Es gilt, möglichst alle Filesysteme ungemountet auslesen, wo das nicht möglich ist, zumindestens Readonly gemountet auslesen und dann auf das Image einen Filesystemcheck machen.

einzelne Partition als Image ablegen / Image temporär mounten / zurückschreiben

# dd if=/dev/hda2 of=/PATH/DATEI.IMAGE bs=8K
# mount -o loop /PATH/DATEI.IMAGE /mnt      # eventuell weitere Mountoptionen notwendig
# dd if=/PATH/DATEI.IMAGE of=/dev/hda2 bs=8K

Filesystemtype und Zustand eines Images ermitteln/korrieren (Konsolauszug)

LINUX:/ # file DATEI.IMAGE
DATEI.IMAGE: Linux rev 1.0 ext2 filesystem data (mounted or unclean)
LINUX:/ # fsck /PATH/DATEI.IMAGE  # evtl. weitere Optionen notwendig ; kompletten Path des Images
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/PATH/DATEI.IMAGE was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/PATH/DATEI.IMAGE: 72/16632 files (12.5% non-contiguous), 24776/66432 blocks
LINUX:/ # file DATEI.IMAGE
DATEI.IMAGE: Linux rev 1.0 ext2 filesystem data

einzelne Partition auf eine Festplatte mit identischem Partitionstabelle kopieren

# dd if=/dev/hda2 of=/dev/hdb2 bs=8K

ganze Festplatte als Image ablegen / zurückschreiben

# dd if=/dev/hda of=/PATH/DATEI.IMAGE bs=8K
# dd if=/PATH/DATEI.IMAGE of=/dev/hda bs=8K

man kann von einem solchem Image auch einzelne Partitionen temporär gemounten, dabei muss für das mount der jeweilige Offset benutzt werden.


Festplatte auf einen andere Festplatte klonen

# dd if=/dev/hda of=/dev/hdb bs=8K


Problem Komprimierung von dd-Image

Hin und wieder besteht die Notwendigkeit ein solches Image zu komprimieren, weil eben nur wenige wirkliche Daten auf der Platte/Partition liegen. Dabei wird man auf das Problem stoßen, das kann recht gut funktionieren aber muss nicht. Das liegt dann meistens an den zur Zeit nicht benutzten oder gelöschten Datenblöcken. Sind diese zum großen Teil nicht oder nicht richtig komprimierbar, dann wird man auch wenig Erfolg bei der Komprimierung der gesamten Platte/Partition haben.
Nachfolgend eine Möglichkeit wie man die leeren/unbenutzten Datenblöcke einer Partition sehr gut komprimierbar machen kann, ohne das die richtigen Daten dabei beschädigt werden. Man legt einfach neue "NULL"-Dateien an bis das Filesystem fast voll ist, danach löscht man sie wieder. Wir machen uns hier zum Vorteil, dass ein normaler User im Normalfall auf LINUX-Filesystemen nur bis zu 95% voll auf ein Filesystem schreiben kann. Ausnahme natürlich wenn Disk Quota eingerichtet ist.

Als root in das Filesystem ein neues Verzeichnis anlegen und für Schreibrechte des Users sorgen

# mkdir /PATH/test
# chmod a+w /PATH/test

Danach als User folgendes Script ausführen

#!/bin/bash
VERZEICHNIS=/PATH/test

dd if=/dev/zero of=/tmp/file.null count=1024 bs=1K 2>/dev/null
echo "anlegen von Dateien bitte warten" 
for i in {a..z}{a..z}{a..z}
 do
   for j in {0..9}{0..9}{0..9}{0..9}
   do
      NAME=${VERZEICHNIS}/leer$i$j
      cp /tmp/file.null $NAME 2>/dev/null || break 2
   done
done
rm /tmp/file.null

Als VERZEICHNIS ist hier genau das eben von root angelegte Verzeichnis anzugeben. Je nach Größe und Benutzungsgrad des Filesystems kann das schon seine Zeit dauern. Es werden 1MByte große Dateien in diesem Verzeichnis angelegt.
Ist das Script fertig, muss erst einmal der Cache des Filesystems die Daten alle auf Platte schreiben, also entweder abwarten oder wenn möglich das Filesystem umounten und anschließend wieder mounten. ( Das ist vor allem wichtig bei sehr kleinen Filesystemen die eventuell sogar komplett im Speicher gecacht sein könnten.)

Root kann jetzt das komplette Verzeichnis löschen (Achtung "rm *" im Verzeichnis wird meist wegen zu vieler Argumente nicht funktionieren)

rm -rf  /PATH/test

Jetzt muss erst einmal wieder der Cache das Filesystem neu mit der Platte abgleichen, also hier auch am Besten umount / mount (der sync Befehl hat hier erstaunlicherweise bei meinen Tests nicht immer das erhoffte Resultat gebracht)

Jetzt ist diese Partition bereit zum Erstellen eines effektiven komprimierten Images.

dd if=/dev/hda2 bs=4K | gzip > /PATH/DATEI.IMAGE.gz

Zurückschreiben könnte man dieses komprimierte Images zB.:

zcat /PATH/DATEI.IMAGE.gz | dd of=/dev/hda2 bs=4K 

Mit ganzen Platten geht das analog, nur sollte man für optimale Ergebnisse eben alle Filesysteme vorher "aufräumen".


Beispiel: dd nach einem Super-GAU im Filesystem
Beispiel: mit dd nach verlorenen Dateiinhalten suchen