Computer >> 컴퓨터 >  >> 체계 >> Windows Server

Windows 디스크와 VMWare VMDK 파일 일치

VMWare 가상 머신의 디스크 크기를 확장하거나 디스크를 삭제할 때 특정 Windows VM 디스크와 일치하는 VMware 가상 디스크를 이해하기 어려운 경우가 있습니다. 디스크가 적고 크기가 다르면 필요한 디스크를 쉽게 찾을 수 있습니다. 그러나 동일한 크기의 여러 VMDK(또는 RDM) 디스크 또는 여러 가상 SCSI 컨트롤러가 VM에 대해 생성된 경우에는 어떻게 해야 합니까? 오류를 피하고 디스크를 선택하는 방법 Windows 관리자가 확장(또는 축소)을 요청합니까?

이 기사에서는 VMWare VM에서 Windows 디스크와 가상 디스크(VMDK)를 일치시키는 방법을 알아봅니다.

Windows 및 VMWare에서 SCSI 장치 번호를 얻는 방법

디스크 관리 콘솔(diskmgmt.msc ) Windows(이 예에서는 Windows Server 2016). SCSI 컨트롤러 이름과 SCSI 장치 번호는 디스크 목록에 표시되지 않습니다. SCSI 장치 번호를 얻으려면 디스크를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다. . 보시다시피 VMWare 가상 디스크 SCSI 디스크 장치의 장치 포트에 대한 정보는 위치에 표시됩니다. 일반 필드 탭.

  • 위치 160 =SCSI 버스 컨트롤러 0
  • 대상 ID 1 =장치 SCSI ID는 1

보이는 데이터를 결합하고 SCSI 디스크 주소를 얻습니다:SCSI(0:1).

Windows 디스크와 VMWare VMDK 파일 일치

그런 다음 VMWare vSphere Client에서 가상 머신 속성을 엽니다. 가지고 있는 ID와 동일한 가상 장치 노드 번호를 가진 디스크를 찾습니다. 이 예에서는 SCSI(0:1)입니다. 하드 디스크 2.

Windows 디스크와 VMWare VMDK 파일 일치

SCSI 컨트롤러가 서로 다른 여러 가상 디스크가 가상 머신에 구성된 경우(가상 머신에 각각 16개의 디스크가 있는 최대 4개의 SCSI 컨트롤러를 추가할 수 있음) SCSI 장치 번호를 수동으로 찾는 것은 매우 어렵습니다. 또한 Windows와 VMWare의 SCSI 컨트롤러 번호는 다를 수 있습니다.

PowerShell을 사용하여 UUID/일련 번호로 Windows 디스크를 VMDK와 일치시키는 방법은 무엇입니까?

VMWare 가상 디스크를 게스트 VM 내부의 디스크에 매핑하는 또 다른 방법은 고유한 디스크 ID를 비교하는 것입니다. VMWare에서는 이 속성을 UUID라고 합니다. (고유 ID) 및 Windows – 일련 번호 . PowerShell을 사용하여 가상 디스크의 UUID와 SerialNumber를 얻는 방법을 알아보겠습니다.

기본적으로 모든 VMWare VM에는 EnableUUID=TRUE 디스크가 있습니다. 매개변수가 활성화되었습니다. 이는 게스트 OS가 가상 디스크 ID를 확인해야 함을 의미합니다.

Windows에서 디스크에 대한 정보를 얻으려면 저장소 모듈 cmdlet 또는 WMI 쿼리를 사용할 수 있습니다. 스토리지 모듈이 없는 Windows Server 2008 R2를 실행하는 일부 VM이 여전히 있으므로 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, 직렬 6000c2939b157427dadbace321ed4973
  • PHYSICALDRIVE1:SCSI 포트 0, SCSI 대상 1, 직렬 6000c2950ee961954909938642bb03b4
  • PHYSICALDRIVE1:SCSI 포트 4, SCSI 대상 10, 직렬 6000c2995fc3c4928d6650596bb02cef

Windows 디스크와 VMWare VMDK 파일 일치

그런 다음 VMWare 가상 머신의 설정에 지정된 디스크의 SCSI 컨트롤러 번호와 UUID를 가져오도록 합시다. VM 설정을 보려면 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 

이 스크립트는 vCenter(또는 ESXi) 서버에 연결하고 지정된 VM에 대한 디스크 목록을 가져옵니다. 결과에는 DataStore 이름, VMDK 파일 경로, 디스크 번호, 디스크 크기 및 UUID가 포함되어야 합니다.

Windows 디스크와 VMWare VMDK 파일 일치

그런 다음 게스트 Windows OS에 표시되는 디스크를 UUID로 VMWare 가상 디스크와 수동으로 일치시킬 수 있습니다.

VM의 게스트 OS에서 관리자 권한이 있는 경우 보다 편리한 PowerShell 스크립트를 사용하여 Windows 디스크와 VMWare VMDK 파일을 일치시킬 수 있습니다. 스크립트는 네트워크를 통해 게스트 Windows OS를 연결하고 로컬 디스크에 대한 정보를 수집하여 VMWare VMDK와 일치시킵니다.

PowerShell 스크립트의 전체 코드는 다음과 같습니다.

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
connect-viserver ber-vmware1
$vmName = "ber-man01"
$WinHostName = "ber-mansrv01.woshub.com"
#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

스크립트는 Windows의 드라이브 문자 및 볼륨 레이블에 대한 정보도 반환합니다.

Windows 디스크와 VMWare VMDK 파일 일치

이제 주어진 가상 vmdk 디스크와 일치하는 Windows 디스크를 쉽게 찾을 수 있습니다.

Windows의 가상 디스크가 탑재 지점을 통해 연결된 경우 할당된 드라이브 문자 및 볼륨 레이블에 대한 정보가 출력에 표시되지 않습니다.