Как обнулить свободное место на виртуальном диске в Windows для лучшего сжатия?
Как обнулить свободное место на виртуальном диске в 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 из 2-го вызова, и это было довольно быстро (синтаксис действителен только для более старых версий до V1.6):
c:\>sdelete -c c: (OUTDATED!)
У меня сложилось впечатление, что это делает то, что я хочу. Инструмент sdelete прост в использовании и легко получить.
Редактировать 2: Как scottbb указал в своем ответе ниже, в сентябре 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 и т. д., на этот вопрос нужно отвечать отдельно.
9 ответов
В Windows используйте инструмент sysinternals sdelete, чтобы обнулить все пустое пространство. Команда, которую вы хотите, выглядела бы так sdelete -z c:
,
Использование: sdelete [-p pass] [-s] [-q] ... sdelete [-p pass] [-z|-c] [буква диска]... -a Удалить атрибут только для чтения. -c Чистое свободное пространство. -p pass Указывает количество проходов перезаписи (по умолчанию 1). -q Не печатать ошибки (Тихо). -s или -r Рекурсировать подкаталоги. -z Ноль свободного места (хорошо для оптимизации виртуального диска).
Для Linux я предлагаю вам использовать zerofree.
В Windows уже есть встроенный инструмент командной строки, который делает это: CIPHER. Смотрите его /W вариант.
Таким образом, полная команда будет: cipher / 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. Инструкции по настройке виртуального жесткого диска для сжатия.
Precompact.exe может быть трудно найти по некоторым причинам. Я нашел отдельную загружаемую копию здесь. Однако, если у вас есть Windows Virtual PC, вы также можете получить его из%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
,
Обновить
Иногда инструменты с графическим интерфейсом не так надежны, как инструменты командной строки. Я столкнулся с проблемами, когда инструменты 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.
Вот пример сжатия диска. Эта командная строка работала, несмотря на неудачную команду из графического интерфейса:
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-up Eraser 5.8.8 32-bit Работает хорошо даже на Windows XP SP3!
Mit,
Я обнаружил, что сценарий 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
это файловая система #
количество проходов;
2) дисковая часть clean
команда: http://technet.microsoft.com/library/cc766465.aspx, http://support.microsoft.com/kb/300415;
Между прочим, вам не нужно больше одного прохода - в противном случае утверждение является либо устаревшей информацией об устаревших стратегиях перезаписи / записи на диск, о людях, продвигающих продукты, о паранойе, либо о бс, переданных как "совет специалиста".
Редактировать: nvm, пропустил часть свободного пространства...