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).
그런 다음 VMWare vSphere Client에서 가상 머신 속성을 엽니다. 가지고 있는 ID와 동일한 가상 장치 노드 번호를 가진 디스크를 찾습니다. 이 예에서는 SCSI(0:1)입니다. 하드 디스크 2.
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
그런 다음 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 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의 드라이브 문자 및 볼륨 레이블에 대한 정보도 반환합니다.
이제 주어진 가상 vmdk 디스크와 일치하는 Windows 디스크를 쉽게 찾을 수 있습니다.
Windows의 가상 디스크가 탑재 지점을 통해 연결된 경우 할당된 드라이브 문자 및 볼륨 레이블에 대한 정보가 출력에 표시되지 않습니다.