Haga coincidir los discos de Windows con los archivos VMWare VMDK
Al expandir el tamaño del disco de una máquina virtual de VMWare o al eliminar un disco, a veces es difícil entender qué disco virtual de VMware coincide con el disco específico de la VM de Windows. Si hay pocos discos y se diferencian por su tamaño, es fácil encontrar el disco que necesita. Pero, ¿qué hacer si se han creado varios discos VMDK (o RDM) del mismo tamaño o varios controladores SCSI virtuales para una VM? ¿Cómo evitar errores y seleccionar el disco que un administrador de Windows le pide que expanda (o reduzca)?
En este artículo, veremos cómo hacer coincidir los discos de Windows y los discos virtuales (VMDK) en una VM de VMWare.
¿Cómo obtener el número de dispositivo SCSI en Windows y VMWare?
Abra la consola de administración de discos (
diskmgmt.msc) en Windows (en nuestro ejemplo, es Windows Server 2016). El nombre del controlador SCSI y el número de dispositivo SCSI no se muestran en la lista de discos. Para obtener el número de dispositivo SCSI, haga clic con el botón derecho en un disco y seleccione Propiedades. Como puede ver, la información sobre el puerto del dispositivo para el dispositivo de disco SCSI del disco virtual de VMWare se muestra en el campo Ubicación de la pestaña General.
Ubicación 160=controlador de bus SCSI 0
-
ID de destino 1 = ID de SCSI del dispositivo es 1
Una los datos que ve y obtenga la dirección del disco SCSI: SCSI(0:1).
Luego abra las propiedades de la máquina virtual en su VMWare vSphere Client. Busque el disco que tiene el mismo número de nodo de dispositivo virtual que el ID que tiene. En nuestro ejemplo, es SCSI(0:1) Disco duro 2.
Si se configuran varios discos virtuales con diferentes controladores SCSI en una máquina virtual (puede agregar hasta 4 controladores SCSI con 16 discos cada uno a una máquina virtual), es bastante difícil encontrar un número de dispositivo SCSI manualmente. También tenga en cuenta que los números de controlador SCSI en Windows y VMWare pueden diferir.
¿Cómo hacer coincidir el disco de Windows con VMDK por UUID/número de serie usando PowerShell?
Otra forma de asignar discos virtuales de VMWare a discos dentro de una VM invitada es comparar sus ID de disco únicos. En VMWare, este atributo se llama UUID (Identificación única) y en Windows, un Número de serie. Veamos cómo obtener UUID y SerialNumber de un disco virtual usando PowerShell.
De forma predeterminada, todas las máquinas virtuales de VMWare tienen el disco
EnableUUID=TRUEparámetro habilitado. Significa que un sistema operativo invitado debe ver los ID de discos virtuales.
Para obtener la información sobre los discos en Windows, puede usar los cmdlets del módulo de almacenamiento o las consultas WMI. Dado que todavía tenemos algunas máquinas virtuales que ejecutan Windows Server 2008 R2 que no tienen el módulo de almacenamiento, usaremos WMI.
Para obtener un número de controlador SCSI, un número de dispositivo SCSI, un número de serie de un disco virtual (SerialNumber/UUID), un tamaño de disco y un número de disco en Windows, ejecute este comando de 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
En nuestro ejemplo, Windows ha detectado tres discos:
PHYSICALDRIVE0: puerto SCSI 0, destino SCSI 0, serie 6000c2939b157427dadbace321ed4973
PHYSICALDRIVE1: puerto SCSI 0, destino SCSI 1, serie 6000c2950ee961954909938642bb03b4
PHYSICALDRIVE1: puerto SCSI 4, destino SCSI 10, serie 6000c2995fc3c4928d6650596bb02cef
Luego, intentemos obtener los números de controlador SCSI y los UUID de los discos especificados en la configuración de la máquina virtual VMWare. Para ver la configuración de la máquina virtual, use la consola PowerCLI.
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
Este script se conectará al servidor vCenter (o ESXi) y obtendrá la lista de discos para la máquina virtual especificada. El resultado debe contener el nombre del almacén de datos, la ruta del archivo VMDK, el número de disco, el tamaño del disco y el UUID.
Luego, puede hacer coincidir manualmente los discos que ve en el SO invitado de Windows con los discos virtuales de VMWare por sus UUID.
Si tiene permisos de administrador en el sistema operativo invitado de la VM, puede hacer coincidir los discos de Windows y los archivos VMWare VMDK utilizando un script de PowerShell más conveniente. El script conecta el sistema operativo invitado de Windows a través de la red, recopila la información sobre sus discos locales y los compara con los VMDK de VMWare.
Aquí está el código completo del script de PowerShell:
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
El script también devuelve información sobre las letras de unidad y las etiquetas de volumen en Windows.
Ahora puede encontrar fácilmente qué disco de Windows coincide con el disco virtual vmdk dado.
Si los discos virtuales en Windows están conectados a través de puntos de montaje, no habrá información sobre las letras de unidad asignadas y las etiquetas de volumen en la salida.




