Re: Image erstellen mit dd - Groesse des Images reduzieren

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Thu, 20 Jul 2006 10:28:19 +0200 (CEST)

Markus wrote:
> ich moechte gerne ein Abbild einer HDD (/dev/da0) mit "dd" erstellen.

Warum umbedingt mit dd?

Ich würde ein kleines Image (muß etwas größer sein als der
Platzbedarf, z.B. 1,5 GByte) mit dd(1) anlegen, dieses dann
mit mdconfig(8) mounten, und dann die Daten von der Fest-
platte hineinkopieren (z.B. mit cpdup oder find|cpio).

Kochrezept (aber aufpassen, nicht blind abtippen! Im Zwei-
felsfall die Manpages der Kommandos konsultieren, oder
nochmal hier in der Liste fragen):

# dd if=/dev/zero of=/deine/image/datei bs=1m count=1536
1536+0 records in
1536+0 records out
1610612736 bytes transferred in 40.57594 secs (39693787 bytes/sec)
# mdconfig -a -t vnode -f /deine/image/datei
md1
# newfs -Un /dev/md1 # mdX laut Ausgabe von mdconfig!
/dev/md1: 1536.0MB (3145728 sectors) block size 16384, fragment size 2048
        using 9 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
        with soft updates
super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976
# mount /dev/md1 /mnt
# cd /die/festplatte # wo /dev/da0 gemountet ist!
# find -d . | cpio -dump /mnt
2043403 blocks
# umount /mnt
# mdconfig -d -u 1 # -u X laut Ausgabe von mdconfig oben!

Fertig! Das geht etwa hundertmal schneller als die Vari-
ante mit dd(1), da dabei nur tatsächlich belegte Blöcke
gelesen werden, nicht die ganzen 80 GByte.

> Das Problem dabei ist, dass die erstellte Image-Datei unnoetigerweise
> genauso gross ist wie die HDD selbst. Ich habe einige der conf-Optionen
> im manfile probiert (sync, sparse, osync) aber scheinbar war die
> richtige noch nicht dabei.
>
> Beispiel: HDD ist 80 GB gross und es befinden sich nur 1 GB Daten auf
> der HDD. Ich moechte gerne, dass das erstellte Image ebenfalls nur ca. 1
> GB gross ist, und nicht 80 GB.

Ein »Image« heißt deswegen so, weil es ein exaktes Abbild
des Devices ist, weshalb es auch dieselbe Größe haben muß.

Du kannst zwar mit dd eine sogenannte Sparse-Datei erzeugen
(Option »conv=sparse«, siehe die dd(1)-manpage). Diese
Datei ist dann zwar immer noch 80 GByte groß (laut Ausgabe
von »ls -l«), belegt aber physikalisch nur 1 GByte, weil
Blöcke, die nur aus Nullen bestehen, nicht belegt werden,
sondern sozusagen übersprungen werden.

Die Sache hat allerdings nur zwei Haken: Erstens ist nicht
garantiert, daß alle ungenutzen Blöcke auf der Festplatte,
von der Du ein Image machen willst, aus Nullbytes bestehen.
Da kann sonstwas drinstehen, z.B. Inhalte früherer Dateien,
die gelöscht wurden. Auch bei einem newfs(8) wird nicht
das gesamte Device mit Nullen überschrieben, weil das viel
zu lange dauern würde.

Zweitens kann man ein Sparse-Datei nicht als Image konfigu-
rieren (per mdconfig(8)), weshalb es praktisch unbrauchbar
ist, da man es weder mounten könnte noch sonst irgendwas
damit anstellen könnte (fsck, dump usw.).

> Ich habe irgendwo gelesen, dass
>
> dd if=/dev/zero of=/0bits bs=20m
>
> alle ungenutzten Bloecke in das File 0bits schreiben wuerde. Wenn man
> das File so lange schreibt bis die HDD bzw. Partition voll ist, und das
> File anschliessend loescht, so soll das Filesystem irgendwie optimiert
> worden sein (NUL bytes entfernt oder so)

Ehe im Gegenteil: Der gesamte freie Bereich wird mit Nul-
len gefüllt. Dadurch wird tatsächlich das erste Problem,
das ich oben nannte, behoben. Allerdings dauert es sehr
lange.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing
Dienstleistungen mit Schwerpunkt FreeBSD: http://www.secnetix.de/bsd
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
"C++ is to C as Lung Cancer is to Lung."
        -- Thomas Funke
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 20 Jul 2006 - 10:30:02 CEST

search this site