如何将Windows上虚拟磁盘的可用空间归零以更好地压缩?


46

如何将Windows上虚拟磁盘的可用空间归零以更好地压缩?

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

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

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

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

编辑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

这是旧版本。我从第二次调用中使用了-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/zh-CN/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等)上,需要单独回答。


2
sdelete是适合该工作的工具,但是2011年9月对该工具(1.6版)进行了更改,因此上述答案不正确。在-c-z选项已更改的含义。现在正确的用法是sdelete -z c:\
scottbb

如果您有许多基于相同基本安装的计算机,还请确保使用COW(写入时复制)样式的图像。
马特

Answers:


46

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

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

对于Linux,我建议您使用zerofree


来这里压缩我的VHD。共享来自TechNet的一些相关链接。technet.microsoft.com/ en-
Faiz 2015年

我想知道,零填充是否会对Linux标准加密驱动器LUKS dm-crypt产生任何积极影响。我让整个计算机经受来自clonezilla引导程序的引导以及整个驱动器的物理备份之前。—加密中的调零部分是否会导致外部磁盘上的调零部分?还是出于安全原因,它仍会写入(未分配)噪声吗?还是应该将原始安装(不查看加密内容)的加密驱动器归零?(这是一个好主意,即在加密驱动器的上下文中分配表值得信赖吗?)
Frank Nocke

如果它除了加密null并将加密的“噪声”写入磁盘外,还做其他事情,我会感到震惊。
丹·普里兹

15

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

因此,完整的命令应为:cipher / w:c :(用实际的驱动器号 替换c :)

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


3
有趣的方法。在开始撤消所有零之前中断执行。+1可以使用已有的工具提供创造性的解决方案!
PsychoData

我想知道是否有可能检测到何时完成写零,然后使其中止……
Frederick Nord

如果使用SSD硬盘驱动器,请检查是否已启用TRIM。然后,所有未使用的块将被硬盘固件以0xFF模式快速擦除。这在虚拟服务器制作的虚拟磁盘映像上非常有用。该映像将被填充为空白,并将释放托管文件系统上的文件系统块。
Znik

这比SDelete -z效果很好,并且速度要快得多(SDelete -z的速度为100%,未提供任何其他反馈)。
Psychowood '17

6

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

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


2
带-c选项的sdelete为零填充。也许您在考虑Windows内置的密码实用程序,该实用程序没有仅零选项?
杰里米·M

“ SDelete实现了美国国防部清除和消毒标准DOD 5220.22-M”(来自文档),它专门不是简单地将群集清零。sdelete -c会将可用空间归零(填充后),但是sdelete使用的方法与precompact不同,并且在很多情况下会导致比precompact更大的驱动器,后者旨在将虚拟驱动器归零
Jim B 2010年

了解另一种工具很有趣。谢谢
麻省理工学院2010年

2
SDelete可以将磁盘保留为0,但预压缩的工作速度更快,并且适用于这种情况。
克里斯·S

2
@romkyns不再重要,因为所有现代版本的Windows和Hyper-V支持trim(从Win7和Hyper-V 2012开始),在压缩之前都不需要为零。PreCompact实用程序仅将磁盘中已删除文件的部分归零,而从未使用过的部分则保持不变。使用类似的方法sdelete可以将动态磁盘填充为静态大小,然后可以将其压缩到仅实际使用的大小。
克里斯S

6

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个小时。


3

我也一直在寻找一种使用密码只写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

问候西蒙


1

如果使用的是VMware,更好的方法是使用VMware内置的工具回收虚拟驱动器上任何未使用的空间。

我使用它来将虚拟磁盘的大小从28 GB减小到13 GB。你的旅费可能会改变。

当我尝试使用sdelete -z c:,它实际上增加了虚拟驱动器的大小,以千兆字节的30,这是它的最大尺寸。

请访问VMware网站和压缩虚拟硬盘(位于)Using VMware Workstation > Configuring and Managing Devices > Configuring and Maintaining Virtual Hard Disks

更新资料

有时,GUI工具不如命令行工具可靠。我遇到了GUI工具失败的问题,但是命令行工具可以正常工作。以下是以下选项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.

这是缩小磁盘的示例。尽管来自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.

错误消息开头VizDiskLib是VMware Desktop 10的新增内容,可以安全地忽略。


1
sdelete本身并不意味着缩小vmdk的大小。它用于在收缩操作的预运算中将所有可用的可用空间都变为零。如果不这样做,则删除的文件和其他孤立数据仍将存在于磁盘上。VMWare工具并不总是能够回收那些文件仍然占用的磁盘空间。将这些“已删除的文件”设置为零将使您在运行收缩工具时可以完全收回磁盘空间。您看到虚拟磁盘上文件大小增加的原因是,sdelete用零填充了它具有的所有可用空间。
Leon Lucardie

感谢您澄清这一点。有种方法认为,可以通过更好的命名和/或对工具运行时的功能进行单行描述来受益于这些工具。
Contango


-1

米特

我发现Simon的Powershell脚本完全满足了您的需求,而没有sdelete的版本控制问题。(交换机在不同版本中执行不同的操作)

它有一个问题,就是密码一直在运行,但是我解决了这个问题。

我进一步修改了脚本以清理temp文件夹:

在两个地方都需要用驱动器号替换F:\。

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

-4

为什么第三方工具在Windows已经包含了您所需要的全部东西之后,就可以以“免费”的速度做到如此之快:

1)format X: /fs:XXXX /p:#X驱动器号在哪里;XXXX是文件系统,是并且#是通过次数;

2)DISKPART clean命令:http://technet.microsoft.com/library/cc766465.aspxhttp://support.microsoft.com/kb/300415 ;

顺便说一句,您也不需要一次通过-否则声明就是过时的信息,如过时的磁盘红色/写入策略,推销产品的人,偏执狂驱动或bs作为“专家建议”传递。

编辑:nvm,错过了自由空间部分...


1
在许多情况下,都有第三方工具可以做的更好或更好,更容易安装或更可靠。但这完全是旧版,问题不在于谁写。除此之外,微软收购了Sysinternals(谁写了SSDelete),因为它们比内置的东西好几年。只需将ProcessExplorer与MS产品“ TaskManager” -1进行比较即可开始火焰战争
Alojz Janez

您错过了问题中对“开源”的要求,对吗?
Alojz Janez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.