Ich habe eine Reihe von Disk-Images, die mit ddrescue auf einer EXT-Partition erstellt wurden, und ich möchte deren Größe reduzieren, ohne Daten zu verlieren, während sie noch mounten können.
Wie kann ich den leeren Bereich im Dateisystem des Bildes mit Nullen füllen und die Datei dann in eine Datei mit geringer Dichte konvertieren, damit dieser leere Bereich nicht tatsächlich auf der Festplatte gespeichert wird?
Zum Beispiel:
> du -s --si --apparent-size Jimage.image
120G Jimage.image
> du -s --si Jimage.image
121G Jimage.image
Dies enthält jedoch nur 50 G reale Daten, sodass die zweite Messung viel kleiner sein sollte.
Dies wird angeblich den leeren Raum mit Nullen füllen:
cat /dev/zero > zero.file
rm zero.file
Wenn jedoch Dateien mit geringer Dichte transparent behandelt werden , wird möglicherweise eine Datei mit geringer Dichte erstellt, ohne dass etwas auf die virtuelle Festplatte geschrieben wird, was mich ironischerweise daran hindert, das Image der virtuellen Festplatte selbst in eine Datei mit geringer Dichte zu verwandeln. :) Macht es?
Hinweis: Funktioniert aus irgendeinem Grund, sudo dd if=/dev/zero of=./zero.file
wenn cat
dies nicht auf einem gemounteten Disk-Image der Fall ist.
quelle
sudo cat /dev/zero > zero.file
nicht, da Ihre Bash (ausgeführt wie Sie, nicht root) die Umleitung vor dem Ausführen dessudo
Befehls ausführt . Siehe unix.stackexchange.com/questions/1416/…Antworten:
Erstens werden spärliche Dateien nur dann transparent behandelt, wenn Sie suchen, nicht wenn Sie Nullen schreiben.
Zur Verdeutlichung das Beispiel aus Wikipedia
hat nicht schreiben keine Nullen, wird die Ausgabedatei öffnen, suchen (springen) 5 MB und dann schreiben Null Nullen (dh nichts). Dieser Befehl ( nicht aus Wikipedia)
schreibt 5 MB Nullen und erstellt keine Datei mit geringer Dichte!
Infolgedessen wird eine Datei, die bereits nicht dünn ist, später nicht auf magische Weise dünn.
Zweitens, um eine Datei mit vielen Nullen spärlich zu machen, müssen Sie cp es
oder Sie können auch die Option --sparse von tar oder rsync verwenden .
quelle
cat /dev/zero > zero.file
es vollkommen in Ordnung ist, den leeren Raum mit Nullen zu füllen.dd
Nullen zu schreiben oder zu suchen.cat
Befehl füllt Ihre gesamte Festplatte (oder zumindest den Betrag, der nicht für root oder nach Kontingenten reserviert ist) mit "echten" Nullen und erstellt keine spärlichen Dateien.Der einfachste Weg, eine Datei an Ort und Stelle zu sparsifizieren, ist möglicherweise die Verwendung des
fallocate
Dienstprogramms wie folgt:fallocate (1) wird vom util-linux- Paket unter Debian bereitgestellt .
quelle
fallocate --dig-holes
ergab sich eine 103GiB-Datei aus dem 299GiB-Original, währendcp --sparse=always
ich 93GiB erhielt - alle mit der gleichen SHA1-Summe (Größen überdu -B1G
vs überprüftdu --apparent-size -B1G
). Sofallocate
scheint schlechtere Ergebnisse zu geben.Der Vollständigkeit halber meine Antwort bearbeiten:
losetup --partscan --find --show disk.img
Angenommen, es gibt / dev / loop1 als Festplatte an und es gibt nur eine Partition. Andernfalls müssen wir dies für jede Partition mit einbaubarem FS wiederholen (Swap-Partition ignorieren usw.).
mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile
Lassen Sie es mit ENOSPC zum Scheitern kommen.
/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1
'dd' hat die Option, eine Datei mit Nullen in eine Datei mit geringer Dichte zu konvertieren:
dd if=disk.img of=disk-sparse.img conv=sparse
quelle
zerofree
möglicherweise schneller als das Mounten und Schreiben von Nullen in das Dateisystem, und das Festplatten-Image wächst weniger, wenn es bereits viele Nullen enthält.Meinen Sie damit, dass Ihr von ddrescue erstelltes Image beispielsweise 50 GB groß ist und in Wirklichkeit etwas viel weniger ausreichen würde?
Wenn dies der Fall ist, können Sie nicht einfach zuerst ein neues Bild mit dd erstellen:
und erstellen Sie dann ein Dateisystem darin:
dann einfach das Image mounten und alles vom alten auf das neue Image kopieren? Würde das für dich funktionieren?
quelle
PartImage kann Disk-Images erstellen, in denen nur die verwendeten Blöcke eines Dateisystems gespeichert werden, wodurch der erforderliche Speicherplatz drastisch reduziert wird, indem nicht verwendete Blöcke ignoriert werden. Ich glaube nicht, dass Sie die resultierenden Bilder direkt mounten können, aber gehen Sie:
Sollte produzieren, was Sie wollen (könnte sogar möglich sein, den letzten Schritt zu halten, habe es nicht versucht).
quelle
Es gibt jetzt ein Tool namens virt-sparsify, das dies erledigt . Es füllt den leeren Raum mit Nullen und kopiert das Bild dann in eine Datei mit geringer Dichte. Es erfordert jedoch die Installation vieler Abhängigkeiten.
quelle
Ich vermute, Sie benötigen ein benutzerdefiniertes Programm, das auf diese Spezifikation geschrieben ist, wenn Sie dies WIRKLICH tun möchten. Aber ist es...?
Wenn Sie tatsächlich viele Null-Bereiche haben, wird jedes gute Komprimierungswerkzeug diese erheblich reduzieren. Der Versuch, spärliche Dateien zu schreiben, funktioniert nicht in allen Fällen. Wenn ich mich richtig erinnere, belegen selbst spärliche Dateien mindestens 1 Block Ausgabespeicher, wobei der Eingabeblock JEDE Bits enthält, die nicht Null sind. Beispiel: Angenommen, Sie hatten eine Datei mit durchschnittlich 1 Bit ungleich Null pro 512-Byte-Block. Sie kann nicht "spärlich" geschrieben werden. Übrigens gehen keine Daten verloren, wenn Sie die Datei mit zip, bzip, bzip2 oder p7zip komprimieren. Sie sind nicht wie verlustbehaftete MPEG- oder JPEG-Komprimierung.
Wenn Sie jedoch zufällige Suchvorgänge in die Datei durchführen müssen, ist die Komprimierung möglicherweise schwieriger als es sich lohnt, und Sie kehren zum spärlichen Schreiben zurück. Ein kompetenter C- oder C ++ - Programmierer sollte in der Lage sein, so etwas in einer Stunde oder weniger zu schreiben.
quelle
cp --sparse=always
macht die Arbeit gut