Wie füllt man den freien Speicherplatz einer virtuellen Festplatte unter Windows auf Null, um eine bessere Komprimierung zu erreichen?

46

Wie füllt man den freien Speicherplatz einer virtuellen Festplatte unter Windows auf Null, um eine bessere Komprimierung zu erreichen?

Ich hätte gerne ein einfaches Open-Source-Tool (oder zumindest ein kostenloses) dafür. Es sollte wahrscheinlich eine möglichst große Datei voll schreiben 0und diese anschließend löschen. Nur ein Durchgang (dies ist nicht aus Sicherheitsgründen, sondern zur Komprimierung, wir sichern virtuelle Maschinen).

Sollte von Windows aus und nicht von einer Festplatte ausgeführt werden.

Unter Linux mache ich das (als Benutzer) so:

cd
mkdir wipe
sudo sfill -f -l -l -z ./wipe/

Edit 1: Ich habe mich entschieden, sdelete von der akzeptierten Antwort zu verwenden. Ich habe mir die Hilfe des sdelete angesehen:

C:\WINDOWS\system32>sdelete /?

SDelete - Secure Delete v1.51
Copyright (C) 1999-2005 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: sdelete [-p passes] [-s] [-q] <file or directory>
       sdelete [-p passes] [-z|-c] [drive letter]
   -c         Zero free space (good for virtual disk optimization)
   -p passes  Specifies number of overwrite passes (default is 1)
   -q         Don't print errors (Quiet)
   -s         Recurse subdirectories
   -z         Clean free space

Dies ist eine alte Version. Ich habe die Option -c ab dem 2. Aufruf verwendet und dies war ziemlich schnell (Syntax nur gültig für ältere Versionen vor V1.6):

c:\>sdelete -c c: (OUTDATED!)

Ich habe den Eindruck das macht was ich will. Das sdelete-Tool ist einfach zu bedienen und leicht zu bekommen.

Edit 2: Wie scottbb in seiner Antwort unten ausgeführt hat, wurde das Tool im September 2011 geändert (Version 1.6). Die Optionen -c und -z haben ihre Bedeutung geändert. Die korrekte Verwendung ab 1.6 ist

c:\>sdelete -z c:

Edit 3: Es gibt eine 2.0 Version von sdelete und sdelete64. Sie scheinen beim Nullstellen fehlerhaft zu sein. Es scheint extrem lange bei 100% festzustecken. Einige Leute haben 10- bis 40-mal länger berichtet. Die ältere Version 1.61 hat dieses Problem nicht. Siehe https://social.technet.microsoft.com/Forums/en-US/2ffb2539-34ba-4378-aa8a-941d243f117e/sdelete-hangs-at-100?forum=miscutils

Bearbeiten 4: Jetzt gibt es das Problem des dynamisch zugewiesenen virtuellen Speicherplatzes . Wenn Sie einen 100-GB-Datenträger haben, der nicht voll ist und nur 30 GB auf dem Host verwendet, sollte die Größe des Datenträgers durch Nullfüllung nicht dramatisch erhöht werden, da dies dem Zweck der dynamischen Zuordnung widerspricht . Es gibt eine Antwort für Oracle VM VirtualBox https://superuser.com/q/907196/44402 - auf anderen Stacks wie VMWare, Xen, XenServer usw. muss dies jedoch separat beantwortet werden.

mit
quelle
2
sdeleteist das richtige Tool für den Job, aber eine Änderung im September 2011 am Tool (Version 1.6) führt dazu, dass die obigen Antworten falsch sind. Die Optionen -cund -zhaben ihre Bedeutung geändert. Die korrekte Verwendung ist jetztsdelete -z c:\
scottbb
Stellen Sie außerdem sicher, dass Sie COW-Images (Copy on Write) verwenden, wenn Sie viele Computer haben, die auf derselben Basisinstallation basieren.
Matt

Antworten:

46

Verwenden Sie unter Windows das Sysinternals-Tool sdelete , um den gesamten leeren Raum auf Null zu setzen. Der gewünschte Befehl würde folgendermaßen aussehen sdelete -z c:.

Verwendung: sdelete [-p übergibt] [-s] [-q] ...  
sdelete [-p übergibt] [-z | -c] [Laufwerksbuchstabe] ...  
-a Schreibgeschütztes Attribut entfernen.  
-c Reinigen Sie den freien Speicherplatz.  
-p Durchläufe Gibt die Anzahl der Überschreibdurchläufe an (Standard ist 1).  
-q Drucke keine Fehler (Quiet).  
-s oder -r Recurse-Unterverzeichnisse.  
-z Kein freier Speicherplatz (gut für die Optimierung der virtuellen Festplatte).

Für Linux schlage ich vor, dass Sie nullfrei verwenden .

Zoredache
quelle
Kam hierher, um meine VHDs zu komprimieren. Teilen Sie einige verwandte Links von TechNet .. technet.microsoft.com/en-us/library/cc708394%28v=ws.10%29.aspx technet.microsoft.com/en-us/library/cc708317(v=ws.10 ) .aspx
Faiz
Ich frage mich, ob das Null-Füllen einen positiven Einfluss auf ein mit Linux-Standard verschlüsseltes Laufwerk LUKS dm-crypt haben würde . bevor ich die gesamte Maschine von einem Clonezilla-Bootstick und einer physischen Sicherung der gesamten Festplatte booten lasse. - Wird der auf Null gesetzte Abschnitt innerhalb der Verschlüsselung zu einem auf Null gesetzten Abschnitt auf der externen Festplatte führen? Oder schreibt es aus Sicherheitsgründen immer noch (nicht zugeordnetes) Rauschen? Oder sollte ich das Crypt-Laufwerk auf Null setzen (ohne verschlüsselte Inhalte zu betrachten)? (Und ist das eine gute Idee, dh ist die Zuordnungstabelle im Kontext eines verschlüsselten Laufwerks vertrauenswürdig?)
Frank Nocke
Ich wäre schockiert, wenn es etwas anderes tun würde als die Nullen zu verschlüsseln und das verschlüsselte "Rauschen" auf die Festplatte zu schreiben.
Dan Pritts
15

Windows verfügt bereits über ein integriertes Befehlszeilentool, das dies ausführt: CIPHER. Siehe seine / W-Option.

Der vollständige Befehl lautet also: cipher / w: c: (Ersetzen Sie c: durch den tatsächlichen Laufwerksbuchstaben.)

(Es schreibt Nullen in den ungenutzten Speicherplatz, dann 0xff, also müssen Sie es beobachten und mit Strg-C stoppen, wenn es beginnt, 0xff zu schreiben - nicht ideal, aber es ist kostenlos und in Windows mindestens seit XP verfügbar.)

David Balažic
quelle
3
interessanter Ansatz. Unterbrechen Sie die Ausführung, bevor alle Nullen rückgängig gemacht werden. +1 für eine kreative Lösung mit bereits vorhandenen Tools!
PsychoData
Ich frage mich, ob es möglich ist, zu erkennen, wann das Schreiben von Nullen beendet ist, und es dann zum Abbruch zu bringen ...
Frederick Nord,
Wenn Sie eine SSD-Festplatte verwenden, überprüfen Sie, ob TRIM aktiviert ist. Dann werden alle nicht verwendeten Blöcke mit dem 0xFF-Muster durch die Festplatten-Firmware schnell gelöscht. Dies ist sehr nützlich für Images von virtuellen Laufwerken, die von virtuellen Servern erstellt wurden. Diese Bilder werden als Lücken gefüllt und geben Dateisystemblöcke auf dem Host-Dateisystem frei.
Znik
Dies funktionierte sehr gut und viel schneller als SDelete -z (das zu 100% feststeckte, ohne ein anderes Feedback zu geben).
Psychowood
6

SDelete wird den Speicherplatz für die Komprimierung einer virtuellen Festplatte nicht auf Null setzen. SDelete setzt zunächst den freien Speicherplatz auf Null, füllt ihn dann jedoch mit 0xff und anschließend mit zufälligen Bytes. Informationen zum Einrichten einer VHD für die Komprimierung finden Sie unter Vorbereiten einer virtuellen Festplattendatei für Virtual Server 2005 zum Senden an Microsoft Product Support Services

Precompact.exe kann aus irgendeinem Grund schwierig zu finden sein. Ich habe hier eine separate herunterladbare Kopie gefunden . Wenn Sie jedoch über einen virtuellen Windows-PC verfügen, können Sie ihn auch aus% programfiles (x86)% \ Windows Virtual PC \ Integration Components \ Precompact.iso abrufen

Jim B
quelle
2
sdelete mit der Option -c ist eine Nullfüllung. Vielleicht denken Sie an das in Windows integrierte Verschlüsselungsdienstprogramm, für das es keine Option nur für Null gibt?
Jeremy M
"SDelete implementiert den Standard DOD 5220.22-M des US-Verteidigungsministeriums zur Bereinigung und Desinfektion." Mit sdelete -c wird der freie Speicherplatz auf Null gesetzt (nachdem er gefüllt wurde). Die von sdelete verwendete Methode ist jedoch nicht mit precompact identisch und führt in vielen Fällen zu einem größeren Laufwerk als precompact, mit dem virtuelle Laufwerke auf Null gesetzt werden sollen
Jim B
Das ist interessant, ein anderes Tool zu kennen. Vielen Dank
mit
2
SDelete kann die Festplatte mit 0en belassen, aber die Vorkompaktierung funktioniert viel schneller und war für diese Art von Situation gedacht.
Chris S
2
@romkyns Es spielt keine Rolle mehr, da alle modernen Versionen von Windows und Hyper-V trim(ab Win7 und Hyper-V 2012) unterstützt werden und vor dem Komprimieren keine Null mehr erforderlich ist. Das PreCompact-Dienstprogramm hat nur Teile der Festplatte mit gelöschten Dateien auf Null gesetzt. Der Teil, der noch nie verwendet wurde, blieb unberührt. Wenn Sie so etwas wie verwenden sdelete, wird der dynamische Datenträger auf eine statische Größe gefüllt, die dann wieder auf die tatsächlich verwendete Größe komprimiert werden kann.
Chris S
6

fsutilIst nicht Open Source, wird aber mit Windows ausgeliefert und kostet daher nichts extra. Ich habe es verwendet, um den freien Speicherplatz auf einem leeren WD 250 GB 7200 RPM-Laufwerk ( F:) auf Null zu setzen . Folgendes habe ich über die Befehlszeile ausgeführt:

fsutil volume diskfree f:

Welches zeigte diesen Bericht:

Total # of free bytes        : 249899469856
Total # of bytes             : 249997291520
Total # of avail free bytes  : 249899469856

Ich habe Total # of avail free bytesin den folgenden Befehlen verwendet:

fsutil file createnew F:\clear 249899469856
fsutil file setvaliddata F:\clear 249899469856
fsutil file setzerodata offset=0 length=249899469856 F:\clear
del f:\clear

Das Schreiben von 250 GB Nullen dauerte ungefähr 4 Stunden.

James L.
quelle
3

Auch ich hatte nach einer Möglichkeit gesucht, mit Cipher nur 0x00 zu schreiben und dann zu beenden, wenn 0xFF in den freien Speicher geschrieben wird. Dadurch kann der maximale freie Speicherplatz komprimiert werden. Ich habe mir den folgenden grundlegenden PowerShell-Job ausgedacht

Ersetzen Sie d: \ durch das erforderliche Laufwerk

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:d:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace

Grüße Simon

Simon Stevenson
quelle
1

Wenn Sie VMware verwenden, ist es viel besser, die in VMware integrierten Tools zu verwenden, um nicht genutzten Speicherplatz auf dem virtuellen Laufwerk freizugeben.

Ich habe dies verwendet, um die Größe der virtuellen Festplatte von 28 Gigabyte auf 13 Gigabyte zu reduzieren. Ihr Kilometerstand kann variieren.

Als ich versuchte sdelete -z c:, es zu verwenden , erhöhte es tatsächlich die Größe der virtuellen Laufwerke auf 30 Gigabyte, was seine maximale Größe war.

Finden Sie in der VMware - Website und Komprimieren eine virtuelle Festplatte , die unter ist Using VMware Workstation > Configuring and Managing Devices > Configuring and Maintaining Virtual Hard Disks.

Aktualisieren

Manchmal sind die GUI-Tools nicht ganz so zuverlässig wie die Befehlszeilentools. Ich bin auf Probleme gestoßen, bei denen die GUI-Tools fehlschlagen, aber die Befehlszeilen-Tools funktionieren einwandfrei. Hier sind die Optionen für VMware Desktop 10:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager -h
Diskname or some other argument is missing.
VMware Virtual Disk Manager - build 1895310.
Usage: vmware-vdiskmanager.exe OPTIONS <disk-name> | <mount-point>
Offline disk manipulation utility
  Operations, only one may be specified at a time:
     -c                   : create disk.  Additional creation options must
                            be specified.  Only local virtual disks can be
                            created.
     -d                   : defragment the specified virtual disk. Only
                            local virtual disks may be defragmented.
     -k                   : shrink the specified virtual disk. Only local
                            virtual disks may be shrunk.
     -n <source-disk>     : rename the specified virtual disk; need to
                            specify destination disk-name. Only local virtual
                            disks may be renamed.
     -p                   : prepare the mounted virtual disk specified by
                            the mount point for shrinking.
     -r <source-disk>     : convert the specified disk; need to specify
                            destination disk-type.  For local destination disks
                            the disk type must be specified.
     -x <new-capacity>    : expand the disk to the specified capacity. Only
                            local virtual disks may be expanded.
     -R                   : check a sparse virtual disk for consistency and attempt
                            to repair any errors.
     -e                   : check for disk chain consistency.
     -D                   : make disk deletable.  This should only be used on disks
                            that have been copied from another product.

Hier ist ein Beispiel für das Verkleinern einer Festplatte. Diese Befehlszeile funktionierte trotz des gleichen Befehls über die GUI:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager.exe -k
 "H:\VMware\WindowsXP.vmdk"
  VixDiskLib: Invalid configuration file parameter.  Failed to read configuration file.
  Shrink: 100% done.

Die Fehlermeldung, die mit beginnt, VizDiskLibist neu in VMware Desktop 10 und kann ignoriert werden.

Contango
quelle
1
sdelete selbst ist nicht dazu gedacht, die vmdk-Größe zu verkleinern. Es wird verwendet, um den gesamten verfügbaren freien Speicherplatz in Vorbereitung für den Verkleinerungsvorgang in Nullen umzuwandeln. Wenn Sie dies nicht tun, sind gelöschte Dateien und andere verwaiste Daten immer noch auf der Festplatte vorhanden. VMWare-Tools sind nicht immer in der Lage, den von diesen Dateien noch belegten Speicherplatz zurückzugewinnen. Wenn Sie diese "gelöschten Dateien" in Nullen verwandeln, kann der Speicherplatz beim Ausführen des Verkleinerungsprogramms vollständig zurückgewonnen werden. Der Grund für die Zunahme der Dateigröße auf der virtuellen Festplatte ist, dass sdelete den gesamten verfügbaren Speicherplatz mit Nullen ausfüllt.
Leon Lucardie
Vielen Dank für die Klarstellung. Ist der Ansicht, dass die Tools von einer besseren Benennung und / oder einer einzeiligen Beschreibung der Funktionsweise des Tools beim Ausführen profitieren könnten.
Contango
-1

Mit,

Ich fand, dass Simons Powershell-Skript genau das tat, was Sie brauchten, ohne die Versionsprobleme von sdelete. (Schalter, die verschiedene Dinge in verschiedenen Versionen tun)

Es gab ein Problem, die Chiffre lief weiter, aber das habe ich behoben.

Ich habe das Skript weiter modifiziert, um den temporären Ordner zu bereinigen:

Sie müssen F: \ an beiden Stellen durch Ihren Laufwerksbuchstaben ersetzen.

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:F:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    Stop-Process -processname cipher
    Start-Sleep -s 3
    Remove-Item -recurse F:\EFSTMPWP
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace
Preston Shirmeyer
quelle
-4

Warum Tools von Drittanbietern, wenn Windows bereits alles enthält, was Sie jemals brauchen, kostenlos und so schnell, wie es jemals sein kann:

1) format X: /fs:XXXX /p:#, wo Xist der Laufwerksbuchstabe; XXXXist das Dateisystem Yeither und #ist die Anzahl der Durchgänge;

2) cleanBefehl diskpart : http://technet.microsoft.com/library/cc766465.aspx , http://support.microsoft.com/kb/300415 ;

Übrigens brauchen Sie auch nicht mehr als einen einzigen Durchgang - ein Anspruch ist ansonsten entweder eine veraltete Information für veraltete Disk Red / Write-Strategien, Leute, die Produkte pushen, die von Paranoia getrieben werden, oder bs, die als "Expertenrat" weitergegeben werden.

Edit: NVM, verpasste den freien Speicherplatz Teil ...

user180961
quelle
1
In vielen Fällen stehen Tools von Drittanbietern zur Verfügung, die gute oder bessere Arbeit leisten, einfacher zu installieren oder zuverlässiger sind. Aber das ist total OT, die Frage war nicht, wer es schreibt. Abgesehen davon erwarb Microsoft Sysinternals (der SSDelete schrieb), weil sie Lichtjahre besser waren als das eingebaute Zeug. Vergleichen Sie ProcessExplorer einfach mit dem MS-Produkt "TaskManager" -1, um ein Flamewar zu starten
Alojz Janez
Sie haben die "Open Source" -Anforderung in der Frage verpasst, oder?
Alojz Janez