При збільшенні розміру або видаленні диска в VMWare для віртуальних машин з Windows, іноді складно зрозуміти який VMware virtual disk відповідає певному диску в Windows ВМ. Якщо дисків не багато і всі вони відрізняються за розміром, знайти потрібний диск просто. Але що робити, якщо для ВМ створено кілька VMDK (або RDM) дисків однакового розміру, або для ВМ створено кілька віртуальних SCSI контролерів? Як не помилитися і вибрати саме той диск, який вимагає розширити (або зменшити) адміністратор Windows.

У цій статті ми розглянемо, як зіставити диски Windows з віртуальними дисками (VMDK) на ВМ VMWare.

  • Перевіряємо номер SCSI пристрої в Windows і VMWare
  • Як зіставити диски Windows з VMDK файлами по UUID / SerialNumber через PowerShell?

Перевіряємо номер SCSI пристрої в Windows і VMWare

Відкрийте консоль управління дисками Disk Manager (diskmgmt.msc) в Windows (в нашому прикладі це Windows Server 2016). У списку дисків без показу назви SCSI контролера і номер SCSI пристрої на ньому. Щоб визначити номер SCSI пристрої, клацніть по диску і виберіть Властивості. Як ви бачите, на вкладці Загальні в полі Розташування вказано інформація про порт пристрою Віртуальний диск VMWare SCSI Disk Device.

  • Розташування 160 = контролер шини SCSI 0
  • Ідентифікатор цілі 1 = Номер SCSI ID пристрою 1

Об’єднуємо отримані дані і отримуємо адресу диска SCSI (0: 1).

отримати дані про scsi диску в windows

Тепер відкрийте властивості віртуальної машини VMWare в vSphere Client. Знайдіть диск, у якого Virtual Device Node відповідає отриманому ID. У нашому прикладі це SCSI (0: 1) Жорсткий диск 2.

Якщо у віртуальній машині налаштоване безліч віртуальних дисків з різними SCSI контроллерами (ви можете додати в ВМ до 4 SCSI контролерів по 16 дисків в кожному), знайти номер SCSI пристрої вручну досить складно. Крім того, майте на увазі, що номери SCSI контролерів в Windows і VMWare можуть відрізнятися.

Як зіставити диски Windows з VMDK файлами по UUID / SerialNumber через PowerShell?

Інший спосіб зіставлення віртуальних дисків VMWare з дисками всередині гостьової ВМ – порівняти їх за унікальним ідентифікатором диска. З боку VMWare цей атрибут називається UUID (Унікальний ідентифікатор), а в Windows – Серійний номер. Розглянемо, як отримати значення UUID і SerialNumber віртуальних дисків через PowerShell.

За замовчуванням у всіх ВМ VMWare увімкнено disk.EnableUUID=TRUE, Це означає, що гостьова ОС повинна бачити ідентифікатори віртуальних дисків.

Для отримання інформації про диски в Windows ви можете використовувати командлети модуля Storage, або WMI запити. Оскільки в нашому випадку ще залишилися ВМ з Windows Server 2008 R2, в яких відсутня модуль Storage, ми будемо використовувати WMI.

Щоб отримати номер SCSI контролера, номер SCSI пристрої на ньому, серійний номер віртуального диска (SerialNumber / UUID), розмір і номер диска в Windows, виконан команду PowerShell:

$DiskInfo = foreach ($disk in Get-WmiObject Win32_DiskDrive) {
    [pscustomobject]@{
    "DeviceID"=$disk.DeviceID;
    "Caption"=$disk.Caption;
    "Capacity (GB)"=[math]::Round($disk.size / 1GB,0);  
    "SerialNumber" =$disk.SerialNumber
    "SCSIControllerNum"=$disk.scsiport;
    "SCSIDeviceNum"=$disk.scsitargetid;   
    }
}
$DiskInfo|ft

У нашому прикладі ми визначили, що Windows бачить три диска:

  • PHYSICALDRIVE0: SCSI-порт 0, SCSI-цільовий 0, серійний 6000c2939b153417dedbdce371ed497b
  • PHYSICALDRIVE1: Порт SCSI 0, Ціль SCSI 1, серійний 6000c2950ee961954909259642bb03bf
  • PHYSICALDRIVE1: Порт SCSI 4, SCSI Target 10, серійний 6000c2995fc3c4728de8b0596bb02ce3

Get-WmiObject Win32_DiskDrive - отримати serialnumber для дисків в Windows і SCSI Target

Тепер спробуємо отримати номери SCSI контролерів і UUID дисків, які вказані в настройках віртуальної машини VMware. Для отримання параметрів ВМ потрібно скористатися PowerCLI.

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
connect-viserver vcenter1 

$vmName="msk-sql1"
$vmHardDisks = Get-VM -Name $vmName | Get-HardDisk 
$vmDatacenterView = Get-VM -Name $vmName | Get-Datacenter | Get-View 
$virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager 

$vmresults = @()  
foreach ($vmHardDisk in $vmHardDisks)  
{  
  $string = $vmHardDisk.Filename
  $vmHardDiskUuid = ($vmHardDisk.ExtensionData.Backing.Uuid | ForEach-Object {$_.replace(' ','').replace('-','')})
  $vmresult = "" | Select-Object vmHardDiskDatastore,vmHardDiskVmdk,vmHardDiskName,vmHardDiskSize,vmHardDiskUuid
  $vmresult.vmHardDiskDatastore = $vmHardDisk.filename.split(']')[0].split('[')[1]  
  $vmresult.vmHardDiskVmdk = $vmHardDisk.filename.split(']')[1].trim()  
  $vmresult.vmHardDiskName = $vmHardDisk.Name
  $vmresult.vmHardDiskSize = $vmHardDisk.CapacityGB
  $vmresult.vmHardDiskUuid = $vmHardDiskUuid    
  $vmresults += $vmresult  
}
$vmresults | ft 

Даний скрипт підключиться до сервера vCenter (або ESXi) і для зазначеної ВМ отримає список дисків. Після виконання скрипта ви отримаєте список віртуальних дисків для ВМ. Результат повинен містити ім’я DataStore, шлях до vmdk файлу, номера диска, його розмір і UUID.

PowerCLI отримати UUID для дисків віртуальної машини

Тепер за отриманими UUID ви можете вручну зіставити диски, які видно в гостьовій Windows з віртуальними дисками VMWare.

Якщо у вас є права адміністратора в віртуальній машині, для якої потрібно зіставити диски Windows і vmdk файли в VMWare, можна скористатися більш простим у використанні PowerShell скриптом. Скрипт звертається до гостьової Windows по мережі, збирає інформацію про локальних дисках і показує відповідність з дисками VMWare.

Повний код PowerShell скрипта:

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
connect-viserver vcenter1 
$vmName = "msk-sql1"
$WinHostName = "msk-sqlclu1.winitpro.ru"
#Получить список дисков виртуальной машины VMWare 
$vmDisks = Get-VM -Name $vmName | Get-HardDisk 
$vmDatacenterView = Get-VM -Name $vmName | Get-Datacenter | Get-View 
$virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager 
# Учетная запись и пароль администартора для доступа к гостевой ОС 
$cred = if ($cred){$cred}else{Get-Credential}  
# Получить список дисков и разделов Windows через WMI
$winDisk  = Get-WmiObject -Class Win32_DiskDrive -ComputerName $WinHostName -Credential $cred
$diskToDriveVolume = Get-WmiObject Win32_DiskDrive -ComputerName $WinHostName -Credential $cred| % {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions -ComputerName $WinHostName -Credential $cred| % {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives  -ComputerName $WinHostName -Credential $cred| % {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DriveLetter = $_.DeviceID
        VolumeName  = $_.VolumeName
       }
    }
  }
}
 #получить серийный номер диска 
foreach ($disk in $winDisk)  
{  
  $disk | Add-Member -MemberType NoteProperty -Name AltSerialNumber -Value $null 
  $diskSerialNumber = $disk.SerialNumber  
  if ($disk.Model -notmatch 'VMware Virtual disk SCSI Disk Device')  
  {  
    if ($diskSerialNumber -match '^S{12}$'){$diskSerialNumber = ($diskSerialNumber | foreach {[byte[]]$bytes = $_.ToCharArray(); $bytes | foreach {$_.ToString('x2')} }  ) -join ''}  
    $disk.AltSerialNumber = $diskSerialNumber 
  }  
}  
#Перебор всех дисков ВМ, сопоставление с дисками Windows по SerialNumber / UUID 
$diskMaps = @()  
foreach ($vmDisk in $vmDisks)  
{  
  $vmDiskUuid = $virtualDiskManager.queryvirtualdiskuuid($vmDisk.Filename, $vmDatacenterView.MoRef) | foreach {$_.replace(' ','').replace('-','')}  
  $windowsDisk = $winDisk | where {$_.SerialNumber -eq $vmDiskUuid}  
  if (-not $windowsDisk){$windowsDisk = $winDisk | where {$_.AltSerialNumber -eq $vmDisk.ScsiCanonicalName.substring(12,24)}}  
  $curDiskMap = "" | select  vmDiskDatastore, vmDiskVmdk, vmDiskName, windowsDiskIndex,  vmDiskUuid, windowsDeviceID, drives, volumes  
  $curDiskMap.vmDiskDatastore = $vmDisk.filename.split(']')[0].split('[')[1]  
  $curDiskMap.vmDiskVmdk = $vmDisk.filename.split(']')[1].trim()  
  $curDiskMap.vmDiskName = $vmDisk.Name  
  $curDiskMap.windowsDiskIndex = if ($windowsDisk){$windowsDisk.Index}else{"FAILED TO MATCH"}  
  $curDiskMap.vmDiskUuid = $vmDiskUuid  
  $curDiskMap.windowsDeviceID = if ($windowsDisk){$windowsDisk.DeviceID}else{"FAILED TO MATCH"}  
  $driveVolumes = $diskToDriveVolume | where {$_.Disk -eq $windowsDisk.DeviceID}
  $curDiskMap.drives = $driveVolumes.DriveLetter
  $curDiskMap.volumes = $driveVolumes.VolumeName
  $diskMaps += $curDiskMap
}  
$diskMaps = $diskMaps | sort {[int]$_.vmDiskName.split(' ')[2]}  
$diskMaps | ft

Додатково повертається інформацію про буквах дисках і мітках томів Windows.

powershell скрипт для зіставлення VMDK дисків VMWare і дисків у віртуальній машині Windows

Тепер ви можете без проблем розібратися якого віртуального диску відповідає диск в Windows.

Якщо віртуальні диски в Windows підключені через точку монтування (mount point), у висновку буде містить інформацію про призначену букві диска і мітці томи.

Leave a Reply

Your email address will not be published. Required fields are marked *