У меня стало заканчиваться место на диске, и я первым делом проверил размеры VHDX-файлов своих виртуальных машин, где используются динамически расширяемые диски. На самой ненужной ВМ с экспериментальной Windows 10 размер файла составлял 51GB, что примерно соответствовало занятому пространству в гостевой ОС.
👉 Пошаговые инструкции по устранению препятствий к сжатию системного раздела
Я выполнил в ВМ очистку диска, удалив 25GB Windows.old и прочего мусора, что сократило занятое пространство до 22GB. Затем я выключил ВМ, в ее настройках перешел к редактированию диска и выбрал сжатие.
Но по завершении операции размер файла сократился всего на 3GB.
Тогда я отключил в гостевой ОС файл подкачки, перезагрузился, выполнил в командной строке
defrag c: /u /v
и повторил сжатие. На сей раз оно достигло результата, уменьшив размер VHDX до ожидаемых 23GB.
На хосте можно применять такой же подход, отключив наряду с подкачкой еще и гибернацию, когда не получается толком сжать (shrink) раздел в оснастке управления дисками или diskpart.
Зачастую ОС позволяет сжать лишь около половины раздела, а то и меньше, потому что не может подвинуть системные файлы. Описанный выше метод занимает не так много времени, и лучше начать с него, чем быстро накосячить сторонним (и никогда не подводившим) инструментом, а потом всю ночь метаться в поисках решения :)
В этом контексте остается вопрос дефрагментации физического SSD. Казалось бы, он изъезжен в блоге вдоль и поперек. Ан нет! Но об этом в следующий раз ;)
В комментариях напишите, сталкивались ли вы с тем, что невозможно сжать раздел средствами ОС до нужного размера, как решали задачу, случались ли косяки.
Для тех, кто не осилил пять абзацев, добавлю шестой :)
Проблема: невозможно сжать раздел с ОС (уменьшить его размер) до желаемого значения в оснастке управления дисками. Это не про сжатие NTFS или ZIP.
Решение
- Отключите:
- гибернацию (
powercfg /h off
) - файл подкачки
- защиту системы (и включите обратно)
- Перезагрузитесь.
- В командной строке от имени администратора выполните
defrag c: /u /v
Upd. По разным каналам читатели советуют такие варианты решения задачи для виртуальных дисков Hyper-V и VirtualBox. Впрочем, два первых для Hyper-V могут споткнуться о системные файлы, которые нельзя переместить (для чего я и задействовал дефраг).
- Командлет PowerShell Move-VM с параметром -IncludeStorage (Денис Дягилев)
- Утилита sdelete с ключом -z (Дмитрий Кирушев)
- Руководство по сжатию виртуальных дисков в VirtualBox на англ. (Александр Белоглинцев)
Какой тип диска вы используете для экспериментальных ВМ?
- Динамически расширяемый (59%, голосов: 177)
- Не пользуюсь ВМ / Другое (17%, голосов: 52)
- Фиксированный, и поменьше (15%, голосов: 46)
- Фиксированный, и побольше (6%, голосов: 18)
- Не знаю (2%, голосов: 5)
Проголосовало: 298 [архив опросов]

Именно так всегда и сжимал вхд. Удаление мусора, удаление файла подкачки, дефрагментация, (это можно сделать и на хосте, смонтировав диск), затем сжатие в консоли
Что-то арифметика не сходится :-\
Что не сходится-то?
Дано: в госте занято 50; размер VHDX — 51.
Cleanmgr, Compact: 22; 48 (51-3)
ФП, дефраг: 22; 23
Однако за время пути.
Собака могла подрасти!
И это тоже (ОС логов написала или скачала обновлений), но отключённый ФП должен компенсировать такой рост.
В VirtualBox порядок сжатия примерно такой
https://www.howtogeek.com/312883/how-to-shrink-a-virtualbox-virtual-machine-and-free-up-disk-space/
Сжимать разделы не приходилось, как и расширять. Оснастку управления дисками использую только для инициализации, первоначальной разбивки(создание раздела) и форматирования диска.
Все операции с дисковыми накопителями провожу только в DOS средствами загрузочного диска ADD. Никаких проблем, в том числе с системным разделом(диском) не возникало.
P.S. Дефрагментации SSD- быть!
Насчёт «в DOS» — это вряд ли. А так, для управления разделами для Windows лучше использовать системные средства, нежели что-то стороннее, например, на Linux.
Загрузочный диск ADD на Linux или WinPE и создается. Возможно, что чистого DOS и нет.
ADD — линуксовая рабочая среда. Если мы конечно говорим о версии ADD, пригодной для работы с разделами современных ОС.
Хотя лично я для операций переразметки без сноса данных MiniTool PartitionWizard использую (только то, что нельзя сделать средствами ОС — точнее почти всё, например, подвинуть системный раздел и перед ним создать раздел SWAP на HDD, или перетащить живую систему с MBR-загрузки в едином NTFS-разделе на UEFI загрузку с несколькими разделами в GPT). Просто потому что оно быстрое, стабильное, и все нужные функции есть в бесплатной версии. И да, пока ни разу не подводило, спасибо бесперебойнику, + даже когда кажется что повисло и нет прогресса — лучше пойти сделать чаю и что-то сожрать, чем необдуманные действия и прерывание процесса.
Можно было не устраивать танцев с бубном (выключение/дефрагментация), а запустить в гостевой машине sdelete от sysinternals. Выбрав опцию «затереть нулями неиспользуемое место». После этого сжатие отработало бы точно так же эффективно.
https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete
Да, мне в твиттере указали на sdelete, но есть несколько моментов:
1. Утилита не входит в состав ОС, в отличие от средств в статье.
2. Для меня неочевидно, что она подвинет файл подкачки, сидящий посредине тома.
3. Скорость решения задачи методом из статьи против sdelete. Она быстро работает? В конце не задумывается?
4. Универсальность подхода. На физическом диске тоже sdelete применяете, если надо сжать том?
1. Утилита входит в комплект Windows Sysinternals.
2. Не подвинет, она заполнит нулями все свободное пространство на диске.
3. Не помню, давно не пользовался. Использую TRIM для автоматического освобождения места.
4. Бесполезно, утилита написана специально для виртуальных машин, см пункт 2.
Спасибо. Вот к чему я и подводил — в заметке минимумом букв описан универсальный способ для физических и виртуальных дисков на основе встроенных инструментов. Я бы не сказал, что это — пляски с бубном.
Но да, я потом добавлю предложения из комментариев.
У вас под одним словом «сжатие» описаны два разных процесса:
1. Укорачивание файлов виртуальной машины.
2. Уменьшение размера раздела.
Я что-то не видел утилит, которые умеют выполнять их оба.
Утилит, может, и нет, но подход с отключением системных файлов и дефрагом решает обе задачи.
Хм, vhdx оказывается не может уменьшиться, если есть большие куски незанятого пространства между файлами. Тогда да, удаление page-файла действительно поможет.
В похожей ситуации использовал defrag /x
Кстати, да. Я, честно говоря, забыл про этот ключ. Могло быть быстрее. Но в стандартную операцию дефрага консолидация свободного пространства и так входит, из отчета defrag c: /u /v
Добавил в заметку три варианта от читателей для виртуальных дисков (два из комментариев, один был доставлен в Telegram).
Недавно DISM’ом раздел физического диска «сжимал» :) Задача была клонировать систему на клиентской машине с крайне тупого 250-гигового жесткого диска на 120-гиговый SSD. Системный раздел, естественно, на весь диск… При том, что занято процентов 20. И, конечно же, Винда записала системные файлы куда-то в конец. Отключать подкачки и т.п. поленился. Дай, думаю, сделаю /Capture-Image с теневой копии, и разверну на SSD. Получилось, и даже без простоя пользователя. В принципе, нечто подобное можно провернуть и с виртуалкой.
Так WIM — файловый формат, его удобно применять для миграции на меньший диск.
А встроенный бэкап не позволит такой финт, надо заранее сжимать исходный раздел, чтобы он стал меньше целевого во избежание отлупа при восстановлении. Собственно, вторая часть заметки про это :)
По поводу пункта 3, в VirtualBox можно включить сжатие виртуального носителя с помощью TRIM, добавив параметры discard и nonrotational: https://superuser.com/questions/646559/virtualbox-and-ssds-trim-command-support