So holen Sie unter OS X den gesamten / den meisten freien Speicherplatz aus einem Sparsebundle zurück


30

Gibt es eine Möglichkeit, ein Sparse-Bundle-Image zu "defragmentieren" und (den größten) Teil des freien Speicherplatzes zurückzugewinnen?

Hier ist der Hintergrund: Ich verwende spärliche Bundles und möchte von Zeit zu Zeit Speicherplatz von ihnen zurückfordern, damit ich Folgendes ausführen kann:

hdiutil compact image.sparsebundle

Wie in der Manpage erläutert, werden jedoch nur vollständig unbenutzte Banddateien wiederhergestellt. In meinem Fall heißt es also:

Reclaimed 0 bytes out of 90.4 GB possible.

Natürlich besteht die Möglichkeit, den Inhalt dieses Images in ein neues Sparse-Bundle zu kopieren, das dann anstelle von verwendet wird. Dies ist jedoch umständlich und erfordert genügend freien Speicherplatz für diesen Vorgang.

In der Zwischenzeit stellte ich fest, dass die Ausgabe des Befehls compact etwas irreführend ist (ich verwende derzeit OS X 10.5.7), da manchmal eine möglichst große Liste angezeigt wird, die größer ist als die Größe, die derzeit vom Image-Bundle auf der Festplatte belegt wird Fahrt. Ich habe nicht näher hingeschaut, aber die Ausgabe scheint entweder die maximale Größe oder "maximale Größe" - "verwendete Größe" zu sein.


1
Ich hatte ein Problem damit, aber dann wurde mir klar, dass mein Sparsebundle Fs EXFAT war. Nach dem Lesen der Manpage wurde mir klar, dass das Kompaktverb nur für "Disk-Images mit einem HFS-Dateisystem" funktioniert.
jsejcksn

@jsejcksn Das ist ein guter Punkt, den man sich merken sollte. Die Manpage sagt nun, dass APFS und HFS + unterstützt werden.
GDP2

Relevante Frage zu AskDifferent: apple.stackexchange.com/questions/54607/…
GDP2

Antworten:


20

Interessant!

Soweit ich gehört habe, teilt das Sparse-Bundle die Daten in 8-MB-Bänder auf. Das Ändern der Bandgröße kann hilfreich sein, wenn Sie Glück haben. Ich meine, du bekommst nie 100% zurückgewonnenen Platz, aber vielleicht besser als das, was du jetzt bekommst. (Abhängig von den Daten auf dem Bild usw.)

Ich habe einen schmutzigen einfachen Test mit zwei 500-MB-Sparse-Bundles durchgeführt, eines mit 8-MB-Bandgröße (Standard) und eines mit 1-MB-Bandgröße (kleinste zulässige Größe, soweit ich das beurteilen kann). Ich habe über 400 MB MP3-Dateien kopiert und dann alle anderen Dateien entfernt und bin dann hdiutil compactauf den Arsch gelaufen .

Size after compact
8Mb bands: 271Mb
1Mb bands: 215Mb

Der Befehl zum Konvertieren Ihres Sparse Bundles lautet

hdiutil convert src.sparsebundle -format UDSB -tgtimagekey sparse-band-size=2048 -o dst.sparsebundle

Die Bandgröße ist in der Einheit 512 Byte. Im obigen Beispiel wird die Bandgröße auf 512 * 2048 = 1 MB festgelegt. Seien Sie vorsichtig, wenn Sie mit TimeMachine-Images oder Images von Benutzerordnern usw. arbeiten. Sie weichen vom Apple-Pfad ab :) Bewahren Sie ein ausfallsicheres Backup auf!

Zur Defragmentierung: Ich habe das komische Gefühl, dass es genauso schnell (oder schneller!) Ist, einfach hdiutil zu verwenden, um die Sparse-Datei in eine neue Sparse-Datei mit demselben Format zu konvertieren. Ich denke, es versucht klug zu sein. Aber ich weiß es nicht.

(Beachten Sie, dass bei der Defragmentierung eines Sparse-Bundles nur die Festplattendaten defragmentiert werden, nicht die Sparse-Bundle-Bänder, es sei denn, es handelt sich um einen Defragmentierer, der das Sparse-Bundle hdiutil converterkennt . Wird das Band meiner Meinung nach "defragmentiert".)


Ihre Befehlszeilenargumente befinden sich in der falschen Reihenfolge: -osollten direkt davor stehen dst.sparsebundle, nicht src.sparsebundle( -obedeutet "Ausgabe").
Nick Forge

Beachten Sie außerdem, dass diese Methode die Verschlüsselung nicht beibehält. Möglicherweise gibt es ein Flag, mit dem dies aktiviert werden kann, aber zu diesem Zeitpunkt war es einfacher, sich im Festplatten-Dienstprogramm ein neues Sparsebundle zu erstellen und meine Dateien in dieses zu kopieren.
Justin Searls

2
Fügen Sie zur Verschlüsselung einfach den -encryptionSchalter zum Befehl hinzu.
Fideli

Vielen Dank. Die Verringerung der Sparse-Band-Größe ist sehr nützlich für Dropbox-gehostete Sparse-Bundles
Max Ried

Ok, das macht keinen Sinn ... wenn ich das Image defragmentiere, ist das resultierende Sparse Bundle 16% größer als das Original.
Michael

7

Ich finde die 90,4 GB möglich ist schlicht falsch. Als ich lief:

hdiutil compact *.sparsebundle

... es hat 16 GB Speicherplatz freigesetzt, was ungefähr dem entspricht, was ich erwartet hatte. Komischerweise hieß es ungefähr "800 GB möglich", was weit mehr ist als die Kapazität meiner HD. Ich gehe also davon aus, dass die zweite Zahl nur eine (fehlerhafte) theoretische Zahl ist.


2

@Oscar wies uns in die richtige Richtung. Sie müssen jedoch nicht auf 1 MB konvertieren und komprimieren, um Speicherplatz wiederzugewinnen.

Kopieren Sie stattdessen einfach Ihr Sparsebundle auf ein anderes neues Sparsebundle. Dadurch wird das Image für Sie defragmentiert. Gleichzeitig können Sie das Dateisystem, die Größe und sogar die Bänder ändern.

Hier ist ein Beispiel, das ich kürzlich gemacht habe und das mein 20-GB-Code-Image konvertiert hat, das ich über Geräte synchronisiere.

$ hdiutil create -size 20g -type SPARSEBUNDLE \
-imagekey sparse-band-size=2048 -fs HFSX \
-volname code -attach ~/sync/images/code.sparsebundle

Alle Optionen mit anzeigen hdiutil create -help.

Dieser Befehl gibt Folgendes aus:

/dev/disk3              GUID_partition_scheme
/dev/disk3s1            EFI
/dev/disk3s2            Apple_HFS                       /Volumes/code
created: /Users/eric/sync/images/code.sparsebundle

Sie können die -attachOption sehen, die es unter eingehängt wird /Volumes/code.

Hinweis: Ich verwende HSFXHFS + für die Groß- und Kleinschreibung, da ich meine Images auch mit Linux synchronisiere und einbinde. Sie werden höchstwahrscheinlich HFS+stattdessen verwenden wollen, da bei macOS normalerweise die Groß- und Kleinschreibung nicht berücksichtigt wird.

Jetzt muss ich nur noch alles auf mein neues Sparsebundle kopieren:

$ cp -r /Volumes/IMG_CODE/ /Volumes/code/

Und nun zum Vergleich:

# old sparsebundle
$ du -h ~/sync/images/IMG_CODE.sparsebundle/
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/bands
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/

# new sparsebundle
$ du -h ~/sync/images/code.sparsebundle/
3.0G    /Users/eric/sync/images/code.sparsebundle/bands
3.0G    /Users/eric/sync/images/code.sparsebundle/

Yay. Mein 15GB Sparsebundle ist jetzt 3GB, defragmentiert und die Bänder gewechselt!


Diese Methode wurde in der ursprünglichen Frage anerkannt ... Ich werde die Antwort nicht ablehnen, weil sie gut geschrieben und "informativ" ist, aber ... komm schon ...
adfaklsdjf


0

Wiedergewonnene 0 Bytes von 90,4 GB möglich.

Ich wette, das Laufwerk, auf dem sich das Sparse-Bundle befindet, hat ungefähr 90 GB freien Speicherplatz. Da Sparse-Bundles häufig wachsen können, bis die Festplatte voll ist, wird dieser Speicherplatz einfach als verfügbarer freier Speicherplatz gemeldet. Dieselben Zahlen werden im Festplatten-Dienstprogramm angezeigt. Sehr irreführend.

Folgendes könnte Ihnen einen Einblick geben:

hdiutil imageinfo image.sparsebundle

0

Ich hatte ein problematisches Sparse-Bundle, das behauptete, 950 GiB von 1024 GiB belegt zu haben (meine SSD ist nur 320 GiB groß, das konnte also nicht passieren). hdi compacthat nicht geholfen.

Ich habe "Erste Hilfe" vom Festplatten-Dienstprogramm auf Bundle- UND Partition ausgeführt, und die Anzeige für die Anzeige des freien Speicherplatzes zeigte echte 20 GiB an, wie sie hätte sein sollen, und hdi compactlief dann problemlos.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.