SCSI

Při zvětšování velikosti nebo mazání disku ve virtuálních počítačích VMWare pro Windows je někdy obtížné pochopit, který virtuální disk VMware odpovídá konkrétnímu disku ve Windows VM. Pokud není příliš mnoho disků a všechny se liší velikostí, je snadné najít ten pravý. Co mám dělat, když je pro VM vytvořeno několik jednotek VMDK (nebo RDM) stejné velikosti nebo pro VM je vytvořeno několik virtuálních řadičů SCSI? Jak neudělat chybu a vybrat přesně jednotku, kterou chcete rozšířit (nebo zmenšit) správce systému Windows.

V tomto článku se podíváme na to, jak mapovat disky Windows na virtuální disky (VMDK) na VMWare VM..

Obsah:

  • Kontrola čísla zařízení SCSI ve Windows a VMWare
  • Jak mapovat jednotky Windows na soubory VMDK pomocí UUID / SerialNumber pomocí PowerShell?

Kontrola čísla zařízení SCSI ve Windows a VMWare

Otevřete v systému Windows konzolu pro správu disků (diskmgmt.msc) (v našem příkladu Windows Server 2016). Název řadiče SCSI a číslo zařízení SCSI na něm nejsou zobrazeny v seznamu jednotek. Chcete-li zjistit číslo SCSI zařízení, klikněte na jednotku a vyberte Vlastnosti. Jak vidíte, na kartě Generále v poli Umístění jsou uvedeny informace o portu zařízení VMWare Virtual disk SCSI Disk Device.

  • Umístění 160 = Řadič sběrnice SCSI 0
  • Cílové ID 1 = SCSI ID zařízení 1

Zkombinujte přijatá data a získejte adresu disku SCSI (0: 1).

Nyní otevřete vlastnosti virtuálního počítače VMWare v klientovi vSphere. Najděte jednotku, jejíž virtuální virtuální uzel odpovídá ID, které jste obdrželi. V našem příkladu to SCSI (0: 1) Pevný disk 2.

Pokud je ve virtuálním počítači nakonfigurováno mnoho virtuálních disků s různými řadiči SCSI (můžete přidat až 4 řadiče SCSI s 16 disky v každém VM), je ruční nalezení čísla zařízení SCSI poměrně obtížné. Nezapomeňte také, že čísla řadičů SCSI v systému Windows a VMWare se mohou lišit..

Jak mapovat jednotky Windows na soubory VMDK pomocí UUID / SerialNumber pomocí PowerShell?

Dalším způsobem, jak namapovat virtuální disky VMWare na disky uvnitř hostujícího virtuálního počítače, je jejich porovnání podle jejich jedinečného identifikátoru disku. Z VMWare se tento atribut nazývá Uuid (Unique ID) a na Windows - Sériové číslo. Uvidíme, jak získat virtuální disky UUID a SerialNumber pomocí prostředí PowerShell.

Ve výchozím nastavení mají tuto možnost povoleny všechny VMWare VM disk.EnableUUID = PRAVDA, to znamená, že hostující OS by měl vidět identifikátory virtuálních disků.

Chcete-li získat informace o discích ve Windows, můžete použít rutiny úložného modulu nebo požadavky WMI. Protože v našem případě stále existují VM se systémem Windows Server 2008 R2, ve kterém není modul úložiště, budeme používat rozhraní WMI.

Chcete-li získat číslo SCSI řadiče, číslo SCSI zařízení na něm, sériové číslo virtuálního disku (SerialNumber / UUID), velikost a číslo disku v systému Windows, spusťte příkaz PowerShell:

$ DiskInfo = foreach ($ disk v Get-WmiObject Win32_DiskDrive) [pscustomobject] @ "DeviceID" = $ disk.DeviceID; "Titulek" = $ disk.Caption; "Kapacita (GB)" = [math] :: Round ($ disk.size / 1GB, 0); "SerialNumber" = $ disk.SerialNumber "SCSIControllerNum" = $ disk.scsiport; "SCSIDeviceNum" = $ disk.scsitargetid;  $ DiskInfo | ft

V našem příkladu jsme zjistili, že Windows vidí tři jednotky:

  • PHYSICALDRIVE0: SCSI Port 0, SCSI Target 0, Serial 6000c2939b153417dedbdce371ed497b
  • PHYSICALDRIVE1: SCSI Port 0, SCSI Target 1, Serial 6000c2950ee961954909259642bb03bf
  • PHYSICALDRIVE1: SCSI Port 4, SCSI Target 10, Serial 6000c2995fc3c4728de8b0596bb02ce3

Nyní se pokusíme získat počet řadičů SCSI a UUID disků, které jsou uvedeny v nastavení virtuálního počítače VMware. Chcete-li získat parametry VM, použijte PowerCLI.

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue connect-viserver vcenter1 $ vmName = "msk-sql1" $ vmHardDisks = Get-VM --Name $ vmName | Get-HardDisk $ vmDatacenterView = Get-VM - jméno $ vmName | Get-Datacenter | Get-View $ virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager $ vmresults = @ () foreach ($ vmHardDisk v $ vmHardDisks) $ string = $ vmHardDisk.Filename $ vmHardDiskUuid = ($ vmHardDisk.Eachuidack.ackaidack.ack) -Objekt $ _. Nahradit (","). Nahradit ('-', ")) $ vmresult =" "| Vybrat objekt vmHardDiskDatastore, vmHardDiskVmdk, vmHardDiskName, vmHardDiskVelikost, vmHardDiskUuid $ vmresk .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 

Tento skript se připojí k serveru vCenter (nebo ESXi) a pro zadaný virtuální počítač obdrží seznam disků. Po spuštění skriptu získáte seznam virtuálních disků pro VM. Výsledek by měl obsahovat název DataStore, cestu k souboru vmdk, číslo disku, jeho velikost a UUID.

Nyní, podle přijatých UUID, můžete ručně mapovat disky, které jsou viditelné v hostujícím Windows, s virtuálními disky VMWare.

Pokud máte práva správce ve virtuálním počítači, pro který potřebujete mapovat disky Windows a soubory vmdk ve VMWare, můžete použít jednodušší skript PowerShell. Skript přistupuje k hostujícímu systému Windows přes síť, shromažďuje informace o místních discích a zobrazuje korespondenci s disky VMWare.

Úplný kód skriptu PowerShell:

Importovací modul VMware.VimAutomation.Core -ErrorAction SilentlyContinue connect-viserver vcenter1 $ vmName = "msk-sql1" $ WinHostName = "msk-sqlclu1.winitpro.ru" # Získat seznam VMWare disků $ vmDisks = Get-VM -Name $ vmName | Get-HardDisk $ vmDatacenterView = Get-VM - jméno $ vmName | Get-Datacenter | Get-View $ virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager # Účet správce a heslo pro přístup k hostujícímu OS $ cred = if ($ cred) $ cred else Get-Credential # Získat seznam disků a oddílů Windows via 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 $ WinHName -Credit $ $ | % $ partition = $ _ $ drives = "ASSOCIATORS OF" + "Win32_DiskPartition.DeviceID = '$ ($ partition.DeviceID)'" + "WHERE AssocClass = Win32_LogicalDiskToPartition" Get-WmiObject -Query $ drive -computerName $ WinHostName -Credit $ $ | % New-Object - Typ PSCustomObject -Property @ Disk = $ disk.DeviceID DriveLetter = $ _. DeviceID VolumeName = $ _. VolumeName # # získejte sériové číslo disku foreach ($ disk v $ winDisk) $ disk | Add-Member -MemberType NoteProperty -Name AltSerialNumber - hodnota $ 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 # Vyčíslení všech disků VM, mapování na disky Windows podle SerialNumber / UUID $ diskMaps = @ () foreach ($ vmDisk v $ vmDisks) $ vmDiskUuid = $ virtualDiskManager.queryvirtualdiskuuid. , $ vmDatacenterView.MoRef) | foreach $ _. Nahradit (","). Nahradit ('-', ") $ windowsDisk = $ winDisk | kde $ _. SerialNumber -eq $ vmDiskUuid if (-not $ windowsDisk) $ windowsDisk = $ winDisk | kde $ _. AltSerialNumber -eq $ vmDisk.ScsiCanonicalName.substring (12,24) $ curDiskMap = "" | vyberte vmDiskDatastore, vmDiskVmdk, vmDiskName, windowsDiskIndex, vmDiskUuid, windowsDeviceID, jednotky, svazky $ curDiskMap.vmDiskDatastore = $ vmDisk.filename.split (']') [0] .split ('['] [1] [m] $ 1 $ 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 | kde $ _. Disk -e $ $ windowsDisk.DeviceID $ curDiskMap.drives = $ driveVolumes.DriveLetter $ curDiskMap.volumes = $ driveVolumes.VolumeName $ diskMaps + = $ curDiskMap $ diskMaps = $ diskMaps | sort [int] $ _. vmDiskName.split (") [2] $ diskMaps | ft 

Dále vrací informace o písmenech jednotek a svazcích Windows.

Nyní můžete snadno zjistit, které virtuální jednotce jednotka ve Windows odpovídá..

Pokud jsou virtuální disky v systému Windows připojeny prostřednictvím bodu připojení, nebude výstup obsahovat informace o přiřazeném písmenu jednotky a označení svazku.