SCSI

Podczas zwiększania rozmiaru lub usuwania dysku w maszynach wirtualnych VMWare dla Windows czasami trudno jest zrozumieć, który dysk wirtualny VMware odpowiada danemu dyskowi w maszynie wirtualnej Windows. Jeśli nie ma wielu dysków i wszystkie różnią się rozmiarem, łatwo jest znaleźć właściwy. Ale co powinienem zrobić, jeśli dla maszyny wirtualnej zostanie utworzonych kilka dysków VMDK (lub RDM) o tym samym rozmiarze lub kilka maszyn wirtualnych SCSI dla maszyny wirtualnej? Jak nie popełnić błędu i wybrać dokładnie dysk, który chcesz rozszerzyć (lub zmniejszyć) administrator systemu Windows.

W tym artykule przyjrzymy się, jak mapować dyski Windows na dyski wirtualne (VMDK) na VMWare VM..

Treść

  • Sprawdzanie numeru urządzenia SCSI w Windows i VMWare
  • Jak mapować dyski Windows na pliki VMDK według UUID / SerialNumber za pomocą PowerShell?

Sprawdzanie numeru urządzenia SCSI w Windows i VMWare

Otwórz konsolę zarządzania dyskami Menedżera dysków (diskmgmt.msc) w systemie Windows (w naszym przykładzie Windows Server 2016). Nazwa kontrolera SCSI i numer urządzenia SCSI nie są wyświetlane na liście napędów. Aby ustalić numer SCSI urządzenia, kliknij napęd i wybierz Właściwości. Jak widać, na zakładce Ogólne w polu Lokalizacja wskazane są informacje o porcie urządzenia VMWare Dysk wirtualny Urządzenie dyskowe SCSI.

  • Lokalizacja 160 = kontroler magistrali SCSI 0
  • Identyfikator docelowy 1 = SCSI ID urządzenia 1

Połącz otrzymane dane i uzyskaj adres dysku SCSI (0: 1).

Teraz otwórz właściwości maszyny wirtualnej VMWare w kliencie vSphere. Znajdź dysk, którego węzeł urządzenia wirtualnego odpowiada otrzymanemu identyfikatorowi. W naszym przykładzie to SCSI (0: 1) Dysk twardy 2.

Jeśli na maszynie wirtualnej skonfigurowanych jest wiele dysków wirtualnych z różnymi kontrolerami SCSI (można dodać do 4 kontrolerów SCSI z 16 dyskami na każdej maszynie wirtualnej), ręczne znalezienie numeru urządzenia SCSI jest dość trudne. Należy również pamiętać, że numery kontrolerów SCSI w systemach Windows i VMWare mogą się różnić..

Jak mapować dyski Windows na pliki VMDK według UUID / SerialNumber za pomocą PowerShell?

Innym sposobem mapowania dysków wirtualnych VMWare na dyski w maszynie wirtualnej gościa jest porównanie ich według ich unikalnego identyfikatora dysku. Z VMWare ten atrybut jest nazywany Uuid (Unikalny identyfikator) i w systemie Windows - Numer seryjny. Zobaczmy, jak uzyskać identyfikator UUID i numer seryjny dysków wirtualnych za pomocą programu PowerShell.

Domyślnie wszystkie maszyny wirtualne VMWare mają włączoną opcję disk.EnableUUID = TRUE, oznacza to, że system operacyjny gościa powinien widzieć identyfikatory dysków wirtualnych.

Aby uzyskać informacje o dyskach w systemie Windows, możesz użyć poleceń cmdlet modułu pamięci lub żądań WMI. Ponieważ w naszym przypadku nadal są maszyny wirtualne z systemem Windows Server 2008 R2, w których nie ma modułu pamięci, użyjemy WMI.

Aby uzyskać numer SCSI kontrolera, numer SCSI urządzenia na nim, numer seryjny dysku wirtualnego (SerialNumber / UUID), rozmiar i numer dysku w systemie Windows, uruchom polecenie PowerShell:

$ DiskInfo = foreach ($ disk w Get-WmiObject Win32_DiskDrive) [pscustomobject] @ "DeviceID" = $ disk.DeviceID; „Caption” = $ disk.Caption; „Pojemność (GB)” = [matematyka] :: Round ($ disk.size / 1GB, 0); „SerialNumber” = $ disk.SerialNumber „SCSIControllerNum” = $ disk.scsiport; „SCSIDeviceNum” = $ disk.scsitargetid;  $ DiskInfo | ft

W naszym przykładzie ustaliliśmy, że system Windows widzi trzy dyski:

  • 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

Teraz spróbujmy uzyskać liczby kontrolerów SCSI i UUID dysków, które są określone w ustawieniach maszyny wirtualnej VMware. Aby uzyskać parametry VM, użyj PowerCLI.

Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue connect-viserver vcenter1 $ vmName = "msk-sql1" $ 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 w $ vmHardDisks) $ string = $ vmHardDisk.Filename $ vmHardDiskUuid = ($ vmHardDack.Ebaidata -Object $ _. Replace (","). Replace ('-', ")) $ vmresult =" "| Select-Object vmHardDiskDatastore, vmHardDiskVmdk, vmHardDiskName $ vmardDiskSize vmHardDiskUuid $ vmiskisk. .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 

Ten skrypt połączy się z serwerem vCenter (lub ESXi), a dla określonej maszyny Wirtualnej otrzyma listę dysków. Po uruchomieniu skryptu otrzymasz listę wirtualnych dysków dla maszyny wirtualnej. Wynik powinien zawierać nazwę magazynu danych, ścieżkę do pliku vmdk, numer dysku, jego rozmiar i identyfikator UUID.

Teraz dzięki otrzymanym identyfikatorom UUID możesz ręcznie mapować dyski widoczne w systemie-gościu za pomocą dysków wirtualnych VMWare.

Jeśli masz uprawnienia administratora na maszynie wirtualnej, dla której musisz mapować dyski Windows i pliki vmdk w VMWare, możesz użyć prostszego skryptu PowerShell. Skrypt uzyskuje dostęp do systemu Windows gościa przez sieć, zbiera informacje o dyskach lokalnych i pokazuje zgodność z dyskami VMWare.

Pełny kod skryptu PowerShell:

Import-Module VMware.VimAutomation.Core -ErrorAction Cicho Kontynuuj connect-viserver vcenter1 $ vmName = "msk-sql1" $ WinHostName = "msk-sqlclu1.winitpro.ru" # Uzyskaj listę dysków VMWare $ vmDisks = Pobierz nazwę VM $ vmName | Get-HardDisk $ vmDatacenterView = Get-VM -Name $ vmName | Get-Datacenter | Get-View $ virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager # Konto administratora i hasło dostępu do systemu operacyjnego gościa $ cred = if ($ cred) $ cred else Get-Credential # Uzyskaj listę dysków i partycji Windows przez 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 = $ _ $ napędy = "ASSOCIATORS OF" + "Win32_DiskPartition.DeviceID = '$ ($ partition.DeviceID)'" + "WHERE AssocClass = Win32_LogicalDiskToPartition" Get-WmiObject -Query $ napędy -KomputerName $ WinHostName -Credential $ cred | % New-Object -Type PSCustomObject -Property @ Disk = $ disk.DeviceID DriveLetter = $ _. DeviceID VolumeName = $ _. VolumeName # pobierz numer seryjny dysku foreach ($ dysk w $ winDisk) $ dysk | 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 # Wyliczenie wszystkich dysków maszyn wirtualnych, mapowanie na dyski systemu Windows według SerialNumber / UUID $ diskMaps = @ () foreach ($ vmDisk w $ vmDisks) $ vmDiskUuid = $ virtualDiskManager.queryvirtualdiscemid. , $ vmDatacenterView.MoRef) | foreach $ _. replace (","). replace ('-', ") $ windowsDisk = $ winDisk | gdzie $ _. Numer seryjny -eq $ vmDiskUuid if (-not $ windowsDisk) $ windowsDisk = $ winDisk | gdzie $ _. AltSerialNumber -eq $ vmDisk.ScsiCanonicalName.substring (12,24) $ curDiskMap = "" | wybierz vmDiskDatastore, vmDiskVmdk, vmDiskName, windowsDiskIndex, vmDiskUuid, windowsDeviceID, napędy, woluminy $ curDiskMap.vmDiskDatastore = $ vmDisk.filename.split (']') [0] .split ('[') [m] $ 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 | gdzie $ _. Dysk -eq $ windowsDisk.DeviceID $ curDiskMap.drives = $ driveVolumes.DriveLetter $ curDiskMap.volumes = $ driveVolumes.VolumeName $ diskMaps + = $ curDiskMap $ diskMaps = $ diskMaps | sort [int] $ _. vmDiskName.split (") [2] $ diskMaps | ft 

Dodatkowo zwraca informacje o literach dysków i etykietach woluminów Windows.

Teraz możesz łatwo dowiedzieć się, który dysk wirtualny odpowiada dyskowi w systemie Windows..

Jeśli dyski wirtualne w systemie Windows są połączone za pośrednictwem punktu instalacji, dane wyjściowe nie będą zawierać informacji o przypisanej literze dysku i etykiecie woluminu.