একটি VMWare ভার্চুয়াল মেশিনের ডিস্কের আকার প্রসারিত করার সময় বা একটি ডিস্ক মুছে ফেলার সময়, কখনও কখনও এটি বোঝা কঠিন যে কোন VMware ভার্চুয়াল ডিস্কটি নির্দিষ্ট Windows VM ডিস্কের সাথে মেলে। যদি কয়েকটি ডিস্ক থাকে এবং সেগুলি তাদের আকারের দ্বারা পৃথক হয় তবে আপনার প্রয়োজনীয় ডিস্কটি খুঁজে পাওয়া সহজ। কিন্তু একটি VM-এর জন্য একই আকারের একাধিক VMDK (বা RDM) ডিস্ক বা একাধিক ভার্চুয়াল SCSI কন্ট্রোলার তৈরি করা হলে কী করবেন? কীভাবে ত্রুটিগুলি এড়ানো যায় এবং উইন্ডোজ অ্যাডমিনিস্ট্রেটর আপনাকে প্রসারিত (বা সঙ্কুচিত) করতে বলে সেই ডিস্কটি নির্বাচন করবেন?
এই নিবন্ধে আমরা দেখব কিভাবে একটি VMWare VM-এ উইন্ডোজ ডিস্ক এবং ভার্চুয়াল ডিস্ক (VMDK) মিলানো যায়।
Windows এবং VMWare-এ SCSI ডিভাইস নম্বর কিভাবে পেতে হয়?
ডিস্ক ম্যানেজমেন্ট কনসোল খুলুন (diskmgmt.msc
) উইন্ডোজে (আমাদের উদাহরণে, এটি উইন্ডোজ সার্ভার 2016)। SCSI কন্ট্রোলারের নাম এবং SCSI ডিভাইস নম্বর ডিস্কের তালিকায় প্রদর্শিত হয় না। SCSI ডিভাইস নম্বর পেতে, একটি ডিস্কে ডান-ক্লিক করুন এবং বৈশিষ্ট্য নির্বাচন করুন . আপনি দেখতে পাচ্ছেন, VMWare ভার্চুয়াল ডিস্ক SCSI ডিস্ক ডিভাইসের জন্য ডিভাইস পোর্ট সম্পর্কে তথ্য অবস্থান-এ দেখানো হয়েছে সাধারণ এর ক্ষেত্র ট্যাব।
- অবস্থান 160 =SCSI বাস কন্ট্রোলার 0
- টার্গেট আইডি 1 =ডিভাইস SCSI আইডি হল 1
আপনি যে ডেটা দেখেন তাতে যোগ দিন এবং SCSI ডিস্ক ঠিকানা পান:SCSI(0:1)।
তারপর আপনার VMWare vSphere ক্লায়েন্টে ভার্চুয়াল মেশিনের বৈশিষ্ট্যগুলি খুলুন। আপনি যে আইডি পেয়েছেন সেই ডিস্কের ভার্চুয়াল ডিভাইস নোড নম্বরটি খুঁজুন। আমাদের উদাহরণে, এটি হল SCSI(0:1) হার্ড ডিস্ক 2.
যদি একটি ভার্চুয়াল মেশিনে বিভিন্ন SCSI কন্ট্রোলার সহ একাধিক ভার্চুয়াল ডিস্ক কনফিগার করা থাকে (আপনি একটি ভার্চুয়াল মেশিনে 16টি ডিস্ক সহ 4টি পর্যন্ত SCSI কন্ট্রোলার যোগ করতে পারেন), ম্যানুয়ালি একটি SCSI ডিভাইস নম্বর খুঁজে পাওয়া বেশ চ্যালেঞ্জিং। এছাড়াও অনুগ্রহ করে মনে রাখবেন যে Windows এবং VMWare-এ SCSI কন্ট্রোলার নম্বর আলাদা হতে পারে।
পাওয়ারশেল ব্যবহার করে UUID/সিরিয়াল নম্বর দ্বারা VMDK-এর সাথে উইন্ডোজ ডিস্কের সাথে কীভাবে মিল করবেন?
ভিএমওয়্যার ভার্চুয়াল ডিস্ককে গেস্ট ভিএম-এর ভিতরের ডিস্কে ম্যাপ করার আরেকটি উপায় হল তাদের অনন্য ডিস্ক আইডি তুলনা করা। VMWare-এ এই বৈশিষ্ট্যটিকে বলা হয় UUID (অনন্য আইডি), এবং উইন্ডোজে – একটি ক্রমিক নম্বর . আসুন দেখি কিভাবে PowerShell ব্যবহার করে ভার্চুয়াল ডিস্কের UUID এবং সিরিয়াল নম্বর পেতে হয়।
ডিফল্টরূপে, সমস্ত VMWare VM-এ ডিস্ক থাকেEnableUUID=TRUE
প্যারামিটার সক্রিয়। এর মানে হল যে একটি গেস্ট OS অবশ্যই ভার্চুয়াল ডিস্ক আইডি দেখতে হবে। উইন্ডোজে ডিস্ক সম্পর্কে তথ্য পেতে, আপনি স্টোরেজ মডিউল cmdlets বা WMI প্রশ্ন ব্যবহার করতে পারেন। যেহেতু আমাদের কাছে এখনও উইন্ডোজ সার্ভার 2008 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
আমাদের উদাহরণে, উইন্ডোজ তিনটি ডিস্ক সনাক্ত করেছে:
- ফিজিকালড্রাইভ0:SCSI পোর্ট 0, SCSI টার্গেট 0, সিরিয়াল 6000c2939b157427dadbace321ed4973
- ফিজিকালড্রাইভ1:SCSI পোর্ট 0, SCSI টার্গেট 1, সিরিয়াল 6000c2950ee961954909938642bb03b4
- ফিজিকালড্রাইভ1:SCSI পোর্ট 4, SCSI টার্গেট 10, সিরিয়াল 6000c2995fc3c4928d6650596bb02cef
তাহলে আসুন 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 থাকতে হবে।
তারপরে আপনি গেস্ট উইন্ডোজ ওএস-এ যে ডিস্কগুলি দেখেন সেগুলিকে আপনি তাদের UUID দ্বারা VMWare ভার্চুয়াল ডিস্কগুলির সাথে ম্যানুয়ালি মেলাতে পারেন৷
আপনার যদি VM-এর গেস্ট OS-এ প্রশাসকের অনুমতি থাকে, তাহলে আপনি আরও সুবিধাজনক PowerShell স্ক্রিপ্ট ব্যবহার করে Windows ডিস্ক এবং VMWare VMDK ফাইলগুলিকে মেলাতে পারেন৷ স্ক্রিপ্টটি গেস্ট উইন্ডোজ ওএসকে নেটওয়ার্কের মাধ্যমে সংযুক্ত করে, এর স্থানীয় ডিস্ক সম্পর্কে তথ্য সংগ্রহ করে এবং তাদের VMWare VMDK-এর সাথে মেলে।
এখানে পাওয়ারশেল স্ক্রিপ্টের সম্পূর্ণ কোড রয়েছে:
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
এছাড়াও স্ক্রিপ্টটি উইন্ডোজে ড্রাইভ অক্ষর এবং ভলিউম লেবেল সম্পর্কে তথ্য প্রদান করে।
প্রদত্ত ভার্চুয়াল vmdk ডিস্কের সাথে উইন্ডোজ ডিস্ক কী মেলে তা এখন আপনি সহজেই খুঁজে পেতে পারেন৷
৷ যদি উইন্ডোজের ভার্চুয়াল ডিস্কগুলি মাউন্ট পয়েন্টের মাধ্যমে সংযুক্ত থাকে, তাহলে আউটপুটে নির্ধারিত ড্রাইভ অক্ষর এবং ভলিউম লেবেল সম্পর্কে কোনও তথ্য থাকবে না৷