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 auf unserem Dateiserver gespeichert wird, damit andere Geräte, die wir herstellen, geflasht werden können. Daher möchte ich nur den verwendeten Speicherplatz (nur ca. 4 GB). Ich möchte die MBR usw. behalten, da dieses Gerät bootbereit sein sollte, sobald der Kopiervorgang abgeschlossen ist.
Irgendwelche Ideen? Ich hatte zuvor verwendet dd if=/dev/sda of=[//fileserver/file]
, aber zu diesem Zeitpunkt befand sich meine Masterkopie auf einem 4-GB-Flash-IDE.
linux
hard-drive
dd
Jonathan Henson
quelle
quelle
dd conv=sparse
.Antworten:
Früher hatte ich ein ähnliches Problem mit eingebetteten Linux-Distributionen: Beseitigen Sie den Müll, bevor Sie das Image komprimieren.
dd if=/dev/zero of=asdf.txt
. Warten Sie, bis es stirbt. Löschen Sie asdf.txt.Sie haben gerade Nullen in den gesamten freien Speicherplatz auf dem Gerät geschrieben.
Nehmen Sie nun ein Disk-Image und führen Sie es über gzip aus. Voila, spärliches Bild.
Vermutlich nicht sehr gut skalierbar und könnte Probleme verursachen, wenn Sie tatsächlich auf die Festplatte schreiben müssen, aber hey.
Sie können einen rsync-Schnappschuss der Festplatte auf ein anderes Volume erstellen, diesen auf Null setzen und dann das Festplatten-Image erstellen.
Hinweis: Dies kann eine Gefahr für die SSD darstellen. Der Benutzer sollte diesen Vorgang vor dem Festschreiben in Betracht ziehen.
quelle
dd if=sda2.gz | gunzip > /dev/sda2
unddd if=/dev/sda2 | gzip > sda2.gz
of
Pfad für jede Partition ausführen .Angenommen , Sie speichern möchten
/dev/sdXN
zu/tgtfs/image.raw
und Sie sind root:mkdir /srcfs && mount /dev/sdXN /srcfs
Verwenden Sie zerofill oder nur:,
dd if=/dev/zero of=/srcfs/tmpzero.txt
um nicht verwendete Blöcke mit Null zu füllen (warten Sie, bis das Dateisystem vollständig gefüllt istrm /srcfs/tmpzero.txt
).Nehmen Sie das Bild mit dd und verwenden Sie conv = sparse, um spontan Nullen zu setzen:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Wenn Sie die Komprimierung verwenden möchten, müssen Sie die Nullen nicht mit dd setzen, da Nullblöcke stark komprimierbar sind:
PS: Sie sollten beachten, dass dies keine gute Idee auf einem Flash-Speicher-basierten Speichermedium ist (dh Ihr Quelldateisystem ist SSD).
quelle
dd conv=sparse
.btrfs snapshot
undbtrfs send
Tools) ist meiner Meinung nach eine bessere Lösung.gz
Ihre nicht habenPATH
(wie ich es bei GParted Live nicht getan habe), können Siegzip -c
stattdessen verwenden.Verwenden Sie dd mit der Option count.
In Ihrem Fall haben Sie fdisk verwendet, daher werde ich diesen Ansatz wählen. Dein "sudo fdisk -l" erzeugt:
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 Versatz beginnen oder nach einer bestimmten Anzahl von Blöcken anhalten. Letzteres machen wir mit der count-Option in dd. Der Befehl würde folgendermaßen aussehen:
Wobei -bs die Blockgröße ist (es ist am einfachsten, die von fdisk verwendete Einheit zu verwenden, aber jede Einheit tut dies, solange die Option count in diesen Einheiten deklariert ist), und count ist die Anzahl der Einheiten, die wir kopieren möchten (Anmerkung) dass wir die Zählung um 1 erhöhen, um den letzten Block zu erfassen).
quelle
fdisk -l -u=cylinders /dev/sda
Während es möglich ist,
/dev/zero
den freien Speicherplatz zu nutzen unddd conv=sparse
/ zu nutzen,gz -c
ist es auf riesigen Festplatten mit einem leeren Speicherplatz von 100 GB/dev/zero
schmerzhaft langsam - ganz zu schweigen davon, dass/dev/zero
eine SDD bis EOF benötigt wird.Folgendes habe ich getan, als ich auf diese Situation gestoßen bin:
Bei einer Lubuntu-Live-CD wird
gparted
die Festplatte auf die kleinstmögliche Größe verkleinert, wobei der Rest des Speicherplatzes nicht zugewiesen wirdWird
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
zum Erstellen des schnell komprimierten Images verwendet (natürlich möchten Sie die Komprimierung möglicherweise überspringen, wenn Sie über ausreichend Speicherplatz zum Speichern von Rohdaten verfügen (oder auf andere Weise dazu neigen, die CPU-Belastung zu verringern).dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
zum Zurückkopieren der Daten auf eine andere Festplattegparted
erneut verwendet, um die Partition zu erweiternIch habe es nicht für mehrere Partitionen ausprobiert, aber ich glaube, der obige Prozess kann zum Kopieren von 'Partitionen' angepasst werden, wenn zuerst eine Partitionstabelle auf der Zieldisk erstellt wird und nur die in der Partition enthaltenen Daten über
dd
- Lesen / Schreiben von Offsets (skip
/seek
option ofdd
, resp.) wäre gegebenenfalls erforderlich.quelle
count
ParameterDas kannst du nicht.
dd
ist ein sehr einfaches Tool und kann nicht zwischen Dateien und leerem Speicher unterscheiden.Auf der anderen Seite wird der leere Raum sehr, sehr schön komprimiert. Wenn Sie sich also nur um den Speicherplatz kümmern, nicht zum Beispiel um die Schreibzeit, leiten Sie ihn einfach durch gzip.
quelle
Angenommen, der Rest des Laufwerks ist leer (alle Nullen), könnten Sie Ihre DD durch gzip leiten, was den leeren Raum recht gut komprimieren sollte. Sie können ein Werkzeug wie nullfrei verwenden , um sicherzustellen, dass Ihr leerer Bereich tatsächlich leer ist, sodass er gut komprimiert wird.
Wenn Sie ein Tool wie partimage , clonezilla oder eines der anderen Linux-Klon-Tools verwenden, erledigen diese das meiste automatisch für Sie.
quelle
Die akzeptierte Antwort ist nicht richtig. Ich stimme dem obigen Kommentar zu. Ich benutze dd mit Parameter count , um meine Festplatte regelmäßig zu sichern. Ersetzen Sie einfach den BACKUP_FOLDER und den Buchstaben Ihres Geräts durch "X":
Definieren Sie den zuletzt verwendeten Block der Festplatte:
Dann klonen Sie die Festplatte (mit Ausnahme des leeren Speicherplatzes):
quelle