Как обнулить свободное место на виртуальном диске в 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 из 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 и т. Д., На этот вопрос нужно отвечать отдельно.

мит
источник
2
sdeleteэто правильный инструмент для работы, но изменение инструмента в сентябре 2011 года (версия 1.6) делает приведенные выше ответы неверными. Параметры -cи -zизменили значения. Правильное использование сейчасsdelete -z c:\
scottbb
Также убедитесь, что вы используете образы в стиле COW (Копировать при записи), если у вас много машин, основанных на одной базовой установке.
Мэтт

Ответы:

46

В 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 .

Zoredache
источник
Пришел сюда, чтобы сжать мои VHD. Совместное использование некоторых связанных ссылок с TechNet. Technet.microsoft.com/en-us/library/cc708394%28v=ws.10%29.aspx technet.microsoft.com/en-us/library/cc708317(v=ws.10 ) .aspx
Faiz
Интересно, если бы заполнение нулями оказало какое-либо положительное влияние на стандартный зашифрованный диск Linux LUKS dm-crypt . прежде чем я подвергну всю машину загрузке с загрузочного клона clonezilla и физическому резервному копированию всего диска. - Приведет ли обнуленный раздел в шифровании к обнуленному разделу на внешнем диске? Или он все еще будет писать (нераспределенный) шум по соображениям безопасности? Или я должен обнулить монтированный (не смотря на зашифрованное содержимое) криптовый диск? (И разве это хорошая идея, т. Е. Заслуживает ли доверия таблица распределения в контексте зашифрованного диска?)
Фрэнк Нок
Я был бы шокирован, если бы он делал что-то кроме шифрования нулей и записи зашифрованного «шума» на диск.
Дэн
15

В Windows уже есть встроенный инструмент командной строки, который делает это: CIPHER. Смотрите его / W вариант.

Таким образом, полная команда будет: cipher / w: c: (замените c: на фактическую букву диска)

(он записывает нули в неиспользуемое пространство, затем 0xff, так что вы должны смотреть его и останавливать его с помощью ctrl-c, когда он начинает писать 0xff - не идеально, но это бесплатно и уже доступно в Windows начиная с XP по крайней мере)

Давид Балажич
источник
3
интересный подход. Прервите выполнение незадолго до того, как оно начнет удалять все нули. +1 за креативное решение с использованием уже существующих инструментов!
PsychoData
Интересно, можно ли определить, когда он закончил писать нули, а затем сделать его прерванным ...
Фредерик Норд,
Если вы используете жесткий диск SSD, убедитесь, что у вас включен TRIM. Тогда все неиспользованные блоки будут быстро уничтожены с помощью шаблона 0xFF прошивкой жесткого диска. Это очень удобно для образов виртуальных дисков, созданных виртуальными серверами. Эти изображения будут заполнены как пробелы и освободят блоки файловой системы на файловой системе хостинга.
Зник
Это работало очень хорошо и намного быстрее, чем SDelete -z (который застрял на 100% без каких-либо других отзывов).
psychowood
6

SDelete не обнуляет пространство для сжатия виртуального диска. SDelete начинает с обнуления свободного места, но затем заполняет его 0xff, а затем случайными байтами. См. Подготовка файла виртуального жесткого диска Virtual Server 2005 для отправки в Службу поддержки продуктов Microsoft. Инструкции по настройке виртуального жесткого диска для сжатия.

Precompact.exe может быть трудно найти по некоторым причинам. Я нашел отдельную загружаемую копию здесь . Однако, если у вас есть Windows Virtual PC, вы также можете получить его из% programfiles (x86)% \ Windows Virtual PC \ Integration Components \ Precompact.iso

Джим Б
источник
2
sdelete с опцией -c является нулевой заливкой. Возможно, вы думаете о встроенной утилите шифрования Windows, которая не имеет опции только для нуля?
Джереми М
«SDelete внедряет стандарт очистки и дезинфекции Министерства обороны США DOD 5220.22-M» (из документации), который специально не просто обнуляет кластер. sdelete -c обнуляет свободное пространство (после его заполнения), однако метод, который использует sdelete, отличается от предкомпактного и во многих случаях приводит к увеличению размера диска, чем предкомпактный, который был разработан для обнуления виртуальных дисков
Jim B
Это интересно узнать о другом инструменте. Спасибо
Мит
2
SDelete может оставить диск с нулями, но precompact работает намного быстрее и предназначен для такой ситуации.
Крис С
2
@romkyns Это больше не имеет значения, так как все современные версии Windows и Hyper-V поддерживают trim(начиная с Win7 и Hyper-V 2012), нет необходимости обнулять перед сжатием. Утилита PreCompact обнуляла только части диска удаленными файлами, часть, которая никогда не использовалась, осталась нетронутой. При использовании чего-то подобного sdeleteдинамический диск заполняется до статического размера, который затем можно сжать обратно до фактически используемого размера.
Крис С,
6

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 часов.

Джеймс Л.
источник
3

Я тоже искал способ использования 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

С уважением Саймон

Саймон Стивенсон
источник
1

Если вы используете 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 и может быть безопасно проигнорировано.

Контанго
источник
1
Сам sdelete не предназначен для уменьшения размера vmdk. Он используется для превращения всего доступного свободного пространства в нули перед подготовкой к операции сжатия. Если вы этого не сделаете, удаленные файлы и другие потерянные данные все равно будут присутствовать на диске. Инструменты VMWare не всегда смогут восстановить место на диске, все еще занимаемое этими файлами. Превращение этих «удаленных файлов» в нули делает дисковое пространство полностью восстанавливаемым при запуске инструмента сжатия. Причина, по которой вы увидели увеличение размера файла на виртуальном диске, заключается в том, что sdelete заполняет все доступное пространство нулями.
Леон Лукарди
Спасибо за разъяснение этого. Мне кажется, что инструменты могут выиграть от лучшего именования и / или описания в одну строку того, что инструмент делает, когда вы его запускаете.
контанго
-1

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
Престон Ширмейер
источник
-4

Почему сторонние инструменты, когда Windows уже включает в себя все, что вам когда-либо понадобится, бесплатно и настолько быстро, насколько это возможно:

1) format X: /fs:XXXX /p:#где Xнаходится буква диска; XXXXявляется файловой системой, Yeither и #является числом проходов;

2) cleanкоманда diskpart : http://technet.microsoft.com/library/cc766465.aspx , http://support.microsoft.com/kb/300415 ;

Кстати, вам не нужно больше одного прохода, в противном случае утверждение является либо устаревшей информацией об устаревших стратегиях перерисовки / записи диска, людях, продвигающих продукты, приводимых в действие паранойей, либо bs, переданных как «совет специалиста».

Редактировать: nvm, пропустил часть свободного пространства ...

user180961
источник
1
Во многих случаях доступны сторонние инструменты, которые выполняют хорошую или лучшую работу, их легче устанавливать или они более надежны. Но это совершенно ОТ, вопрос был не в том, кто это пишет. Помимо этого Microsoft приобрела Sysinternals (который написал SSDelete), потому что они были на несколько лет лучше, чем встроенные вещи. Просто сравните ProcessExplorer с продуктом MS "TaskManager" -1 для запуска пламенной войны
Alojz Janez
Вы пропустили требование "open source" в вопросе, не так ли?
Алойз Янез