VMware ভার্চুয়াল মেশিনের ডিস্ক আকার বাড়ানোর সময় বা ডিস্ক মুছে ফেলার সময়, কোন VMware ভার্চুয়াল ডিস্ক নির্দিষ্ট Windows VM ডিস্কের সাথে মিলে তা বুঝতে কঠিন হতে পারে। ডিস্ক কম থাকলে এবং আকার ভিন্ন থাকলে সহজে খুঁজে পাওয়া যায়। কিন্তু একই আকারের একাধিক VMDK (বা RDM) ডিস্ক বা একাধিক ভার্চুয়াল SCSI কন্ট্রোলার থাকলে কী করবেন? Windows অ্যাডমিনISTRATOR যে ডিস্ক বাড়াতে (বা ছোট করতে) বলে, সেটি কীভাবে নিশ্চিতভাবে নির্বাচন করবেন?
Windows এবং VMware-এ SCSI ডিভাইস নম্বর কীভাবে পাবেন?
Windows-এ Disk Management কনসোল (diskmgmt.msc) খুলুন (এখানে Windows Server 2016 উদাহরণ হিসেবে নেওয়া হয়েছে)। ডিস্কের তালিকায় SCSI কন্ট্রোলারের নাম এবং SCSI ডিভাইস নম্বর দেখা যায় না। SCSI ডিভাইস নম্বর পেতে ডিস্কে রাইট-ক্লিক করে Properties নির্বাচন করুন। General ট্যাবের Location ফিল্ডে VMware Virtual disk SCSI Disk Device-এর ডিভাইস পোর্ট সম্পর্কিত তথ্য দেখতে পাবেন।
- Location 160 = SCSI Bus Controller 0
- Target ID 1 = ডিভাইসের SCSI ID হল 1
তথ্যগুলো যাগ করলে SCSI ডিস্কের ঠিকানা পাবেন: SCSI(0:1)।

এরপর VMware vSphere Client-এ ভার্চুয়াল মেশিনের প্রপার্টিজ খুলুন। আপনি যে ID পেয়েছেন, সেই Virtual Device Node নম্বরের সাথে মিলে যাওয়া ডিস্কটি খুঁজুন। উদাহরণে এটি SCSI(0:1) Hard Disk 2।

যদি একাধিক ভার্চুয়াল ডিস্ক বিভিন্ন SCSI কন্ট্রোলারের সাথে কনফিগার করা থাকে (একটি VM-এ সর্বোচ্চ ৪টি SCSI কন্ট্রোলার এবং প্রতিটি-এ ১৬টি ডিস্ক যোগ করা যায়), তবে ম্যানুয়ালি SCSI ডিভাইস নম্বর খুঁজে বের করা চ্যালেঞ্জিং হয়। মনে রাখবেন, Windows এবং VMware-এ SCSI কন্ট্রোলার নম্বর ভিন্ন হতে পারে।
PowerShell ব্যবহার করে UUID/Serial Number দিয়ে Windows ডিস্ককে VMDK-এর সাথে মিলিয়ে চিনুন
VMware ভার্চুয়াল ডিস্ককে গেস্ট VM-এর ভেতরের ডিস্কের সাথে ম্যাপ করার আরেকটি পদ্ধতি হল তাদের ইউনিক ডিস্ক ID তুলনা করা। VMware-এ এটি UUID (Unique ID) বলা হয়, আর Windows-এ Serial Number। PowerShell ব্যবহার করে ভার্চুয়াল ডিস্কের UUID এবং Serial Number কীভাবে পেতে হয় তা দেখানো হলো।
ডিফল্টভাবে সব VMware VM-এ EnableUUID=TRUE প্যারামিটার সক্রিয় থাকে। এর মানে গেস্ট OS ভার্চুয়াল ডিস্কের ID দেখতে পাবে।
Windows-এ ডিস্কের তথ্য পেতে Storage মডিউলের cmdlets বা WMI কুয়েরি ব্যবহার করা যায়। যেহেতু এখনও কিছু VM Windows Server 2008 R2-এ চলে যেটিতে Storage মডিউল নেই, আমরা 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
উদাহরণে Windows তিনটি ডিস্ক সনাক্ত করেছে:
- PHYSICALDRIVE0: SCSI Port 0, SCSI Target 0, Serial 6000c2939b157427dadbace321ed4973
- PHYSICALDRIVE1: SCSI Port 0, SCSI Target 1, Serial 6000c2950ee961954909938642bb03b4
- PHYSICALDRIVE1: SCSI Port 4, SCSI Target 10, Serial 6000c2995fc3c4928d6650596bb02cef

এখন VMware ভার্চুয়াল মেশিনের সেটিংসে নির্দিষ্ট ডিস্কগুলির SCSI কন্ট্রোলার নম্বর এবং UUID পেতে 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-এর ডিস্কের তালিকা আনবে। ফলাফলে DataStore নাম, VMDK ফাইল পাথ, ডিস্ক নম্বর, ডিস্ক আকার এবং UUID থাকবে।

এরপর গেস্ট Windows OS-এ 보이는 ডিস্কগুলোকে VMware ভার্চুয়াল ডিস্কের সাথে UUID দিয়ে ম্যানুয়ালি মিলিয়ে চিনতে পারবেন।
যদি VM-এর গেস্ট OS-এ অ্যাডমিনিস্ট্রেটর অনুমতি থাকে, তবে নেটওয়ার্কের মাধ্যমে গেস্ট Windows OS-এ সংযোগ করে তার লোকাল ডিস্কের তথ্য সংগ্রহ করে VMware VMDK-এর সাথে ম্যাপ করার আরেকটি সুবিধাজনক PowerShell স্ক্রিপ্ট ব্যবহার করা যায়।
PowerShell স্ক্রিপ্টের সম্পূর্ণ কোড নিচে দেওয়া হলো:
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
এই স্ক্রিপ্টটি Windows-এ ড্রাইভ লেটার এবং ভলিউম লেবেল সম্পর্কিত তথ্যও ফেরত দেয়।

এখন আপনি সহজেই বের করতে পারবেন কোন Windows ডিস্ক দেওয়া ভার্চুয়াল vmdk ডিস্কের সাথে মিলে যাচ্ছে।
যদি Windows-এ ভার্চুয়াল ডিস্ক মাউন্ট পয়েন্টের মাধ্যমে সংযুক্ত থাকে, তবে আউটপুটে ড্রাইভ লেটার এবং ভলিউম লেবেল সম্পর্কিত তথ্য থাকবে না।