Windows Disklerini VMWare VMDK Dosyalarıyla Eşleştirin


Bir VMWare sanal makinesinin disk boyutunu genişletirken veya bir diski silerken, bazen hangi VMware sanal diskinin belirli Windows VM diskiyle eşleştiğini anlamak zordur. Birkaç disk varsa ve boyutlarına göre farklılık gösteriyorsa, ihtiyacınız olan diski bulmak kolaydır. Ancak, bir VM için aynı boyutta birkaç VMDK (veya RDM) diski veya birkaç sanal SCSI denetleyicisi oluşturulmuşsa ne yapılmalıdır? Hatalardan nasıl kaçınılır ve bir Windows yöneticisinin genişletmenizi (veya küçültmenizi) istediği diski nasıl seçersiniz?

Bu yazıda, bir VMWare VM'de Windows diskleri ile sanal disklerin (VMDK) nasıl eşleştirileceğini göreceğiz.

Windows ve VMWare'de SCSI Cihaz Numarası Nasıl Alınır?

Disk Yönetimi konsolunu açın (

diskmgmt.msc

) Windows'ta (bizim örneğimizde Windows Server 2016'dır). SCSI denetleyici adı ve SCSI aygıt numarası, disk listesinde görüntülenmez. SCSI cihaz numarasını almak için bir diski sağ tıklayın ve Özellikler'i seçin. Görüldüğü gibi General sekmesinin Location alanında VMWare Virtual disk SCSI Disk Device için cihaz portu ile ilgili bilgiler gösterilmektedir.

  • Konum 160=SCSI Veri Yolu Denetleyicisi 0

  • Hedef Kimliği 1 = cihaz SCSI kimliği 1'dir

Gördüğünüz verileri birleştirin ve SCSI disk adresini alın: SCSI(0:1).

Ardından, VMWare vSphere İstemcinizdeki sanal makine özelliklerini açın. Sahip olduğunuz ID ile aynı Virtual Device Node numarasına sahip diski bulun. Örneğimizde, SCSI(0:1) Sabit Disk 2'dir.

Bir sanal makinede farklı SCSI denetleyicilerine sahip birden çok sanal disk yapılandırılmışsa (bir sanal makineye her biri 16 disk içeren 4 adede kadar SCSI denetleyicisi ekleyebilirsiniz), SCSI aygıt numarasını manuel olarak bulmak oldukça zordur. Ayrıca, Windows ve VMWare'deki SCSI denetleyici numaralarının farklı olabileceğini lütfen unutmayın.

PowerShell Kullanarak Windows Diskini UUID/Seri Numarasına Göre VMDK ile Nasıl Eşleştirirsiniz?

VMWare sanal disklerini bir konuk VM içindeki disklerle eşlemenin başka bir yolu da benzersiz disk kimliklerini karşılaştırmaktır. VMWare'de bu özniteliğe UUID (Benzersiz Kimlik) ve Windows'ta Seri Numarası adı verilir. PowerShell kullanarak bir sanal diskin UUID ve SerialNumber değerlerinin nasıl alınacağını görelim.

Varsayılan olarak, tüm VMWare VM'lerinde disk bulunur

EnableUUID=TRUE

parametre etkinleştirildi. Bu, konuk işletim sisteminin sanal disk kimliklerini görmesi gerektiği anlamına gelir.

Windows'ta diskler hakkında bilgi almak için Depolama modülü cmdlet'lerini veya WMI sorgularını kullanabilirsiniz. Depolama modülüne sahip olmayan Windows Server 2008 R2 çalıştıran bazı VM'lerimiz olduğundan, WMI kullanacağız.

Windows'ta bir SCSI denetleyici numarası, üzerinde bir SCSI cihaz numarası, bir sanal diskin seri numarası (SerialNumber/UUID), bir disk boyutu ve disk numarası almak için bu PowerShell komutunu çalıştırın:

$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

Örneğimizde, Windows üç disk algıladı:

  • PHYSICALDRIVE0: SCSI Bağlantı Noktası 0, SCSI Hedef 0, Seri 6000c2939b157427dadbace321ed4973

  • PHYSICALDRIVE1: SCSI Bağlantı Noktası 0, SCSI Hedef 1, Seri 6000c2950ee961954909938642bb03b4

  • PHYSICALDRIVE1: SCSI Bağlantı Noktası 4, SCSI Hedef 10, Seri 6000c2995fc3c4928d6650596bb02cef

Ardından VMWare sanal makinesinin ayarlarında belirtilen disklerin SCSI controller numaralarını ve UUID'lerini almaya çalışalım. VM ayarlarını görüntülemek için PowerCLI konsolunu kullanın.

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
connect-viserver ber-vmware1 

$vmName="ber-man01"
$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 

Bu komut dosyası, vCenter (veya ESXi) sunucusuna bağlanacak ve belirtilen VM için disklerin listesini alacaktır. Sonuç, DataStore adını, VMDK dosya yolunu, disk numarasını, disk boyutunu ve UUID'yi içermelidir.

Ardından, konuk Windows işletim sisteminde gördüğünüz diskleri, UUID'lerine göre VMWare sanal diskleri ile manuel olarak eşleştirebilirsiniz.

VM'nin konuk işletim sisteminde yönetici izinleriniz varsa, daha uygun bir PowerShell betiği kullanarak Windows disklerini ve VMWare VMDK dosyalarını eşleştirebilirsiniz. Komut dosyası, konuk Windows işletim sistemini ağ üzerinden bağlar, yerel diskleri hakkında bilgi toplar ve bunları VMWare VMDK'lerle eşleştirir.

İşte PowerShell betiğinin tam kodu:

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
connect-viserver ber-vmware1
$vmName = "ber-man01"
$WinHostName = "ber-mansrv01.a-d.site"
#Get the list of disks of a VMWare virtual machine
$vmDisks = Get-VM -Name $vmName | Get-HardDisk 
$vmDatacenterView = Get-VM -Name $vmName | Get-Datacenter | Get-View 
$virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager 
# Enter the administrator credentials to access the guest Windows
$cred = if ($cred){$cred}else{Get-Credential}  
# Getting the list of Windows disks and partitions using 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
       }
    }
  }
}
 #Getting a disk serial number 
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 
  }  
}  
#Searching all VM disks and matching them with Windows disks by their 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

Komut dosyası ayrıca Windows'ta sürücü harfleri ve birim etiketleri hakkında bilgi verir.

Artık hangi Windows diskinin verilen sanal vmdk diskiyle eşleştiğini kolayca bulabilirsiniz.

Windows'ta sanal diskler bağlama noktaları aracılığıyla bağlanırsa, çıktıda atanmış sürücü harfleri ve birim etiketleri hakkında bilgi olmayacaktır.

İlgili makaleler