Hyper-V. Часть 3: Настраиваем виртуальные диски
Все части серии «Hyper-V»В первой части диск машины появился сам: New-VM -NewVHDPath … -NewVHDSizeBytes 80GB создал динамический VHDX и подключил его к машине. Здесь разберём, какими бывают виртуальные диски, как менять их размер, возвращать место на томе и конвертировать между форматами, как подключать и отключать диски у работающей машины и когда вместо файла дают физический диск.
VHD и VHDX
Виртуальный диск Hyper-V — обычный файл в одном из двух форматов. VHD — старый формат, ограничен 2040 ГБ. VHDX вмещает до 64 ТБ (лимиты Hyper-V), ведёт журнал изменений своих метаданных, поэтому переживает отключение питания посреди записи, и умеет логические сектора по 4 КБ — формат описан в спецификации MS-VHDX. VHD сегодня нужен только для обмена с системами, которые VHDX не понимают; все новые диски — VHDX.
По способу выделения места диски бывают трёх типов (New-VHD):
- Фиксированный (
-Fixed) — файл сразу занимает весь объявленный размер. Нет накладных расходов на рост, место гарантировано. - Динамический (
-Dynamic, тип по умолчанию) — файл растёт блоками по мере записи. Экономит место, но позволяет «продать» том больше, чем на нём есть: если все динамические диски вырастут одновременно, том кончится, и Hyper-V поставит на паузу машины, которым некуда писать. - Разностный (
-Differencing) — пустой диск-«дочка» над родительским (-ParentPath): чтение идёт из родителя, все изменения пишутся в дочерний файл. Так устроены контрольные точки, и так удобно поднимать много одинаковых машин из одного подготовленного образа. Родитель после этого менять нельзя — все дочерние диски сломаются.
New-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\app1-os.vhdx' -SizeBytes 80GB -Dynamic
New-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\sql1-data.vhdx' -SizeBytes 200GB -Fixed
New-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\test1.vhdx' -Differencing `
-ParentPath 'D:\Hyper-V\Templates\ws2025-core.vhdx'
Суффиксы GB и TB — встроенные множители PowerShell, 80GB равно 85 899 345 920 байт.
Что показывает Get-VHD
Get-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\app1-os.vhdx' |
Select-Object VhdFormat, VhdType, FileSize, Size, MinimumSize, LogicalSectorSize,
ParentPath, Attached, FragmentationPercentage
FileSize — сколько файл занимает на томе, Size — сколько видит гость. У фиксированного диска они почти равны, у динамического первое растёт вслед за записью, но не уменьшается, когда гость удаляет файлы. MinimumSize — граница последнего раздела внутри: меньше неё диск не уменьшить. ParentPath заполнен у разностных дисков, Attached показывает, открыт ли файл сейчас машиной или хостом.
Размер
Увеличить диск можно и VHD, и VHDX; уменьшить — только VHDX и не меньше его MinimumSize. Диск на SCSI-контроллере меняет размер на работающей машине, диск на IDE (только у машин первого поколения) — лишь при выключенной (Resize-VHD).
Увеличение — две команды: файл растёт на хосте, раздел — в госте, как в части про диски серии о Windows Server. Команду в госте удобно выполнить с хоста через PowerShell Direct — канал по VMBus, которому не нужна сеть гостя; подробно он разобран в части об управлении с рабочей станции, здесь достаточно учётных данных администратора гостя:
$cred = Get-Credential 'app1\Administrator'
$disk = 'D:\Hyper-V\Virtual Hard Disks\app1-data.vhdx'
Resize-VHD -Path $disk -SizeBytes 300GB
Invoke-Command -VMName app1 -Credential $cred {
Update-HostStorageCache
Resize-Partition -DriveLetter E -Size (Get-PartitionSupportedSize -DriveLetter E).SizeMax
}
Уменьшение — в обратном порядке: сначала раздел в госте (Resize-Partition до меньшего размера), потом файл. -ToMinimumSize срезает всё после последнего раздела:
Invoke-Command -VMName app1 -Credential $cred { Resize-Partition -DriveLetter E -Size 150GB }
Resize-VHD -Path $disk -ToMinimumSize
Сжатие, конвертация, слияние
Динамический диск не отдаёт место, освобождённое гостем. Вернуть его помогает сжатие (Optimize-VHD): диск при этом должен быть не подключён или подключён к хосту только для чтения.
Mount-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\app1-os.vhdx' -ReadOnly
Optimize-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\app1-os.vhdx' -Mode Full
Dismount-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\app1-os.vhdx'
Конвертация между форматами и типами (Convert-VHD) создаёт новый файл и работает только с неподключённым диском (Convert-VHD). Так старый VHD превращают в VHDX или динамический диск — в фиксированный:
Convert-VHD -Path 'D:\old\legacy.vhd' -DestinationPath 'D:\Hyper-V\Virtual Hard Disks\legacy.vhdx' -VHDType Dynamic
Слияние разностного диска с родителем — Merge-VHD -Path child.avhdx -DestinationPath parent.vhdx (Merge-VHD). Вручную это нужно редко: обычно цепочки сливает сам Hyper-V при удалении контрольной точки, а осиротевшие цепочки разберём в части о контрольных точках.
Диск на хосте
Mount-VHD подключает файл к самому хосту как обычный диск — дальше работают командлеты модуля Storage. Так готовят диск с данными до того, как отдать его машине, или достают файлы из диска выключенной машины (Mount-VHD):
New-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\share.vhdx' -SizeBytes 50GB -Dynamic |
Mount-VHD -Passthru |
Initialize-Disk -PartitionStyle GPT -PassThru |
New-Partition -UseMaximumSize -AssignDriveLetter |
Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Share' -Confirm:$false
Dismount-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\share.vhdx'
Подключённый к хосту диск нельзя одновременно подключить к запущенной машине — файл открывает кто-то один.
Диски машины
Диски подключаются к контроллерам машины. У машины второго поколения только SCSI-контроллеры — до четырёх по 64 устройства (лимиты), и диски на них подключаются и отключаются на работающей машине. У машины первого поколения загрузочный диск обязан быть на IDE, а на IDE ничего на ходу не меняется.
Посмотреть, что подключено и куда:
Get-VMHardDiskDrive -VMName app1 | Format-Table ControllerType, ControllerNumber, ControllerLocation, Path
Get-VMScsiController -VMName app1
Добавить новый диск с данными — создать файл, подключить его к SCSI-контроллеру и разметить внутри гостя (Add-VMHardDiskDrive):
$disk = 'D:\Hyper-V\Virtual Hard Disks\app1-data.vhdx'
New-VHD -Path $disk -SizeBytes 200GB -Dynamic
Add-VMHardDiskDrive -VMName app1 -ControllerType SCSI -Path $disk
Invoke-Command -VMName app1 -Credential $cred {
Get-Disk | Where-Object PartitionStyle -eq 'RAW' |
Initialize-Disk -PartitionStyle GPT -PassThru |
New-Partition -UseMaximumSize -DriveLetter E |
Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
}
Без -ControllerNumber и -ControllerLocation диск встаёт в первый свободный слот. Подключить готовый диск — та же команда с путём к существующему файлу.
Добавить SCSI-контроллер — когда дисков больше 64 или их хочется разнести по контроллерам; добавляются контроллеры только на выключенной машине (Add-VMScsiController):
Stop-VM -Name app1
Add-VMScsiController -VMName app1
Start-VM -Name app1
Отключить диск. Remove-VMHardDiskDrive отсоединяет диск от машины, а файл остаётся на месте — удалять его нужно отдельно, когда вы уверены, что он не нужен (Remove-VMHardDiskDrive). Перед отключением на ходу диск в госте стоит перевести в offline, иначе для гостя это выглядит как выдернутый диск:
Invoke-Command -VMName app1 -Credential $cred { Get-Partition -DriveLetter E | Get-Disk | Set-Disk -IsOffline $true }
Get-VMHardDiskDrive -VMName app1 -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 1 | Remove-VMHardDiskDrive
Перенести диск на другой контроллер или слот — Set-VMHardDiskDrive с параметрами -ToControllerType, -ToControllerNumber, -ToControllerLocation (Set-VMHardDiskDrive).
Ограничить диск по IOPS, чтобы одна машина не забирала весь том у соседей. Hyper-V считает «нормализованные» операции: объём ввода-вывода в секунду, делённый на 8 КБ (Set-VMHardDiskDrive):
Get-VMHardDiskDrive -VMName app1 | Set-VMHardDiskDrive -MaximumIOPS 2000
Get-VMHardDiskDrive -VMName app1 | Format-Table Path, MinimumIOPS, MaximumIOPS
Физический диск напрямую
Pass-through: диск хоста переводят в offline, и машина получает его целиком, без файла VHDX (Add-VMHardDiskDrive). Так подключают LUN или диск с данными, которые нельзя переносить в файл; цена — у такого диска нет контрольных точек и переноса хранилища.
Get-Disk | Format-Table Number, FriendlyName, Size, OperationalStatus
Set-Disk -Number 3 -IsOffline $true
Add-VMHardDiskDrive -VMName app1 -ControllerType SCSI -DiskNumber 3
DVD
Вставить и извлечь ISO — Set-VMDvdDrive с путём к образу или с $null (Set-VMDvdDrive):
Set-VMDvdDrive -VMName app1 -Path 'D:\ISO\tools.iso'
Set-VMDvdDrive -VMName app1 -Path $null
Get-VM | Get-VMDvdDrive | Where-Object Path | Format-Table VMName, Path
Последняя команда находит машины с забытыми ISO. Образ с локального диска хоста мешает живой миграции: на другом хосте такого пути нет. Поэтому после установки образы извлекают.
Общий диск для гостевого кластера
Когда кластер собирают не из хостов, а из виртуальных машин (например, два SQL Server в режиме FCI), им нужен общий диск. Для этого есть формат VHD Set (.vhds): один и тот же файл подключается к нескольким машинам на кластерном хранилище (создание VHD Set):
New-VHD -Path 'C:\ClusterStorage\Volume1\sqlclu\shared.vhds' -SizeBytes 100GB -Dynamic
Add-VMHardDiskDrive -VMName sql1 -ControllerType SCSI -Path 'C:\ClusterStorage\Volume1\sqlclu\shared.vhds' -SupportPersistentReservations
Add-VMHardDiskDrive -VMName sql2 -ControllerType SCSI -Path 'C:\ClusterStorage\Volume1\sqlclu\shared.vhds' -SupportPersistentReservations
Путь C:\ClusterStorage — это общий том кластера Hyper-V, о нём в части о кластере.
Смотрим руками
Все диски всех машин с реальным и объявленным размером и цепочками контрольных точек — сразу видно и забытые .avhdx, и тонкие диски, которые могут переполнить том:
Get-VM | Get-VMHardDiskDrive | Where-Object Path | ForEach-Object {
$d = Get-VHD -Path $_.Path
[pscustomobject]@{
VM = $_.VMName
Path = $_.Path
Type = $d.VhdType
FileGB = [math]::Round($d.FileSize/1GB, 1)
SizeGB = [math]::Round($d.Size/1GB, 1)
Parent = $d.ParentPath
}
} | Format-Table -AutoSize
Сколько места обещано динамическими дисками на каждом томе — сравнить с его свободным местом:
Get-VM | Get-VMHardDiskDrive | Where-Object Path | Get-VHD |
Group-Object { Split-Path -Qualifier $_.Path } |
ForEach-Object {
$vol = Get-Volume -DriveLetter $_.Name.TrimEnd(':')
[pscustomobject]@{
Volume = $_.Name
FreeGB = [math]::Round($vol.SizeRemaining/1GB)
GrowthGB = [math]::Round((($_.Group | Measure-Object -Property Size -Sum).Sum -
($_.Group | Measure-Object -Property FileSize -Sum).Sum)/1GB)
}
}
Если GrowthGB больше FreeGB, том перепродан: при одновременном росте дисков машины встанут на паузу. Where-Object Path отбрасывает pass-through диски — у них нет файла.
Источники
- Plan for Hyper-V scalability — размеры VHD и VHDX, число SCSI-контроллеров и дисков;
- MS-VHDX: Virtual Hard Disk v2 File Format — формат VHDX;
- New-VHD и Resize-VHD — типы дисков, изменение размера и его условия;
- Optimize-VHD, Convert-VHD и Merge-VHD — сжатие, конвертация, слияние;
- Mount-VHD — подключение диска к хосту;
- Add-VMHardDiskDrive, Set-VMHardDiskDrive, Remove-VMHardDiskDrive и Add-VMScsiController — диски и контроллеры машины, IOPS, pass-through;
- Set-VMDvdDrive — образы ISO;
- Create Hyper-V VHD Set files — общий диск для гостевого кластера.
Диск машины — файл VHDX, который можно растить на ходу, сжимать, конвертировать и подключать к хосту; машина видит его через SCSI-контроллер, а при необходимости получает физический диск целиком.
Дальше — часть 4: настраиваем сеть виртуальных машин. Три типа виртуальных коммутаторов, VLAN и частные VLAN в Hyper-V, объединение карт SET, сетевые адаптеры машин — добавление на ходу, имена, MAC-адреса, защита от чужих DHCP и ограничение полосы.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.