如何在 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
答案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
问候西蒙