dd auf der gesamten Festplatte, möchte aber keinen leeren Teil

dd auf der gesamten Festplatte, möchte aber keinen leeren Teil

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/sdXNunter /tgtfs/image.rawund sind Root:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. Verwenden Sie zerofilloder zerofreeeinfach:,
    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

  3. 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. ddEs 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.

verwandte Informationen