Frage dd auf der gesamten Festplatte, aber keinen leeren Teil


Ich habe eine Diskette, 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 Bild machen, um es auf unserem Dateiserver zu speichern, um andere Geräte, die wir herstellen, zu blitzen, also will ich nur den benutzten Platz (nur ungefähr 4GB). Ich möchte die mbr usw. behalten, da dieses Gerät bootfähig sein sollte, sobald die Kopie fertig ist.

Irgendwelche Ideen? Ich hatte vorher benutzt dd if=/dev/sda of=[//fileserver/file], aber zu dieser Zeit war meine Master-Kopie auf einem 4 GB Flash-IDE.


27
2017-10-16 22:17


Ursprung


Alle Antworten sind falsch außer @sudoer. Die richtige Antwort ist zu verwenden dd conv=sparse. - bahamat
@ Bahamat, nein, gzip ist besser, da es die Daten komprimiert. - psusi
Das ist nicht dasselbe wie spärlich. - bahamat
@ Bahamat, fragt die Frage nicht speziell nach Sprase; wie man das Bild weniger Platz einnimmt. - psusi


Antworten:


Damals stieß ich auf ein ähnliches Problem mit eingebetteten Linux-Distributionen - lösche den ganzen Kram, bevor du das Bild komprimierst.

dd if=/dev/zero of=asdf.txt. Warte, bis es stirbt. Löschen Sie asdf.txt.

Sie haben gerade Nullen in den gesamten freien Speicherplatz auf dem Gerät geschrieben.

Nimm nun ein Disk-Image und führe es durch gzip. Voila, spärliches Bild.

Vermutlich skaliert es nicht sehr gut und könnte Probleme verursachen, wenn Sie tatsächlich auf die Festplatte schreiben müssen, aber hey.

Sie könnten einen rsync-Snapshot des Datenträgers auf einen anderen Datenträger aufnehmen, diesen zerlegen und dann das Datenträgerabbild erstellen.

Hinweis: Könnte für SSD gefährlich sein, Benutzer sollte diese Operation vor dem Begehen betrachten.


33
2017-10-16 23:37



Wenn ich es durch gzip laufen lasse, muss ich es entzippen, bevor ich es benutze? Und wenn ich es über gzip laufe, übertrage ich es einfach während des dd-Prozesses? - Jonathan Henson
Ja. dd if=sda2.gz | gunzip > /dev/sda2 und dd if=/dev/sda2 | gzip > sda2.gz - Rob Bos
"Sie haben gerade Nullen auf allen freien Speicherplatz auf dem Gerät geschrieben". Du meinst Partition, nicht Gerät, denke ich. Sie müssten also diesen Befehl mit einem ausführen of Pfad für jede Partition. - jiggunjer
Wenn es sich bei dem physischen Medium um eine SSD handelt, könnte es nun sein, dass jeder Sektor auf dem Gerät verwendet wurde. Dies wird der SSD weniger Ersatzsektoren zur Verfügung stellen und dadurch möglicherweise die Leistung verringern. Wenn der Treiber und die Firmware TRIM-Unterstützung haben, gilt diese Bedingung nur, bis Sie die Datei erneut löschen. Wenn Sie die Datei während der Erstellung des Bildes beibehalten, müssen Sie die Datei nach dem Wiederherstellen des Abbilds erneut löschen. Dies kann nützlich sein, wenn das Image auf SSD wiederhergestellt wird. - kasperd
Es gibt ein paar zusätzliche Bedenken, die man beachten sollte. Da diese Methode erfordert, dass das Dateisystem schreibgeschützt bereitgestellt wird, besteht das Risiko, dass Änderungen am zugrunde liegenden Dateisystem während des Kopiervorgangs zu einem inkonsistenten Bild führen. Bei einer Gelegenheit habe ich gesehen, dass die resultierende Kopie so inkonsistent ist, dass fsck tatsächlich segfault ist, wenn versucht wird, die Inkonsistenzen auf der Kopie zu reparieren. Auch das Auffüllen des Geräts kann dazu führen, dass andere Prozesse, die auf das Medium schreiben müssen, fehlschlagen. - kasperd


Angenommen, Sie möchten speichern /dev/sdXN zu /tgtfs/image.rawund du bist root:

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

  2. Verwenden Sie Zerofill oder einfach: dd if=/dev/zero of=/srcfs/tmpzero.txt um unbenutzte Blöcke mit Null zu füllen (warten Sie, bis das Dateisystem vollständig gefüllt ist) rm /srcfs/tmpzero.txt)

  3. Nimm das Bild mit dd und verwende conv = sparse, um Nullen on-the-fly zu stanzen: dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw 

Wenn Sie die Komprimierung verwenden möchten, müssen Sie die Nullen mit dd nicht stanzen, da Nullblöcke stark komprimierbar sind:

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

PS: Sie sollten beachten, dass dies keine gute Idee auf einem Flash-Speicher-basierten Speichermedium ist (d. H. Ihr Quelldateisystem ist SSD)


13
2017-12-13 01:02



Dies ist die richtige Antwort. Benutzen dd conv=sparse. - bahamat
Was ist falsch daran, dies auf Flash-Speicher zu tun? - Dan
@Dan (je nach Hardware- und Softwaredesign und -konfiguration) kann dies zu umfangreichen Schreibfehlern auf Ihrer SSD führen und deren Lebensdauer verringern. und im Allgemeinen ist es in Ordnung, Daten von alten auf neue Datenträger zu übertragen (oder was das OP tun wollte), aber Festplatten- / Partitions-Backup ist keine gute Lösung für die regelmäßige Sicherung und Wiederherstellung, auch auf Festplatten. Sicherung auf Dateiebene (d. h. Dateien von einem Dateisystem zu einem anderen verarbeiten) oder Sicherung auf Dateisystemebene (mit Dateisystemen wie BTRFS mit btrfs snapshot und btrfs send Werkzeuge) ist eine bessere Lösung IMHO. - Persian


Du kannst nicht. dd ist ein Tool auf sehr niedriger Ebene und es gibt keine Möglichkeit, zwischen Dateien und leerem Speicherplatz zu unterscheiden.

Auf der anderen Seite wird der leere Platz sehr, sehr schön komprimiert. Wenn Sie sich nur um Speicherplatz kümmern, nicht zum Beispiel Schreibzeit, dann leiten Sie ihn einfach durch gzip.


7
2017-10-16 22:27



Vorausgesetzt, der freie Speicherplatz wurde noch nicht verwendet. Sie können den freien Speicherplatz zuerst auf Null setzen, um sicherzustellen, dass die Komprimierung wie erwartet funktioniert. - Sirex
Wahr. Und es macht nur den Prozess komplizierter und dauert noch länger. - c2h5oh


Verwenden Sie dd mit der Option count.

In deinem Fall hast du fdisk benutzt, also werde ich diesen Ansatz wählen. Ihr "sudo fdisk -l" produziert:

    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 zwei Dinge, die Sie beachten sollten, sind 1) die Größe der Einheit und 2) die Spalte "Ende". In Ihrem Fall haben Sie Zylinder, die 8225280 Bytes entsprechen. In der "End" -Spalte endet sda8 bei 525 (was 525 [units] * 16065 * 512 = ~ 4,3GB ist)

dd kann viele Dinge tun, zum Beispiel nach einem Offset starten oder nach einer bestimmten Anzahl von Blöcken anhalten. Letzteres wird mit der Option count in dd gemacht. Der Befehl würde wie folgt aussehen:

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

Wobei -bs die Blockgröße ist (es ist am einfachsten, die Einheit zu verwenden, die fdisk verwendet, aber jede Einheit tut so lange, wie die Zähloption in diesen Einheiten deklariert ist), und count ist die Anzahl der Einheiten, die wir kopieren wollen (Anmerkung dass wir die Zählung um 1 erhöhen, um den letzten Block zu erfassen).


7
2018-06-03 00:33



FYI: um Einheiten in Zylindern anzuzeigen, verwenden Sie fdisk -l -u=cylinders /dev/sda - xinthose
Warum ist das nicht die akzeptierte Antwort? Es scheint die am wenigsten aufdringliche Option zu sein, da es die Quelle nicht verändert. - user33326


Angenommen, der Rest des Laufwerks ist leer (nur Nullen), könnten Sie Ihre DD durch gzip pipen, was den leeren Platz ziemlich gut komprimieren sollte. Sie können ein Werkzeug wie verwenden zerofree um sicherzustellen, dass Ihr leerer Bereich tatsächlich leer ist, damit er schön komprimiert wird.

Wenn Sie ein Werkzeug wie verwenden Teilbild, Klonenzilla oder einige der anderen Linux-Klonwerkzeuge, sie würden das meiste für Sie automatisch erledigen.


6
2017-10-16 22:25



partimage und clonezilla sind eigentlich schlau genug um zu überspringen lesen der freie Speicherplatz, anstatt darauf angewiesen, dass Sie Nullen darauf schreiben, und dann dd oder gzip Drop oder komprimieren Sie die Nullen nach dem Einlesen. - psusi


Während /dev/zeroden freien Speicherplatz und verwenden dd conv=sparse/gz -c ist möglich, auf großen Festplatten mit leerem Speicherplatz in 100 GB GB, /dev/zeroDas ist schmerzhaft langsam - ganz zu schweigen von anderen Antworten, /dev/zeroein SDD bis EOF.

Folgendes habe ich getan, als ich auf diese Situation stieß:

  • Auf einer Lubuntu Live CD, gebraucht gparted um die Platte auf die minimal mögliche Größe zu verkleinern, so dass der restliche Speicherplatz nicht zugewiesen wird

  • Gebraucht
    dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz um das schnell komprimierte Bild zu erstellen (es ist überflüssig zu sagen, dass Sie die Komprimierung überspringen sollten, wenn Sie genügend Platz zum Speichern von Rohdaten haben oder die CPU-Auslastung verringern möchten)

  • Gebraucht
    dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY um die Daten auf andere Festplatte zu kopieren
  • Gebraucht gparted erneut, um die Partition zu erweitern

Ich habe es nicht für mehrere Partitionen versucht, aber ich glaube, der obige Prozess kann angepasst werden, um "Partitionen" zu kopieren, wenn die Partitionstabelle auf der Zielplatte zuerst erstellt wird und nur die Daten in der Partition kopiert werden dd - Lesen / Schreiben von Offsets (skip/seek Option von dd, bzw.) wäre je nach Bedarf erforderlich.


5
2018-06-24 08:19



Das ist die richtige Antwort, benutze einfach die count Parameter - Gordy