Как обнулить свободное место виртуального диска в Windows для лучшего сжатия?
Я хотел бы для этого простой инструмент с открытым исходным кодом (или, по крайней мере, бесплатный). Вероятно, он должен написать как можно больший файл, полный 0
и потом сотрите его. Только один проход (это не из соображений безопасности, а для сжатия, мы делаем резервные копии виртуальных машин).
Должен запускаться изнутри окна, а не с диска.
В 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: Как отметил Скоттбб в своем ответе ниже, в сентябре 2011 года в инструмент были внесены изменения (версия 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: Теперь есть проблема динамически выделяемое виртуальное дисковое пространство. Если у вас есть диск на 100 ГБ, который не заполнен и использует только 30 ГБ на хосте, нулевое заполнение не должен резко увеличивать размер диска, потому что это противоречит цели динамического размещения. Есть ответ на Oracle VM VirtualBox
https://superuser.com/q/907196/44402 - но в других стеках, таких как VMWare, Xen, XenServer и т. д., на этот вопрос нужно ответить отдельно.
В Windows используйте инструмент sysinternals удалить обнулить все пустое пространство. Требуемая команда будет выглядеть так sdelete -z c:
.
Usage: sdelete [-p passes] [-s] [-q] ... sdelete [-p passes] [-z|-c] [drive letter] ... -a Remove Read-Only attribute. -c Clean free space. -p passes Specifies number of overwrite passes (default is 1). -q Don't print errors (Quiet). -s or -r Recurse subdirectories. -z Zero free space (good for virtual disk optimization).
Для Linux я предлагаю вам использовать нулевой.
В Windows уже есть встроенный инструмент командной строки, который делает это: CIPHER. См. Его параметр / W.
Итак, полная команда будет такой: шифр / w: c: (заменить c: с фактической буквой диска)
(он записывает нули в неиспользуемое пространство, затем 0xff, поэтому вы должны наблюдать за ним и останавливать его с помощью ctrl-c, когда он начинает писать 0xff - не идеально, но это бесплатно и уже доступно в Windows, по крайней мере, с XP)
fsutil
не является открытым исходным кодом, но поставляется с Windows и поэтому не требует дополнительных затрат. Я использовал его для обнуления свободного места на пустом диске WD 250 ГБ 7200 об / мин (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
На запись 250 ГБ нулей ушло около 4 часов.
SDelete не обнуляет пространство для сжатия виртуального диска. SDelete начинает с обнуления свободного места, но затем заполняет его 0xff, а затем случайными байтами. См. Как подготовить файл виртуального жесткого диска Virtual Server 2005 для отправки в службу поддержки продуктов Microsoft О том, как настроить VHD для уплотнения
Precompact.exe может быть трудно найти по какой-то причине. Я нашел отдельную загружаемую копию Вот. Однако, если у вас есть виртуальный компьютер с Windows, вы также можете получить его из% programfiles (x86)% \ Windows Virtual PC \ Integration Components \ Precompact.iso
Я тоже искал способ использовать 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
С уважением, Саймон
Если вы используете VMware, гораздо лучше использовать встроенные в VMware инструменты, чтобы освободить неиспользуемое пространство на виртуальном диске.
Я использовал это, чтобы уменьшить размер виртуального диска с 28 гигабайт до 13 гигабайт. Ваш пробег может отличаться.
Когда я пытался использовать sdelete -z c:
, это на самом деле вырос размер виртуальных дисков до 30 гигабайт, что было его максимальным размером.
См. Веб-сайт VMware и Сжать виртуальный жесткий диск, который находится под Using VMware Workstation > Configuring and Managing Devices > Configuring and Maintaining Virtual Hard Disks
.
Иногда инструменты графического интерфейса не так надежны, как инструменты командной строки. Я столкнулся с проблемами, когда инструменты с графическим интерфейсом не работают, но инструменты командной строки работают нормально. Вот варианты для 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.
Вот пример сжатия диска. Эта командная строка работала, несмотря на сбой той же команды из графического интерфейса:
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, и на него можно спокойно не обращать внимания.
Google-вверх Eraser 5.8.8 32-бит Прекрасно работает даже на Windows XP SP3!
Мит,
Я обнаружил, что сценарий PowerShell Саймона делает именно то, что вам нужно, без проблем с версией sdelete. (переключатели делают разные вещи в разных версиях)
У него была одна проблема, этот шифр продолжал работать, но я исправил это.
Далее я изменил сценарий, чтобы очистить временную папку:
Вам нужно будет заменить 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
Зачем нужны сторонние инструменты, когда Windows уже включает в себя все, что вам когда-либо понадобится, «бесплатно» и настолько быстро, насколько это возможно:
1) format X: /fs:XXXX /p:#
, где X
буква диска; XXXX
это файловая система, Yeither и #
количество проходов;
2) diskpart clean
команда: http://technet.microsoft.com/library/cc766465.aspx, http://support.microsoft.com/kb/300415;
Между прочим, вам не нужно больше одного прохода - в противном случае заявлением является либо устаревшая информация об устаревших стратегиях записи / перезаписи диска, о людях, продвигающих продукты, вызванных паранойей, либо о bs, переданных как «советы экспертов».
Изменить: nvm, пропустил свободное место часть...