Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

Windows 디스크와 VMware VMDK 파일 매칭하는 방법

VMware 가상 머신의 디스크 크기를 확장하거나 디스크를 삭제할 때, 특정 Windows VM 디스크가 어떤 VMware 가상 디스크(VMDK)와 일치하는지 파악하기 어려운 경우가 종종 있습니다. 디스크 수가 적고 용량이 서로 다르다면 원하는 디스크를 쉽게 찾을 수 있지만, 동일한 크기의 VMDK(또는 RDM) 디스크가 여러 개 있거나 가상 SCSI 컨트롤러가 여러 개 구성되어 있다면 이야기가 달라집니다. Windows 관리자가 확장(또는 축소)해 달라고 요청한 디스크를 실수 없이 정확하게 선택하려면 어떻게 해야 할까요?

이 글에서는 VMware 가상 머신에서 Windows 디스크와 가상 디스크(VMDK)를 매칭하는 두 가지 방법을 자세히 살펴보겠습니다.

Windows와 VMware에서 SCSI 장치 번호 확인 방법

Windows(본 예시에서는 Windows Server 2016 사용)에서 디스크 관리 콘솔(diskmgmt.msc)을 실행합니다. 디스크 목록에는 SCSI 컨트롤러 이름과 SCSI 장치 번호가 표시되지 않습니다. SCSI 장치 번호를 확인하려면 해당 디스크를 마우스 오른쪽 버튼으로 클릭하고 속성(Properties)을 선택합니다. 일반 탭의 위치(Location) 필드에서 'VMware Virtual disk SCSI Disk Device'의 장치 포트 정보를 확인할 수 있습니다.

  • Location 160 = SCSI 버스 컨트롤러 0
  • Target ID 1 = SCSI 장치 ID 1

이 정보를 조합하면 SCSI 디스크 주소 SCSI(0:1)를 얻을 수 있습니다.

Windows 디스크와 VMware VMDK 파일 매칭하는 방법

그다음 VMware vSphere Client에서 가상 머신 속성을 열어, 앞서 확인한 ID와 동일한 Virtual Device Node 번호를 가진 디스크를 찾습니다. 이 예제에서는 SCSI(0:1)이 Hard Disk 2에 해당합니다.

Windows 디스크와 VMware VMDK 파일 매칭하는 방법

가상 머신에 서로 다른 SCSI 컨트롤러를 사용하는 여러 가상 디스크가 구성된 경우(가상 머신 하나에 최대 4개의 SCSI 컨트롤러를 추가할 수 있으며, 각 컨트롤러에 16개의 디스크를 연결할 수 있음), SCSI 장치 번호를 수동으로 찾는 것은 상당히 번거로운 작업입니다. 또한 Windows와 VMware 간에 SCSI 컨트롤러 번호가 서로 다르게 표시될 수 있다는 점도 유의해야 합니다.

PowerShell로 UUID/일련번호를 이용해 Windows 디스크와 VMDK 매칭하기

VMware 가상 디스크를 게스트 VM 내부의 디스크와 매핑하는 또 다른 방법은 고유한 디스크 ID를 비교하는 것입니다. VMware에서는 이 속성을 UUID(Unique ID)라고 부르며, Windows에서는 일련번호(Serial Number)라고 합니다. PowerShell을 사용해 가상 디스크의 UUID와 SerialNumber를 조회하는 방법을 알아보겠습니다.

기본적으로 모든 VMware VM에는 디스크의 EnableUUID=TRUE 매개변수가 활성화되어 있어, 게스트 OS가 가상 디스크 ID를 인식할 수 있습니다.

Windows에서 디스크 정보를 조회하려면 Storage 모듈 cmdlet 또는 WMI 쿼리를 사용할 수 있습니다. Storage 모듈이 없는 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 Port 0, SCSI Target 0, Serial 6000c2939b157427dadbace321ed4973
  • PHYSICALDRIVE1: SCSI Port 0, SCSI Target 1, Serial 6000c2950ee961954909938642bb03b4
  • PHYSICALDRIVE2: SCSI Port 4, SCSI Target 10, Serial 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에서 보이는 디스크와 VMware 가상 디스크를 UUID 기준으로 수동으로 매칭할 수 있습니다.

만약 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 디스크가 해당 가상 VMDK 디스크와 일치하는지 훨씬 쉽게 식별할 수 있습니다.

Windows 디스크와 VMware VMDK 파일 매칭하는 방법

참고로, Windows에서 가상 디스크가 드라이브 문자가 아닌 마운트 지점(mount point)으로 연결된 경우에는 출력 결과에 드라이브 문자 및 볼륨 레이블 정보가 표시되지 않습니다.