如何在 Windows 上将虚拟磁盘的可用空间填充为零以实现更好的压缩?

如何在 Windows 上将虚拟磁盘的可用空间填充为零以实现更好的压缩?

如何在 Windows 上将虚拟磁盘的可用空间填充为零以实现更好的压缩?

我想要一个简单的开源工具(或者至少是免费的)。它可能应该写入一个尽可能大的文件,0然后将其删除。只有一次(这不是出于安全原因,而是为了压缩,我们正在备份虚拟机)。

应该从 Windows 内部运行,而不是从磁盘运行。

在 Linux 上我这样做(作为用户):

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

编辑1:我决定使用删除来自接受的答案。我查看了 sdelete 的帮助:

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

这是一个旧版本。我从第二次调用开始就使用了 -c 开关,速度非常快(语法仅适用于 V1.6 之前的旧版本):

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

我觉得它满足了我的需求。sdelete 工具使用简单,获取方便。

编辑2:正如 scottbb 在下面他的回答中指出的那样,该工具在 2011 年 9 月进行了更改(版本 1.6),-c 和 -z 选项的含义已发生改变。从 1.6 开始,正确的用法是

c:\>sdelete -z c:

编辑3:sdelete 和 sdelete64 有 2.0 版本。它们在归零时似乎存在错误。它会停留在 100% 很长时间。有些人报告说时间长了 10 到 40 倍。旧版本 1.61 没有这个问题。请参阅https://social.technet.microsoft.com/Forums/en-US/2ffb2539-34ba-4378-aa8a-941d243f117e/sdelete-hangs-at-100?forum=miscutils

编辑4:现在的问题是动态分配的虚拟磁盘空间。如果你有一个 100GB 的磁盘,它还未满,而且主机上只使用了 30GB,那么零填充不应大幅增加磁盘的大小,因为这与动态分配的目的相矛盾. 答案是Oracle VM VirtualBox https://superuser.com/q/907196/44402- 但在其他堆栈(如 VMWare、Xen、XenServer 等)上,需要单独回答这个问题。

答案1

在 Windows 上,使用 sysinternals 工具删除将所有空白空间清零。您需要的命令应如下所示sdelete -z c:

用法:sdelete [-p goes] [-s] [-q] ...  
sdelete [-p 通过] [-z|-c] [驱动器号] ...  
-a 删除只读属性。  
-c 清理可用空间。  
-p 传递指定覆盖传递的次数(默认值为 1)。  
-q 不打印错误(安静)。  
-s 或 -r 递归子目录。  
-z 零可用空间(有利于虚拟磁盘优化)。

对于 Linux,我建议你使用零自由

答案2

Windows 已经有一个内置的命令行工具可以执行此操作:CIPHER。请参阅其 /W 选项。

因此完整的命令是:密码/w:c: (代替C:以实际驱动器号为准)

(它将零写入未使用的空间,然后是 0xff,因此您必须观察它并在它开始写入 0xff 时使用 ctrl-c 停止它 - 虽然不理想,但它是免费的并且至少从 XP 开始在 Windows 中已经可用)

答案3

fsutil不是开源的,但它确实随 Windows 一起提供,因此不需要额外付费。我使用它来清空 WD 250 GB 7200 RPM 驱动器上的可用空间 ( F:)。以下是我从命令行运行的内容:

fsutil volume diskfree f:

该报告显示:

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

我使用了Total # of avail free bytes以下命令:

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

写入250GB的零大约需要4个小时。

答案4

我也一直在寻找一种使用 Cipher 只写入 0x00 然后在开始向可用空间写入 0xFF 时退出的方法。这将允许最大可用空间被压缩。我想出了以下基本的 PowerShell 作业

将 d:\ 替换为所需驱动器

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

问候西蒙

相关内容