Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Khớp đĩa Windows với tệp VMWare VMDK

Khi mở rộng kích thước đĩa của máy ảo VMWare hoặc xóa đĩa, đôi khi thật khó hiểu đĩa ảo VMware nào phù hợp với đĩa Windows VM cụ thể. Nếu có ít đĩa và chúng khác nhau tùy theo kích thước, bạn có thể dễ dàng tìm thấy đĩa mình cần. Nhưng phải làm gì nếu một số đĩa VMDK (hoặc RDM) có cùng kích thước hoặc một số bộ điều khiển SCSI ảo đã được tạo cho một máy ảo? Làm thế nào để tránh lỗi và chọn đĩa mà quản trị viên Windows yêu cầu bạn mở rộng (hoặc thu nhỏ)?

Trong bài viết này, chúng ta sẽ xem cách khớp đĩa Windows và đĩa ảo (VMDK) trên máy ảo VMWare.

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ụ của chúng tôi, đó là Windows Server 2016). Tên bộ điều khiển SCSI và số thiết bị SCSI không được hiển thị trong danh sách đĩa. Để nhận số thiết bị SCSI, hãy nhấp chuột phải vào đĩa và chọn Thuộc tính . Như bạn có thể thấy, thông tin về cổng thiết bị cho VMWare Virtual disk SCSI Disk Device được hiển thị trong Vị trí trường Chung tab.

  • Vị trí 160 =Bộ điều khiển Bus SCSI 0
  • ID mục tiêu 1 =ID SCSI của thiết bị là 1

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

Khớp đĩa Windows với tệp VMWare VMDK

Sau đó, mở thuộc tính máy ảo trong VMWare vSphere Client của bạn. Tìm đĩa có cùng số Nút thiết bị ảo với ID bạn có. Trong ví dụ của chúng tôi, đó là SCSI (0:1) Đĩa cứng 2.

Khớp đĩa Windows với tệp VMWare VMDK

Nếu nhiều đĩa ảo với các bộ điều khiển SCSI khác nhau được định cấu hình 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 mỗi bộ điều khiển 16 đĩa vào một máy ảo), việc tìm số thiết bị SCSI theo cách thủ công là một việc khá khó khăn. Cũng xin 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ố sê-ri bằng PowerShell?

Một cách khác để ánh xạ đĩa ảo VMWare với các đĩa bên trong máy ảo khách là so sánh các ID đĩa duy nhất của chúng. Trong VMWare thuộc tính này được gọi là UUID (ID duy nhất) và trong Windows - một Số sê-ri . Hãy xem cách lấy UUID và SerialNumber của đĩa ảo bằng PowerShell.

Theo mặc định, tất cả các máy ảo VMWare đều có đĩa EnableUUID=TRUE đã bật tham số. Nó có nghĩa là một hệ điều hành khách phải thấy các ID đĩa ảo.

Để nhận thông tin về đĩa trong Windows, bạn có thể sử dụng lệnh ghép ngắn mô-đun Lưu trữ hoặc truy vấn WMI. Vì chúng tôi vẫn còn một số máy ảo chạy Windows Server 2008 R2 không có mô-đun Lưu trữ, chúng tôi sẽ sử dụng WMI.

Để nhận số bộ điều khiển SCSI, số thiết bị SCSI trên đó, số sê-ri của đĩa ảo (SerialNumber / UUID), kích thước đĩa và số đĩa trong Windows, hãy 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 ra ba đĩa:

  • PHYSICALDRIVE0:Cổng SCSI 0, Mục tiêu SCSI 0, Serial 6000c2939b157427dadbace321ed4973
  • PHYSICALDRIVE1:Cổng SCSI 0, SCSI Target 1, Serial 6000c2950ee961954909938642bb03b4
  • PHYSICALDRIVE1:SCSI Port 4, SCSI Target 10, Serial 6000c2995fc3c4928d6650596bb02cef

Khớp đĩa Windows với tệp VMWare VMDK

Sau đó, hãy thử lấy số bộ điều khiển SCSI và UUID của các đĩa được chỉ định trong cài đặt của máy ảo VMWare. Để xem cài đặt VM, hãy sử dụng bảng điều khiển 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 

Tập lệnh này sẽ kết nối với máy chủ vCenter (hoặc ESXi) và nhận danh sách các đĩa cho máy ảo được chỉ định. Kết quả phải chứa tên DataStore, đường dẫn tệp VMDK, số đĩa, kích thước đĩa và UUID.

Khớp đĩa Windows với tệp VMWare VMDK

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

Nếu bạn có quyền quản trị viên trong hệ điều hành khách của máy ảo, bạn có thể khớp đĩa Windows và tệp VMWare VMDK bằng cách sử dụng tập lệnh PowerShell tiện lợi hơn. Tập lệnh kết nối hệ điều hành Windows khách qua mạng, thu thập thông tin về các đĩa cục bộ của nó và khớp chúng với VMWare VMDK.

Đây là mã đầy đủ của tập lệnh 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

Tập lệnh cũng trả về thông tin về ký tự ổ đĩa và nhãn ổ đĩa trong Windows.

Khớp đĩa Windows với tệp VMWare VMDK

Giờ đây, bạn có thể dễ dàng tìm thấy đĩa Windows nào khớp với đĩa vmdk ảo đã cho.

Nếu các đĩa ảo trong Windows được kết nối qua các điểm gắn kết, sẽ không có thông tin về các ký tự ổ đĩa được gán và nhãn ổ đĩa trong đầu ra.