VMWare वर्चुअल मशीन के डिस्क आकार का विस्तार करते समय या डिस्क को हटाते समय, कभी-कभी यह समझना कठिन होता है कि कौन सी VMware वर्चुअल डिस्क विशिष्ट Windows VM डिस्क से मेल खाती है। यदि कुछ डिस्क हैं और वे अपने आकार से भिन्न हैं, तो आपको जिस डिस्क की आवश्यकता है उसे ढूंढना आसान है। लेकिन क्या करें यदि एक ही आकार के कई VMDK (या RDM) डिस्क या VM के लिए कई वर्चुअल SCSI नियंत्रक बनाए गए हैं? त्रुटियों से कैसे बचें और उस डिस्क का चयन करें जिसे Windows व्यवस्थापक आपसे विस्तृत करने (या सिकोड़ने) के लिए कहता है?
इस लेख में हम देखेंगे कि VMWare VM पर विंडोज डिस्क और वर्चुअल डिस्क (VMDK) का मिलान कैसे किया जाता है।
Windows और VMWare में SCSI डिवाइस नंबर कैसे प्राप्त करें?
डिस्क प्रबंधन कंसोल खोलें (diskmgmt.msc
) विंडोज में (हमारे उदाहरण में, यह विंडोज सर्वर 2016 है)। SCSI कंट्रोलर का नाम और SCSI डिवाइस नंबर डिस्क की सूची में प्रदर्शित नहीं होते हैं। SCSI डिवाइस नंबर प्राप्त करने के लिए, डिस्क पर राइट-क्लिक करें और गुण . चुनें . जैसा कि आप देख सकते हैं, VMWare वर्चुअल डिस्क SCSI डिस्क डिवाइस के लिए डिवाइस पोर्ट के बारे में जानकारी स्थान में दिखाई गई है सामान्य . का क्षेत्र टैब।
- स्थान 160 =एससीएसआई बस नियंत्रक 0
- लक्ष्य आईडी 1 =डिवाइस एससीएसआई आईडी 1 है
जो डेटा आप देखते हैं उसमें शामिल हों और SCSI डिस्क पता प्राप्त करें:SCSI(0:1)।
फिर अपने VMWare vSphere क्लाइंट में वर्चुअल मशीन के गुण खोलें। उस डिस्क का पता लगाएं जिसमें वर्चुअल डिवाइस नोड नंबर है जो आपको मिली आईडी के समान है। हमारे उदाहरण में, यह SCSI(0:1) . है हार्ड डिस्क 2.
यदि विभिन्न SCSI नियंत्रकों के साथ एक से अधिक वर्चुअल डिस्क को वर्चुअल मशीन पर कॉन्फ़िगर किया गया है (आप एक वर्चुअल मशीन में 16 डिस्क के साथ अधिकतम 4 SCSI नियंत्रक जोड़ सकते हैं), तो मैन्युअल रूप से SCSI डिवाइस नंबर ढूंढना काफी चुनौतीपूर्ण है। कृपया यह भी ध्यान दें कि विंडोज़ और वीएमवेयर में एससीएसआई नियंत्रक संख्या भिन्न हो सकती है।
UUID/सीरियल नंबर द्वारा PowerShell का उपयोग करके VMDK के साथ Windows डिस्क का मिलान कैसे करें?
VMWare वर्चुअल डिस्क को एक अतिथि VM के अंदर डिस्क पर मैप करने का दूसरा तरीका उनकी अद्वितीय डिस्क आईडी की तुलना करना है। VMWare में इस विशेषता को UUID . कहा जाता है (अद्वितीय आईडी), और विंडोज़ में - एक सीरियल नंबर . आइए देखें कि PowerShell का उपयोग करके वर्चुअल डिस्क का UUID और SerialNumber कैसे प्राप्त करें।
डिफ़ॉल्ट रूप से, सभी VMWare VMs में डिस्क होती हैEnableUUID=TRUE
पैरामीटर सक्षम। इसका मतलब है कि अतिथि ओएस को वर्चुअल डिस्क आईडी देखना होगा। विंडोज़ में डिस्क के बारे में जानकारी प्राप्त करने के लिए, आप स्टोरेज मॉड्यूल cmdlets या WMI क्वेरीज़ का उपयोग कर सकते हैं। चूँकि हमारे पास अभी भी Windows Server 2008 R2 चलाने वाले कुछ VM हैं जिनमें स्टोरेज मॉड्यूल नहीं है, हम WMI का उपयोग करेंगे।
SCSI कंट्रोलर नंबर, उस पर SCSI डिवाइस नंबर, वर्चुअल डिस्क का सीरियल नंबर (SerialNumber/UUID), डिस्क आकार और डिस्क नंबर Windows में प्राप्त करने के लिए, यह PowerShell कमांड चलाएँ:
$DiskInfo =foreach (Get-WmiObject Win32_DiskDrive में $डिस्क) { [pscustomobject]@{ "DeviceID"=$disk.DeviceID; "कैप्शन"=$डिस्क.कैप्शन; "क्षमता (जीबी)" =[गणित] ::गोल ($ डिस्क आकार / 1 जीबी, 0); "SerialNumber" =$disk.SerialNumber "SCSIControllerNum"=$disk.scsiport; "SCSIDeviceNum"=$disk.scsitargetid; }}$DiskInfo|ft
हमारे उदाहरण में, विंडोज़ ने तीन डिस्क का पता लगाया है:
- PHYSICALDRIVE0:एससीएसआई पोर्ट 0, एससीएसआई लक्ष्य 0, सीरियल 6000c2939b157427dadbace321ed4973
- PHYSICALDRIVE1:SCSI पोर्ट 0, SCSI लक्ष्य 1, सीरियल 6000c2950ee961954909938642bb03b4
- PHYSICALDRIVE1:SCSI पोर्ट 4, SCSI लक्ष्य 10, सीरियल 6000c2995fc3c4928d6650596bb02cef
फिर आइए VMWare वर्चुअल मशीन की सेटिंग में निर्दिष्ट डिस्क के SCSI कंट्रोलर नंबर और UUIDs प्राप्त करने का प्रयास करें। VM सेटिंग देखने के लिए, PowerCLI कंसोल का उपयोग करें।
<पूर्व>आयात-मॉड्यूल VMware.VimAutomation.Core -ErrorAction SilentlyContinueconnect-viser ber-vmware1 $vmName="ber-man01"$vmHardDisks =Get-VM -Name $vmName | Get-HardDisk $vmDatacenterView =Get-VM -Name $vmName | गेट-डेटासेंटर | प्राप्त-दृश्य $virtualDiskManager =प्राप्त-दृश्य-Id VirtualDiskManager-virtualDiskManager $vmresults =@() foreach ($vmHardDisk में $vmHardDisk) { $string =$vmHardDisk.Filename $vmHardDiskUuid =($vmHardDisk.ExtensionData.ForEachUuid. -ऑब्जेक्ट {$_.replace(' ','').replace('-','')}) $vmresult ="" | सेलेक्ट-ऑब्जेक्ट vmHardDiskDatastore,vmHardDiskVmdk,vmHardDiskName,vmHardDiskSize,vmHardDiskUuid $vmresult.vmHardDiskDatastore =$vmHardDisk.filename.split(']')[0].split('[') .split(']')[1].trim() $vmresult.vmHardDiskName =$vmHardDisk.Name $vmresult.vmHardDiskSize =$vmHardDisk.CapacityGB $vmresult.vmHardDiskUuid =$vmHardDiskUuid +$vmresults फीटयह स्क्रिप्ट vCenter (या ESXi) सर्वर से कनेक्ट होगी और निर्दिष्ट VM के लिए डिस्क की सूची प्राप्त करेगी। परिणाम में डेटास्टोर का नाम, VMDK फ़ाइल पथ, डिस्क संख्या, डिस्क आकार और UUID होना चाहिए।
फिर आप अतिथि Windows OS में दिखाई देने वाली डिस्क को उनके UUIDs द्वारा VMWare वर्चुअल डिस्क के साथ मैन्युअल रूप से मिला सकते हैं।
यदि आपके पास VM के अतिथि OS में व्यवस्थापक अनुमतियाँ हैं, तो आप अधिक सुविधाजनक PowerShell स्क्रिप्ट का उपयोग करके Windows डिस्क और VMWare VMDK फ़ाइलों का मिलान कर सकते हैं। स्क्रिप्ट अतिथि विंडोज ओएस को नेटवर्क से जोड़ती है, इसके स्थानीय डिस्क के बारे में जानकारी एकत्र करती है और वीएमवेयर वीएमडीके के साथ उनका मिलान करती है।
यहां पावरशेल स्क्रिप्ट का पूरा कोड दिया गया है:
<पूर्व>आयात-मॉड्यूल VMware.VimAutomation.Core -ErrorAction SilentlyContinueconnect-viser ber-vmware1$vmName ="ber-man01"$WinHostName ="ber-mansrv01.woshub.com"#VMWare वर्चुअल मशीन के डिस्क की सूची प्राप्त करें $vmDisks =Get-VM -Name $vmName | Get-HardDisk $vmDatacenterView =Get-VM -Name $vmName | गेट-डेटासेंटर | Get-View $virtualDiskManager =Get-View -Id VirtualDiskManager-virtualDiskManager # अतिथि तक पहुँचने के लिए व्यवस्थापक क्रेडेंशियल दर्ज करें Windows$cred =if ($cred){$cred}else{Get-Credential} # Windows डिस्क की सूची प्राप्त करना और 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)'} " + "जहां AssocClass =Win32_DiskDriveToDiskPartition" Get-WmiObject -क्वेरी $पार्टिशन -ComputerName $WinHostName -क्रेडेंशियल $क्रेडिट| % { $partition =$_ $drives ="ASSOCIATORS OF" + "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'}" + "जहां AssocClass =Win32_LogicalDiskToPartition" Get-WmiObject -Query $drives -ComputerName $WinHostName -क्रेडेंशियल $क्रेडिट| % {नया-ऑब्जेक्ट-प्रकार PSCustomObject -प्रॉपर्टी @{ डिस्क =$disk.DeviceID DriveLetter =$_.DeviceID VolumeName =$_.VolumeName } } }} #प्रत्येक के लिए डिस्क क्रमांक प्राप्त करना ($winDisk में डिस्क) { $ डिस्क | जोड़ें-सदस्य-सदस्य प्रकार नोटप्रॉपर्टी-नाम AltSerialNumber-मान $null $diskSerialNumber =$disk.SerialNumber if ($disk.Model -notmatch 'VMware Virtual डिस्क SCSI डिस्क डिवाइस') { if ($diskSerialNumber -match '^\S{12 }$'){$diskSerialNumber =($diskSerialNumber | foreach {[byte[]]$bytes =$_.ToCharArray(); $bytes | foreach {$_.ToString('x2')} } ) -join '' } $disk.AltSerialNumber =$diskSerialNumber } } #सभी VM डिस्क की खोज करना और उनके SerialNumber / UUID$diskMaps =@() foreach ($vmDisk में $vmDisk) द्वारा Windows डिस्क के साथ उनका मिलान करना {$vmDiskUuid =$virtualDiskManager.queryvirt($vmDiskUuid =$virtualDiskManager.queryvirt($vmDiskUuid) vmDisk.Filename, $vmDatacenterView.MoRef) | foreach {$_.replace(' ','').replace('-','')} $windowsDisk =$winDisk | जहां {$_.SerialNumber -eq $vmDiskUuid} अगर (-नहीं $windowsDisk){$windowsDisk =$winDisk | जहां {$_.AltSerialNumber -eq $vmDisk.ScsiCanonicalName.substring(12,24)}} $curDiskMap ="" | vmDiskDatastore, vmDiskVmdk, vmDiskName, windowsDiskIndex, vmDiskUuid, windowsDeviceID, ड्राइव, वॉल्यूम का चयन करें $curDiskMap.vmDiskDatastore =$vmDisk.filename.split(']')[0].split('[')[1] $curDiskMap.vm $vmDisk.filename.split(']')[1].trim() $curDiskMap.vmDiskName =$vmDisk.Name $curDiskMap.windowsDiskIndex =if ($windowsDisk){$windowsDisk.Index}else{"मिलान में विफल" } $curDiskMap.vmDiskUuid =$vmDiskUuid $curDiskMap.windowsDeviceID =if ($windowsDisk){$windowsDisk.DeviceID}else{"FAILED TO MATCH"} $driveVolumes =$diskToDriveVolume | जहां {$_.Disk -eq $windowsDisk.DeviceID} $curDiskMap.drives =$driveVolumes.DriveLetter $curDiskMap.volumes =$driveVolumes.VolumeName $diskMaps +=$curDiskMap} $diskMaps =$diskMaps | सॉर्ट {[int]$_.vmDiskName.split(' ')[2]} $diskMaps | फीटस्क्रिप्ट विंडोज़ में ड्राइव अक्षर और वॉल्यूम लेबल के बारे में भी जानकारी देता है।
अब आप आसानी से पता लगा सकते हैं कि विंडोज डिस्क दी गई वर्चुअल vmdk डिस्क से क्या मेल खाती है।
यदि विंडोज़ में वर्चुअल डिस्क को माउंट पॉइंट के माध्यम से जोड़ा जाता है, तो आउटपुट में निर्दिष्ट ड्राइव अक्षर और वॉल्यूम लेबल के बारे में कोई जानकारी नहीं होगी।