Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Khi mở rộng dung lượng ổ đĩa của máy ảo VMware hoặc xóa ổ đĩa, đôi khi khó xác định ổ đĩa ảo VMware nào tương ứng với ổ đĩa Windows cụ thể trong máy ảo. Nếu chỉ có vài ổ đĩa và chúng khác nhau về dung lượng, việc tìm ổ đĩa cần thiết rất dễ dàng. Nhưng làm sao nếu có nhiều ổ VMDK (hoặc RDM) cùng dung lượng hoặc nhiều bộ điều khiển SCSI ảo được tạo cho một VM? Làm thế nào để tránh nhầm lẫn và chọn đúng ổ đĩa mà quản trị viên Windows yêu cầu mở rộng (hoặc thu nhỏ)?

Cách Lấy Số Thiết Bị SCSI Trong Windows Và VMware?

Mở bảng điều khiển Quản lý đĩa (diskmgmt.msc) trong Windows (trong ví dụ này là Windows Server 2016). Tên bộ điều khiển SCSI và số thiết bị SCSI không hiển thị trong danh sách ổ đĩa. Để lấy số thiết bị SCSI, chuột phải vào ổ đĩa và chọn Properties. Như bạn thấy, thông tin về cổng thiết bị cho VMware Virtual disk SCSI Disk Device được hiển thị trong trường Location của tab General.

  • Location 160 = Bộ điều khiển Bus SCSI 0
  • Target ID 1 = ID thiết bị SCSI là 1

Kết hợp dữ liệu bạn thấy để có địa chỉ ổ đĩa SCSI: SCSI(0:1).

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Sau đó mở thuộc tính máy ảo trong VMware vSphere Client. Tìm ổ đĩa có số Virtual Device Node trùng với ID bạn vừa lấy. Trong ví dụ của chúng tôi, đó là SCSI(0:1) Hard Disk 2.

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Nếu cấu hình nhiều ổ đĩa ảo với các bộ điều khiển SCSI khác nhau trên một máy ảo (bạn có thể thêm tối đa 4 bộ điều khiển SCSI với 16 ổ đĩa mỗi bộ cho một máy ảo), việc tìm số thiết bị SCSI thủ công trở nên khá thách thức. Cũng lưu ý rằng số bộ điều khiển SCSI trong Windows và VMware có thể khác nhau.

Cách Khớp Ổ Đĩa Windows Với VMDK Theo UUID/Số Serial Bằng PowerShell?

Cách khác để ánh xạ các ổ đĩa ảo VMware với ổ đĩa bên trong VM khách là so sánh các ID duy nhất của ổ đĩa. Trong VMware, thuộc tính này gọi là UUID (Unique ID), và trong Windows là Serial Number. Hãy xem cách lấy UUID và SerialNumber của ổ đĩa ảo bằng PowerShell.

Mặc định, tất cả VM VMware đều bật tham số EnableUUID=TRUE cho ổ đĩa. Điều này nghĩa là hệ điều hành khách phải nhìn thấy ID ổ đĩa ảo.

Để lấy thông tin ổ đĩa trong Windows, bạn có thể dùng cmdlet của module Storage hoặc truy vấn WMI. Vì chúng tôi vẫn có một số VM chạy Windows Server 2008 R2 không có module Storage, chúng tôi sẽ dùng WMI.

Để lấy số bộ điều khiển SCSI, số thiết bị SCSI trên đó, số serial ổ đĩa ảo (SerialNumber/UUID), dung lượng ổ đĩa và số ổ đĩa trong Windows, chạy lệnh PowerShell sau:

$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 

Trong ví dụ của chúng tôi, Windows phát hiện ba ổ đĩa:

  • PHYSICALDRIVE0: SCSI Port 0, SCSI Target 0, Serial 6000c2939b157427dadbace321ed4973
  • PHYSICALDRIVE1: SCSI Port 0, SCSI Target 1, Serial 6000c2950ee961954909938642bb03b4
  • PHYSICALDRIVE1: SCSI Port 4, SCSI Target 10, Serial 6000c2995fc3c4928d6650596bb02cef

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Tiếp theo, hãy lấy số bộ điều khiển SCSI và UUID của các ổ đĩa được chỉ định trong cài đặt máy ảo VMware. Để xem cài đặt VM, dùng console 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 

Script này sẽ kết nối đến vCenter (hoặc ESXi) và lấy danh sách ổ đĩa cho VM chỉ định. Kết quả phải chứa tên DataStore, đường dẫn file VMDK, số ổ đĩa, dung lượng ổ đĩa và UUID.

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Sau đó bạn có thể khớp thủ công các ổ đĩa thấy trong Windows khách với ổ đĩa ảo VMware bằng UUID của chúng.

Nếu bạn có quyền quản trị trong hệ điều hành khách của VM, bạn có thể khớp ổ đĩa Windows và file VMDK VMware bằng script PowerShell tiện lợi hơn. Script kết nối với Windows khách qua mạng, thu thập thông tin ổ đĩa cục bộ và khớp với VMDK VMware.

Dưới đây là mã đầy đủ của script 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 

Script cũng trả về thông tin về chữ cái ổ đĩa và nhãn volume trong Windows.

Khớp Ổ Đĩa Windows Với File VMDK Của VMware

Bây giờ bạn có thể dễ dàng tìm ổ đĩa Windows nào khớp với ổ đĩa vmdk ảo cho trước.

Nếu các ổ đĩa ảo trong Windows được kết nối qua mount point, sẽ không có thông tin về chữ cái ổ đĩa và nhãn volume được gán trong đầu ra.