เมื่อขยายขนาดดิสก์ของเครื่องเสมือน VMWare หรือลบดิสก์ บางครั้งก็ยากที่จะเข้าใจว่าดิสก์เสมือน VMware ใดที่ตรงกับดิสก์ Windows VM ที่ระบุ หากมีดิสก์น้อยและแตกต่างกันตามขนาด การค้นหาดิสก์ที่คุณต้องการทำได้ง่าย แต่จะทำอย่างไรถ้ามีการสร้างดิสก์ VMDK (หรือ RDM) หลายตัวที่มีขนาดเท่ากันหรือตัวควบคุม SCSI เสมือนหลายตัวสำหรับ VM จะหลีกเลี่ยงข้อผิดพลาดและเลือกดิสก์ที่ผู้ดูแลระบบ Windows ขอให้คุณขยาย (หรือย่อ) ได้อย่างไร
ในบทความนี้ เราจะมาดูวิธีจับคู่ดิสก์ Windows และดิสก์เสมือน (VMDK) บน VMWare VM
จะรับหมายเลขอุปกรณ์ SCSI ใน Windows และ VMWare ได้อย่างไร
เปิดคอนโซลการจัดการดิสก์ (diskmgmt.msc
) ใน Windows (ในตัวอย่างของเราคือ Windows Server 2016) ชื่อคอนโทรลเลอร์ SCSI และหมายเลขอุปกรณ์ SCSI จะไม่แสดงในรายการดิสก์ ในการรับหมายเลขอุปกรณ์ SCSI ให้คลิกขวาที่ดิสก์และเลือก คุณสมบัติ . ดังที่คุณเห็น ข้อมูลเกี่ยวกับพอร์ตอุปกรณ์สำหรับ VMWare Virtual disk SCSI Disk Device จะแสดงใน ตำแหน่ง ฟิลด์ของ ทั่วไป แท็บ
- ตำแหน่ง 160 =SCSI Bus Controller 0
- รหัสเป้าหมาย 1 =อุปกรณ์ SCSI ID คือ 1
เข้าร่วมข้อมูลที่คุณเห็นและรับที่อยู่ดิสก์ SCSI:SCSI(0:1)
จากนั้นเปิดคุณสมบัติของเครื่องเสมือนในไคลเอ็นต์ VMWare vSphere ของคุณ ค้นหาดิสก์ที่มีหมายเลข Virtual Device Node เดียวกันกับ ID ที่คุณมี ในตัวอย่างของเราคือ SCSI(0:1) ฮาร์ดดิสก์ 2.
หากมีการกำหนดค่าดิสก์เสมือนหลายตัวที่มีตัวควบคุม SCSI ต่างกันบนเครื่องเสมือน (คุณสามารถเพิ่มคอนโทรลเลอร์ SCSI ได้สูงสุด 4 ตัวพร้อมดิสก์ 16 ตัวต่อเครื่องเสมือน) การค้นหาหมายเลขอุปกรณ์ SCSI ด้วยตนเองนั้นค่อนข้างท้าทาย นอกจากนี้ โปรดทราบว่าหมายเลขคอนโทรลเลอร์ SCSI ใน Windows และ VMWare อาจแตกต่างกัน
จะจับคู่ดิสก์ Windows กับ VMDK โดย UUID/หมายเลขซีเรียลโดยใช้ PowerShell ได้อย่างไร
อีกวิธีหนึ่งในการแมปดิสก์เสมือน VMWare กับดิสก์ภายในเกสต์ VM คือการเปรียบเทียบ ID ดิสก์ที่ไม่ซ้ำกัน ใน VMWare คุณลักษณะนี้เรียกว่า UUID (ID ที่ไม่ซ้ำ) และใน Windows – a หมายเลขซีเรียล . มาดูวิธีรับ UUID และ SerialNumber ของดิสก์เสมือนโดยใช้ PowerShell
ตามค่าเริ่มต้น VMWare VM ทั้งหมดจะมีดิสก์EnableUUID=TRUE
เปิดใช้งานพารามิเตอร์ หมายความว่า guest OS ต้องเห็น ID ดิสก์เสมือน ในการรับข้อมูลเกี่ยวกับดิสก์ใน Windows คุณสามารถใช้ Storage module cmdlets หรือการสืบค้น WMI เนื่องจากเรายังมี VM บางตัวที่ใช้ Windows Server 2008 R2 ที่ไม่มีโมดูล Storage เราจะใช้ 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 Target 1, ซีเรียล 6000c2950ee961954909938642bb03b4
- PHYSICALDRIVE1:พอร์ต SCSI 4, เป้าหมาย SCSI 10, ซีเรียล 6000c2995fc3c4928d6650596bb02cef
จากนั้นลองรับหมายเลขคอนโทรลเลอร์ SCSI และ UUID ของดิสก์ที่ระบุในการตั้งค่าของเครื่องเสมือน VMWare หากต้องการดูการตั้งค่า 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 โดยใช้ UUID
หากคุณมีสิทธิ์ของผู้ดูแลระบบใน guest OS ของ VM คุณสามารถจับคู่ดิสก์ Windows และไฟล์ VMWare VMDK ได้โดยใช้สคริปต์ PowerShell ที่สะดวกกว่า สคริปต์เชื่อมต่อระบบปฏิบัติการ Windows ของผู้เยี่ยมชมผ่านเครือข่าย รวบรวมข้อมูลเกี่ยวกับดิสก์ในเครื่อง และจับคู่กับ 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 เชื่อมต่อผ่านจุดต่อ จะไม่มีข้อมูลเกี่ยวกับอักษรระบุไดรฟ์และป้ายกำกับโวลุ่มที่กำหนดในเอาต์พุต