Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

WindowsディスクをVMWareVMDKファイルに一致させる

VMWare仮想マシンのディスクサイズを拡張したり、ディスクを削除したりする場合、どのVMware仮想ディスクが特定のWindowsVMディスクと一致するかを理解するのが難しい場合があります。ディスクが少なく、サイズが異なる場合は、必要なディスクを簡単に見つけることができます。しかし、同じサイズの複数の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
  • ターゲットID1 =デバイスのSCSIIDは1です

表示されたデータを結合して、SCSIディスクアドレスを取得します: SCSI(0:1)。

WindowsディスクをVMWareVMDKファイルに一致させる

次に、VMWarevSphereクライアントで仮想マシンのプロパティを開きます。取得したIDと同じ仮想デバイスノード番号を持つディスクを見つけます。この例では、 SCSI(0:1)です。 ハードディスク2。

WindowsディスクをVMWareVMDKファイルに一致させる

異なるSCSIコントローラーを持つ複数の仮想ディスクが仮想マシンに構成されている場合(仮想マシンにそれぞれ16個のディスクを持つ最大4つのSCSIコントローラーを追加できます)、SCSIデバイス番号を手動で見つけることは非常に困難です。また、WindowsとVMWareのSCSIコントローラ番号は異なる場合があることに注意してください。

PowerShellを使用してUUID/シリアル番号でWindowsディスクとVMDKを一致させる方法

VMWare仮想ディスクをゲストVM内のディスクにマップする別の方法は、それらの一意のディスクIDを比較することです。 VMWareでは、この属性は UUIDと呼ばれます (一意のID)、およびWindowsの場合–シリアル番号 。 PowerShellを使用して仮想ディスクのUUIDとシリアル番号を取得する方法を見てみましょう。

デフォルトでは、すべてのVMWareVMにディスクEnableUUID=TRUEがあります パラメータが有効になっています。これは、ゲストOSが仮想ディスクIDを確認する必要があることを意味します。

Windowsのディスクに関する情報を取得するには、ストレージモジュールのコマンドレットまたはWMIクエリを使用できます。ストレージモジュールを持たないWindowsServer2008 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は3つのディスクを検出しました:

  • PHYSICALDRIVE0:SCSIポート0、SCSIターゲット0、シリアル6000c2939b157427dadbace321ed4973
  • PHYSICALDRIVE1:SCSIポート0、SCSIターゲット1、シリアル6000c2950ee961954909938642bb03b4
  • PHYSICALDRIVE1:SCSIポート4、SCSIターゲット10、シリアル6000c2995fc3c4928d6650596bb02cef

WindowsディスクをVMWareVMDKファイルに一致させる

次に、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のディスクのリストを取得します。結果には、データストア名、VMDKファイルパス、ディスク番号、ディスクサイズ、およびUUIDが含まれている必要があります。

WindowsディスクをVMWareVMDKファイルに一致させる

次に、ゲストWindows OSに表示されるディスクを、UUIDによってVMWare仮想ディスクと手動で照合できます。

VMのゲストOSに管理者権限がある場合は、より便利なPowerShellスクリプトを使用して、WindowsディスクとVMWareVMDKファイルを照合できます。このスクリプトは、ゲストWindows OSをネットワーク経由で接続し、ローカルディスクに関する情報を収集して、VMWareVMDKと照合します。

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ディスクをVMWareVMDKファイルに一致させる

これで、特定の仮想vmdkディスクに一致するWindowsディスクを簡単に見つけることができます。

Windowsの仮想ディスクがマウントポイントを介して接続されている場合、出力には割り当てられたドライブ文字とボリュームラベルに関する情報はありません。


  1. Windows PC 上の正確な重複ファイルを見つける方法

    重複ファイルは、Windows コンピューターでは常に問題でした。それらは不必要にストレージスペースを占有し、重複が頻繁に発生してファイルを整理されていないままにします.これは、思い出を楽しんでいて、重複した画像が時々表示される場合に、さらに問題になります。ただし、複製ファイルが必要な場合があり、意図せずに変更された場合に元のファイルと比較します。このブログは、読者が PC 上の正確な重複ファイルを見つけるのに役立ちます。 Windows PC で正確な重複を見つける方法 ステップ 1: Microsoft Store から、または下の [ダウンロード] ボタンを使用して、Disk Anal

  2. VirtualBox VDI を VMware VMDK ディスクに変換する方法

    およびその逆。これは、たまたま仮想化ファンで、VirtualBox といずれかの VMware 製品の両方を実行している場合に実行したいことです。ライセンスまたはマシンの状態を保持する必要があること、互換性テストのために別のソフトウェアで実行する必要があること、および仮想化オタクが他の理由を知っていることなど、変換の理由は多数あります。 とにかく、今日は、VirtualBox で使用される .vdi 形式の仮想ハードディスクを、VMware で使用される .vmdk に変換する方法と、その逆の方法の 2 つの明確な方法とおそらく 1 つの方法を紹介します。さらに、必要に応じて、VHD、