SCSI

При збільшенні розміру або видаленні диска в 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 пристрої, клацніть по диску і виберіть Properties. Як ви бачите, на вкладці General в полі Location вказано інформація про порт пристрою VMWare Virtual disk SCSI Disk Device.

  • Location 160 = SCSI Bus Controller 0
  • Target ID 1 = Номер SCSI ID пристрою 1

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

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

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

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

Інший спосіб зіставлення віртуальних дисків VMWare з дисками всередині гостьової ВМ - порівняти їх за унікальним ідентифікатором диска. З боку VMWare цей атрибут називається UUID (Unique ID), а в Windows - Serial Number. Розглянемо, як отримати значення 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 Port 0, SCSI Target 0, Serial 6000c2939b153417dedbdce371ed497b
  • PHYSICALDRIVE1: SCSI Port 0, SCSI Target 1, Serial 6000c2950ee961954909259642bb03bf
  • PHYSICALDRIVE1: SCSI Port 4, SCSI Target 10, Serial 6000c2995fc3c4728de8b0596bb02ce3

Тепер спробуємо отримати номери 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.

Тепер за отриманими 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.

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

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