Том в дисковом пространстве заполнился, а данные продолжают прибывать. В обычном мире это означало бы мучительный переезд на больший диск, но в дисковых пространствах том растёт прямо на месте, не прерывая работу и не трогая существующие файлы. Однако расширение здесь не так прямолинейно, как кажется: за привычной буквой диска стоит многослойная конструкция, и увеличить надо не один объект, а целую цепочку, причём в правильном порядке. Тот, кто пытается расширить только видимый раздел, упирается в тупик, потому что под ним не выросли нижние слои. Понимание всей цепочки и верной последовательности её расширения превращает наращивание тома из загадки в простую процедуру из нескольких команд, доступную встроенными средствами Windows.

Том дискового пространства - это вершина пирамиды слоёв. В основании лежат физические диски, объединённые в пул, из пула нарезан виртуальный диск, на виртуальном диске создан раздел, а раздел несёт файловую систему с привычной буквой. Чтобы том вырос, должно хватить места на каждом нижнем слое, и расширять их надо снизу вверх: сначала пул, потом виртуальный диск, потом раздел. Задача - пройти эту цепочку в верном порядке, убедившись на каждом шаге, что нижележащий слой готов отдать пространство верхнему.

Проверка свободного места в пуле перед расширением

Расширение начинается с проверки, есть ли вообще куда расти. Том может вырасти лишь за счёт свободного места в пуле, и если его нет, сначала добавляют диск. Просмотр свободной ёмкости пула делается командой оболочки PowerShell:

Get-StoragePool -FriendlyName "ПулДанных" | Select FriendlyName, Size, AllocatedSize, @{N="СвободноГБ";E={($_.Size - $_.AllocatedSize)/1GB}}

Команда показывает общий размер пула, занятую часть и вычисленный свободный остаток в гигабайтах. Если свободного места достаточно для желаемого прироста тома, можно расширять. Если же пул почти полон, сперва добавляют новый диск, увеличивая общий запас. Добавление диска в пул делается обычной командой добавления физического диска, после чего свободная ёмкость пула вырастает на размер нового накопителя. Эта проверка - обязательный первый шаг, потому что расширение тома без свободного места в пуле просто невозможно, и попытка завершится отказом. Сначала убеждаются, что пул готов отдать пространство, и только потом приступают к расширению верхних слоёв.

Расширение виртуального диска за счёт пула

Когда в пуле есть свободное место, расширяют виртуальный диск, увеличивая его размер за счёт пула. Это второй слой пирамиды, и без его роста раздел наверху расти не сможет. Увеличение виртуального диска до нового размера делается командой:

Resize-VirtualDisk -FriendlyName "Том1" -Size 500GB

Команда увеличивает виртуальный диск до указанного размера, забирая нужное пространство из свободной ёмкости пула. Новый размер задают с учётом запаса пула: нельзя запросить больше, чем пул способен выделить с учётом выбранной защиты. Для зеркала, например, каждый гигабайт полезного объёма требует двух гигабайтов сырого места в пуле, и это учитывают при расчёте. После увеличения виртуальный диск стал больше, но раздел на нём пока прежнего размера, и добавленное пространство ещё не используется. Проверить новый размер виртуального диска помогает его просмотр, где видна возросшая ёмкость. Этот слой - промежуточный, и его рост сам по себе не даёт видимого результата, но он необходим как опора для расширения раздела наверху.

Расширение раздела файловой системы на новое пространство

Завершающий шаг - расширить сам раздел с файловой системой, чтобы он занял выросший виртуальный диск. Только после этого добавленное место становится доступным пользователю. Сначала узнают максимальный размер, до которого можно расширить раздел, потом расширяют его. Определение предельного размера раздела делается командой:

$макс = (Get-PartitionSupportedSize -DriveLetter D).SizeMax

Команда узнаёт, до какого размера можно расширить раздел на указанной букве, исходя из выросшего виртуального диска. Затем раздел расширяют до этого предела:

Resize-Partition -DriveLetter D -Size $макс

Команда увеличивает раздел до максимально доступного размера, и теперь добавленное пространство видно на диске. После этого в проводнике том показывает возросший объём, и на него можно записывать новые данные. Файловая система при этом не пересоздаётся, существующие файлы остаются нетронутыми, добавляется лишь свободное место в конце раздела. Это и есть финал цепочки: пространство, добавленное в пул, прошло через виртуальный диск и наконец проявилось как свободное место на видимом томе. Соблюдение порядка тут обязательно: раздел не расширить, пока не вырос виртуальный диск под ним.

Расширение многоуровневого тома по отдельным уровням

Если том многоуровневый, состоящий из быстрого и ёмкого уровней, его расширение имеет особенность: растить надо каждый уровень отдельно, а не виртуальный диск целиком. Сначала узнают имена уровней тома, потом расширяют нужный. Просмотр уровней виртуального диска делается командой:

Get-VirtualDisk -FriendlyName "ГибридныйТом" | Get-StorageTier | Select FriendlyName, Size

Команда показывает уровни тома с их размерами. Каждый уровень расширяют своей командой изменения размера уровня:

Get-StorageTier -FriendlyName "ЁмкийУровень" | Resize-StorageTier -Size 2TB

Команда увеличивает указанный уровень до нового размера за счёт дисков соответствующего типа в пуле. Важно понимать, что расширить уровень можно только за счёт свободного места на дисках его типа: ёмкий уровень растёт на механических дисках, быстрый на твердотельных. Если в пуле кончились диски нужного типа, сначала добавляют именно такой накопитель. После расширения уровней раздел файлового тома расширяют тем же способом, что и для обычного тома. Эта особенность многоуровневых томов часто застаёт врасплох тех, кто привык расширять обычный виртуальный диск одной командой, ведь здесь приходится работать с каждым уровнем по отдельности, помня про соответствие типов дисков. Удобно при этом расширять не обязательно оба уровня сразу: если кончается только ёмкое пространство под холодные данные, растят лишь ёмкий уровень, добавив механических дисков, а быстрый оставляют как есть. И наоборот, когда горячих данных стало больше, наращивают только быстрый уровень твердотельными дисками. Такая раздельность даёт точное управление: дорогую быструю ёмкость добавляют лишь тогда, когда её действительно не хватает, а дешёвую ёмкую наращивают щедро, не переплачивая за скорость там, где она не нужна.

Расширение тонко выделенного тома и контроль реального места

Если виртуальный диск создавался с тонким выделением, его расширение имеет приятную особенность: заявленный размер можно увеличить, даже когда физического места в пуле пока не хватает, ведь тонкий том занимает ровно столько, сколько реально записано. Это позволяет заранее задать тому большой потолок, а диски докупать лишь по мере фактического заполнения. Просмотр реального и заявленного размера тонкого тома делается командой:

Get-VirtualDisk -FriendlyName "Том1" | Select FriendlyName, Size, @{N="ЗанятоГБ";E={$_.FootprintOnPool/1GB}}

Команда показывает заявленный размер тома и реально занятое им место в пуле. У тонкого тома эти цифры заметно расходятся: заявить можно много, а занято лишь записанное. Расширение заявленного размера тонкого тома делается той же командой изменения размера, что и для обычного, но без немедленного расхода пула. Однако за тонким томом нужен особый присмотр: реальное заполнение растёт незаметно, и когда оно подбирается к физическому пределу пула, запись внезапно остановится, хотя том формально далёк от своего заявленного потолка. Поэтому при тонком выделении следят именно за фактическим заполнением пула, а не за номинальным размером томов. Этот контроль и есть плата за гибкость тонкого выделения: оно даёт свободу заранее задать большие тома, но требует бдительности, чтобы реальное место не кончилось внезапно посреди работы.

Автоматизация расширения по достижении порога заполнения

Ручное слежение за заполнением утомительно и забывчиво, поэтому расширение разумно автоматизировать. Скрипт проверяет заполнение тома и при достижении заданного порога сам выполняет цепочку расширения или хотя бы предупреждает о необходимости вмешательства. Проверка заполнения тома с тревогой при нехватке места выглядит так:

$том = Get-Volume -DriveLetter D
$процентСвободно = ($том.SizeRemaining / $том.Size) * 100
if ($процентСвободно -lt 10) {
    $метка = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$метка ВНИМАНИЕ: на томе D осталось меньше 10 процентов места" | Out-File C:\kontrol-mesta.txt -Append
}

Скрипт вычисляет долю свободного места на томе и при падении ниже десяти процентов записывает предупреждение с отметкой времени. Запущенный по расписанию, он сам следит за заполнением и сигнализирует заранее, давая время спокойно расширить том, а не в авральном режиме, когда место уже кончилось. Более продвинутый вариант скрипта при срабатывании порога сам добавляет свободный диск в пул и проходит всю цепочку расширения автоматически, превращая наращивание тома в самообслуживающийся процесс. Такая автоматика снимает с человека рутину слежения и почти исключает ситуацию, когда работа встаёт из-за внезапно кончившегося места, ведь система предупреждает или расширяется заранее, по достижении порога, а не по факту полного заполнения.

Решение типичных препятствий и итоги

Иногда расширение не идёт, и важно знать частые причины. Если команда расширения раздела отказывает, чаще всего дело в том, что справа от раздела на виртуальном диске нет свободного пространства, потому что виртуальный диск не был расширен на предыдущем шаге. Возврат к расширению виртуального диска решает проблему. Если не расширяется виртуальный диск, значит, в пуле не хватает свободного места, и нужно добавить диск. Файловые системы тоже накладывают ограничения: расширять на месте умеют не все, и для некоторых старых форматов наращивание раздела недоступно. Проверка типа файловой системы тома помогает понять, поддерживает ли она расширение вообще.

Стоит помнить и о пределах самого раздела в зависимости от его схемы. Старая схема разметки ограничивает раздел потолком в два терабайта, и расширить его дальше не выйдет, как бы ни рос виртуальный диск под ним. Для томов больше этого предела используют современную схему разметки, не знающую такого ограничения. Если расширение упирается в этот потолок при наличии свободного места и на пуле, и на виртуальном диске, причина именно в устаревшей схеме раздела. Проверить схему разметки диска помогает его просмотр с соответствующим полем, и при обнаружении старой схемы том придётся пересоздавать на современной, потому что сменить схему на месте без потери данных нельзя. Поэтому тома, которым предстоит расти за пределы двух терабайт, изначально создают на современной схеме разметки, закладывая возможность роста с самого начала.

Расширение тома дискового пространства подчиняется строгой логике слоёв, и в этом весь секрет. Пирамида растёт снизу вверх: сначала свободное место в пуле, при нужде пополненное новым диском, потом увеличение виртуального диска за счёт пула, наконец расширение раздела на выросший виртуальный диск. Многоуровневые тома добавляют шаг расширения каждого уровня по отдельности с учётом типа дисков. Существующие данные при этом остаются в полной сохранности на всех этапах, потому что расширение лишь добавляет свободное место, ничего не перезаписывая. Освоив эту последовательность, администратор наращивает тома по мере роста данных спокойно и предсказуемо, не боясь упереться в тупик и не рискуя файлами. Главное - помнить про порядок слоёв и не пытаться расширить верхний раздел, не вырастив сперва нижние уровни под ним, потому что именно нарушение этого порядка и есть причина большинства затруднений, с которыми сталкиваются при расширении впервые.