
Ich habe eine Festplatte, sagen wir /dev/sda.
Hier ist fdisk -l:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Ich muss ein Image erstellen, das ich auf unserem Dateiserver speichern und zum Flashen anderer Geräte verwenden kann, die wir herstellen. Daher benötige ich nur den verwendeten Speicherplatz (nur etwa 4 GB). Ich möchte den MBR usw. behalten, da dieses Gerät startbereit sein sollte, sobald der Kopiervorgang abgeschlossen ist.
Irgendwelche Ideen? Ich habe vorher verwendet dd if=/dev/sda of=[//fileserver/file]
, aber damals befand sich meine Masterkopie auf einem 4 GB großen Flash-IDE.
Antwort1
Damals stieß ich bei eingebetteten Linux-Distributionen auf ein ähnliches Problem: Vor dem Komprimieren des Images musste ich den ganzen Müll loswerden.
dd if=/dev/zero of=asdf.txt
. Warten Sie, bis es beendet ist. Löschen Sie asdf.txt.
Sie haben gerade Nullen in den gesamten freien Speicherplatz auf dem Gerät geschrieben.
Erstellen Sie nun ein Disk-Image und führen Sie es durch gzip. Voila, ein Sparse-Image.
Ist wahrscheinlich nicht besonders gut skalierbar und könnte Probleme verursachen, wenn Sie tatsächlich auf die Festplatte schreiben müssen, aber hey.
Sie könnten einen Rsync-Snapshot der Festplatte auf einem anderen Volume erstellen, diesen auf Null setzen und dann dieses Festplatten-Image erstellen.
Hinweis: Könnte für die SSD gefährlich sein. Der Benutzer sollte diesen Vorgang vor der Ausführung bedenken.
Antwort2
Angenommen, Sie möchten speichern /dev/sdXN
unter /tgtfs/image.raw
und sind Root:
mkdir /srcfs && mount /dev/sdXN /srcfs
Verwenden Sie
zerofill
oderzerofree
einfach:,
dd if=/dev/zero of=/srcfs/tmpzero.txt
um ungenutzte Blöcke mit Nullen zu füllen. Warten Sie, bis das Dateisystem vollständig gefüllt ist, und gehen Sie dann wie folgt vor:
rm /srcfs/tmpzero.txt
Nehmen Sie das Bild mit dd auf und verwenden Sie conv=sparse, um im laufenden Betrieb Nullen einzufügen:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Wenn Sie Komprimierung verwenden möchten, müssen Sie die Nullen nicht mit dd stanzen, da Nullblöcke stark komprimierbar sind:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS: Beachten Sie, dass es keine gute Idee ist, dies (das Füllen des Dateisystems mit Nullen) auf einem Flash-Speicher-basierten Speichermedium (d. h. Ihr Quelldateisystem ist eine SSD) regelmäßig durchzuführen, da dies zu umfangreichen Schreibvorgängen auf Ihrer SSD führt und ihre Lebensdauer verkürzt. (Für die gelegentliche Datenübertragung ist es jedoch in Ordnung.)
Antwort3
Verwenden Sie dd mit der Zähloption.
In Ihrem Fall haben Sie fdisk verwendet, daher werde ich diesen Ansatz wählen. Ihr "sudo fdisk -l" hat Folgendes ergeben:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Die beiden Dinge, die Sie beachten sollten, sind 1) die Einheitengröße und 2) die Spalte „Ende“. In Ihrem Fall haben Sie Zylinder, die 8225280 Bytes entsprechen. In der Spalte „Ende“ endet sda8 bei 525 (das sind 525[Einheiten]*16065*512 = ~4,3 GB).
dd kann viele Dinge tun, z. B. nach einem Offset starten oder nach einer bestimmten Anzahl von Blöcken stoppen. Letzteres tun wir mit der count-Option in dd. Der Befehl würde wie folgt aussehen:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Dabei ist -bs die Blockgröße (am einfachsten ist es, die von fdisk verwendete Einheit zu verwenden, aber jede Einheit ist geeignet, solange die Option count in diesen Einheiten deklariert ist) und count ist die Anzahl der Einheiten, die wir kopieren möchten (beachten Sie, dass wir die Anzahl um 1 erhöhen, um den letzten Block zu erfassen).
Antwort4
Das geht nicht. dd
Es handelt sich um ein sehr einfaches Tool und kann nicht zwischen Dateien und leerem Speicherplatz unterscheiden.
Andererseits lässt sich der leere Speicherplatz sehr, sehr gut komprimieren. Wenn es Ihnen also nur um den Speicherplatz und nicht beispielsweise um die Schreibzeit geht, leiten Sie ihn einfach durch gzip.