Ketika menambah ukuran atau menghapus disk di VMWare untuk mesin virtual Windows, terkadang sulit untuk memahami disk virtual VMware mana yang sesuai dengan disk tertentu di Windows VM. Jika tidak banyak disk dan ukurannya berbeda, mudah untuk menemukan yang tepat. Tetapi apa yang harus saya lakukan jika beberapa VMDK (atau RDM) drive dengan ukuran yang sama dibuat untuk VM, atau beberapa pengendali SCSI virtual dibuat untuk VM? Bagaimana tidak melakukan kesalahan dan memilih drive yang Anda ingin memperluas (atau mengurangi) administrator Windows.
Pada artikel ini, kita akan melihat bagaimana memetakan disk Windows ke disk virtual (VMDK) pada VMWare VMs..
Konten:
- Memeriksa nomor perangkat SCSI di Windows dan VMWare
- Cara memetakan drive Windows ke file VMDK oleh UUID / SerialNumber via PowerShell?
Memeriksa nomor perangkat SCSI di Windows dan VMWare
Buka konsol manajemen disk Manager Disk (diskmgmt.msc) pada Windows (dalam contoh kami, Windows Server 2016). Nama pengontrol SCSI dan nomor perangkat SCSI di atasnya tidak ditampilkan dalam daftar drive. Untuk menentukan nomor SCSI perangkat, klik pada drive dan pilih Properti. Seperti yang Anda lihat, pada tab Jenderal di lapangan Lokasi informasi port perangkat ditunjukkan VMWare Virtual disk SCSI Disk Device.
- Lokasi 160 = Pengendali Bus SCSI 0
- ID target 1 = ID SCSI perangkat 1
Gabungkan data yang diterima dan dapatkan alamat disk SCSI (0: 1).
Sekarang buka properti mesin virtual VMWare di vSphere Client. Temukan drive yang Node Perangkat Virtualnya cocok dengan ID yang Anda terima. Dalam contoh kita, ini SCSI (0: 1) Hard disk 2.
Jika banyak disk virtual dengan pengontrol SCSI berbeda dikonfigurasikan di mesin virtual (Anda dapat menambahkan hingga 4 pengontrol SCSI dengan 16 disk di setiap VM), menemukan nomor perangkat SCSI secara manual cukup sulit. Juga, perlu diingat bahwa nomor pengontrol SCSI pada Windows dan VMWare mungkin berbeda..
Cara memetakan drive Windows ke file VMDK oleh UUID / SerialNumber via PowerShell?
Cara lain untuk memetakan disk virtual VMWare ke disk di dalam guest VM adalah membandingkannya dengan pengidentifikasi disk unik mereka. Dari VMWare, atribut ini disebut Uuid (ID unik) dan di Windows - Nomor seri. Mari kita lihat bagaimana cara mendapatkan UUID dan SerialNumber disk virtual melalui PowerShell.
Secara default, semua VM VMware memiliki opsi yang diaktifkandisk.EnableUUID = BENAR
, ini berarti bahwa OS tamu harus melihat pengidentifikasi disk virtual.Untuk mendapatkan informasi tentang disk di Windows, Anda dapat menggunakan cmdlet modul penyimpanan, atau permintaan WMI. Karena dalam kasus kami, masih ada VM dengan Windows Server 2008 R2, di mana tidak ada modul Penyimpanan, kami akan menggunakan WMI.
Untuk mendapatkan nomor SCSI controller, nomor SCSI perangkat di dalamnya, nomor seri disk virtual (SerialNumber / UUID), ukuran dan nomor disk di Windows, jalankan perintah PowerShell:
$ DiskInfo = foreach ($ disk di 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
Dalam contoh kami, kami menentukan bahwa Windows melihat tiga drive:
- 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
Sekarang mari kita coba untuk mendapatkan jumlah pengontrol SCSI dan UUID dari disk, yang ditentukan dalam pengaturan mesin virtual VMware. Untuk mendapatkan parameter VM, gunakan PowerCLI.
Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue connect-viserver vcenter1 $ vmName = "msk-sql1" $ vmHardDisks = Dapatkan-VM -Name $ vmName | Get-HardDisk $ vmDatacenterView = Dapatkan-VM -Name $ vmName | Dapatkan-Datacenter | Get-View $ virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager $ vmresult = @ () foreach ($ vmHardDisk dalam $ vmHardDisks) $ string = $ vmHardDisk.Filename $ vmHardDiskUuid = ($ vmHardidack.cididack.acktack.ack -Object $ _. Replace (","). Replace ('-', ")) $ vmresult =" "| Objek-Pilih vmHardDiskDatastore, vmHardDiskVmdk, vmHardDiskName, vmHardDiskSize, vmHardDiskDard $ vmresDardardiskardkan $ vmresHardardiskardan $ vmresHardardiskardan .split (']') [0] .split ('[') [1] $ vmresult.vmHardDiskVmdk = $ vmHardDisk.filename.split (']') [1] .trim () $ vmresult.vmHardDiskName = $ vmHardDisk .Nama $ vmresult.vmHardDiskSize = $ vmHardDisk.CapacityGB $ vmresult.vmHardDiskUuid = $ vmHardDiskUuid $ vmresult + = $ vmresult $ vmresult | ft
Script ini akan terhubung ke server vCenter (atau ESXi) dan untuk VM yang ditentukan akan menerima daftar disk. Setelah menjalankan skrip, Anda akan mendapatkan daftar disk virtual untuk VM. Hasilnya harus berisi nama DataStore, jalur ke file vmdk, nomor disk, ukurannya dan UUID.
Sekarang, dengan UUID yang diterima, Anda dapat memetakan disk secara manual yang terlihat di Windows tamu dengan disk virtual VMWare.
Jika Anda memiliki hak administrator di mesin virtual yang Anda perlukan untuk memetakan disk Windows dan file vmdk di VMWare, Anda dapat menggunakan skrip PowerShell yang lebih sederhana untuk digunakan. Script mengakses Windows tamu melalui jaringan, mengumpulkan informasi tentang disk lokal dan menunjukkan korespondensi dengan disk VMWare.
Kode skrip PowerShell penuh:
Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue connect-viserver vcenter1 $ vmName = "msk-sql1" $ WinHostName = "msk-sqlclu1.winitpro.ru" # Dapatkan daftar VMWare drive $ vmDisks = Get-VM -Nama $ vmName | Get-HardDisk $ vmDatacenterView = Dapatkan-VM -Name $ vmName | Dapatkan-Datacenter | Get-View $ virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager # Akun administrator dan kata sandi untuk mengakses OS tamu $ kred = = ($ cred) $ cred else Get-Credential # Dapatkan daftar disk dan partisi Windows via WMI $ winDisk = Get-WmiObject -Class Win32_DiskDrive -ComputerName $ WinHostName -Credential $ cred $ diskToDriveVolume = Get-WmiObject Win32_DiskDrive -ComputerName $ WinHostName -Credential $ cred | % $ disk = $ _ $ partisi = "ASSOCIATORS OF" + "Win32_DiskDrive.DeviceID = '$ ($ disk.DeviceID)'" + "WHERE AssocClass = Win32_DiskDriveToDiskPartition" Get-WmiObject -Query $ partitions -ComputerName $ WinNameHosting -Kredensial $ cred | % $ partisi = $ _ $ drive = "ASSOCIATORS OF" + "Win32_DiskPartition.DeviceID = '$ ($ partition.DeviceID)'" + "WHERE AssocClass = Win32_LogicalDiskToPartition" Get-WmiObject -Query $ drive -ComputerName $ WinHost $ WinHost -Kredensial $ cred | % Objek Baru -Jenis PSCustomObject -Property @ Disk = $ disk.DeviceID DriveLetter = $ _. DeviceID VolumeName = $ _. VolumeName # dapatkan nomor seri drive foreach ($ disk dalam $ 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 # Pencacahan semua disk VM, pemetaan ke disk Windows oleh SerialNumber / UUID $ diskMaps = @ () foreach ($ vmDisk dalam $ vmDisks) $ vmDiskUuid = $ virtualDiskManager.queryvinamual , $ vmDatacenterView.MoRef) | foreach $ _. replace (","). replace ('-', ") $ windowsDisk = $ winDisk | di mana $ _. SerialNumber -eq $ vmDiskUuid if (-not $ windowsDisk) $ windowsDisk = $ winDisk | where $ _. AltSerialNumber -eq $ vmDisk.ScsiCanonicalName.substring (12,24) $ curDiskMap = "" | pilih vmDiskDatastore, vmDiskVmdk, vmDiskName, windowsDiskIndex, vmDiskUuid, windowsDeviceID, drive, volume $ curDiskMap.vmDiskDatastore = $ vmDisk.filename.split (']') [0] $ []] $ 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 | di mana $ _. Disk -eq $ windowsDisk.DeviceID $ curDiskMap.drives = $ driveVolumes.DriveLetter $ curDiskMap.volumes = $ driveVolumes.VolumeName $ diskMaps + = $ curDiskMap $ diskMaps = $ diskMaps | sort [int] $ _. vmDiskName.split (") [2] $ diskMaps | ft
Selain itu mengembalikan informasi tentang huruf drive dan label volume Windows.
Sekarang Anda dapat dengan mudah mengetahui drive virtual mana yang sesuai dengan drive Windows..
Jika disk virtual di Windows terhubung melalui titik pemasangan, output tidak akan berisi informasi tentang huruf drive dan label volume yang ditetapkan.