如何在 Windows 上零填充虚拟磁盘的可用空间以获得更好的压缩?

mit*_*mit 51 virtualization windows zero-fill

如何在 Windows 上零填充虚拟磁盘的可用空间以获得更好的压缩?

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

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

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

cd
mkdir wipe
sudo sfill -f -l -l -z ./wipe/
Run Code Online (Sandbox Code Playgroud)

编辑 1:我决定使用已接受答案中的sdelete。我查看了 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
Run Code Online (Sandbox Code Playgroud)

这是一个旧版本。我在第二次调用中使用了 -c 开关,这非常快(语法仅对 V1.6 之前的旧版本有效):

c:\>sdelete -c c: (OUTDATED!)
Run Code Online (Sandbox Code Playgroud)

我的印象是这符合我的要求。sdelete 工具易于使用且易于获取。

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

c:\>sdelete -z c:
Run Code Online (Sandbox Code Playgroud)

编辑 3:有 2.0 版本的 sdelete 和 sdelete64。归零时它们似乎有问题。它似乎在很长一段时间内都停留在 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 等上,这需要单独回答。

Zor*_*che 51

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

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

对于 Linux,我建议您使用zerofree

  • 如果它除了加密空值并将加密的“噪声”写入磁盘之外还执行任何其他操作,我会感到震惊。 (2认同)

Dav*_*žic 19

Windows 已经有一个内置的命令行工具可以执行此操作:CIPHER。查看它的 /W 选项。

所以完整的命令是:cipher /w:c:( 替换c:用实际驱动器号 :)

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

  • 有趣的方法。在开始撤消所有零之前中断执行。+1 使用现有工具的创造性解决方案! (4认同)

Jam*_* L. 8

fsutil不是开源的,但与 Windows 一起提供,因此不需要任何额外费用。我用它来将空的 WD 250 GB 7200 RPM 驱动器上的可用空间归零 ( F:)。这是我从命令行运行的内容:

fsutil volume diskfree f:
Run Code Online (Sandbox Code Playgroud)

其中显示了这份报告:

Total # of free bytes        : 249899469856
Total # of bytes             : 249997291520
Total # of avail free bytes  : 249899469856
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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


Jim*_*m B 6

SDelete 不会将用于压缩虚拟磁盘的空间归零。SDelete 首先将可用空间归零,然后用 0xff 和随机字节填充它请参阅如何准备 Virtual Server 2005 虚拟硬盘文件以发送到 Microsoft 产品支持服务有关如何设置 VHD 以进行压缩

由于某些原因,Precompact.exe 可能很难找到。我在这里找到了一个单独的可下载副本。但是,如果您有 Windows 虚拟 PC,您也可以从 %programfiles(x86)%\Windows Virtual PC\Integration Components\Precompact.iso 获取它

  • 带有 -c 选项的 sdelete 是零填充。也许您正在考虑没有仅零选项的 Windows 内置密码实用程序? (2认同)
  • SDelete 可以将磁盘保留为 0,但 precompact 的工作速度要快得多,并且适用于这种情况。 (2认同)
  • @romkyns 这不再重要,因为所有现代版本的 Windows 和 Hyper-V 都支持`trim`(从 Win7 和 Hyper-V 2012 开始),在压缩之前不需要归零。PreCompact 实用程序仅将磁盘中已删除文件的部分归零,从未使用过的部分保持不变。使用类似 `sdelete` 之类的东西会将动态磁盘填充到静态大小,然后可以将其压缩回实际使用的大小。 (2认同)

小智 5

我也一直在寻找一种使用 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
Run Code Online (Sandbox Code Playgroud)

问候西蒙