PowerCLI: Check Partition Alignment (Windows VMs Only)


image

Some time ago I  already created a script to report the disk alignment status of your Windows VM’s. I updated the script so you are able to export it to a CSV or XML file.

$myCol = @()
$vms = get-vm | where {$_.PowerState -eq "PoweredOn" -and `
$_.Guest.OSFullName -match "Microsoft Windows*" } | Sort Name 

foreach($vm in $vms){
$wmi = get-wmiobject -class "Win32_DiskPartition" `
-namespace "root\CIMV2" -ComputerName $vm            

    foreach ($objItem in $wmi){
        $Details = "" | Select-Object VMName, Partition, Status        
            if ($objItem.StartingOffset -eq "65536"){
                $Details.VMName = $objItem.SystemName
                   $Details.Partition = $objItem.Name
                $Details.Status = "Partition aligned"
            }
            else{
                $Details.VMName = $objItem.SystemName
                   $Details.Partition = $objItem.Name
                $Details.Status = "Partition NOT aligned"                    
            }
    $myCol += $Details
    }
}
$myCol | Export-Csv -NoTypeInformation "C:\Temp\PartitionAlignment.csv"
#$myCol | Export-Clixml "C:\Temp\PartitionAlignment.xml"


The script uses WMI to gather the information about the partition of the Windows VM. So if you’re using a Firewall, be sure to open the right ports. More info about WMI and Firewalls, can be found over here: http://msdn.microsoft.com/en-us/library/aa822854%28VS.85%29.aspx

The output will look like this:

image

Advertisements

11 thoughts on “PowerCLI: Check Partition Alignment (Windows VMs Only)

  1. Pingback: Tweets die vermelden PowerCLI: Check Partition Alignment (Windows VMs Only) « ICT-Freak.nl -- Topsy.com

  2. Pingback: uberVU - social comments

  3. Vincent

    The fact that a partion doesn’t start at offset 65536 doesn’t mean it is not aligned. Windows 2008 leaves the fist megabyte of the disk unused. This is still an aligned situation although your script will say it’s not. To really make sure a disk is aligned use the instruction from the following article: http://msdn.microsoft.com/en-us/library/dd758814.aspx

    In short: Issue the following command on the client:
    wmic partition get BlockSize, StartingOffset, Name, Index
    and then
    fsutil fsinfo ntfsinfo c:
    you can use any other drive letter ofcourse.

    Divide the StartingOffset from the first command with the “Bytes Per Cluster” from the second command. If the outcome is a integer then the disk is aligned.

    This should all be doable with scripting of course.

    Reply
  4. Pingback: Virtualization Short Take #34 - blog.scottlowe.org - The weblog of an IT pro specializing in virtualization, storage, and servers

  5. NotoriousBDG

    The starting offset does not have to be 65536, but it should be divisible by 65536. If you change your if statement to use mod, it will be more accurate.

    if (($Partition.StartingOffset % 65536) -eq 0) {
    $Details.VMName = $objItem.SystemName
    $Details.Partition = $objItem.Name
    $Details.Status = “Partition aligned”
    }

    Reply
    1. Wayne

      No, it should be divisible by 8192. See the $.01 best practices guide:
      http://www.vmware.com/pdf/Perf_Best_Practices_vSphere4.0.pdf

      “The alignment of your file system partitions can impact performance. VMware makes the following
      recommendations for VMFS partitions:
      * Like other disk-based file systems, VMFS suffers a penalty when the partition is unaligned. Using the
      vSphere Client to create VMFS partitions avoids this problem since it automatically aligns the
      partitions along the 64KB boundary.
      * To manually align your VMFS partitions, check your storage vendor’s recommendations for the
      partition starting block. If your storage vendor makes no specific recommendation, use a starting
      block that is a multiple of 8KB.”

    2. Ryan

      I went with if (($partition.startingoffset % 65536) -isnot [decimal]){} .. dividing your offset by 64KB, as long as it’s a whole number is aligned per a number of documents I went off of.

      In your example, startingoffset % 65536 will not always equal zero, for example windows server 2008 aligns at 1024KB (1MB).. or offset 1048576 so yours would = 16.. which is not zero so it would fail as not aligned.

  6. Pingback: PowerCLI - Windows VM Partition Alignment | Alex Feigenson's Blog

  7. Alex Feigenson

    Thanks for the script, I modified it slightly and posted it on my blog – just a quick elseif for another alignment size.

    I spent a good awhile reading your whole site, and I learned a great deal about powercli – many thanks!

    Reply
  8. Daniel M (@dmVI)

    Do you know if the WMI call captures info for Dynamic Disks correctly? According to an MS Technet article, WMI calls done locally (using the wmic command) don’t return Dynamic Disk information “reliably.” Not sure if the WMI call done remotely (leveraging PowerCLI as per your article) is any different. As per the MS article:

    Important: Neither the output of the wmic command listed earlier nor any other tool designed only for basic disks reliably reports starting partition offsets of Windows dynamic disks.

    Article located at URL http://msdn.microsoft.com/en-us/library/dd758814.aspx

    Reply
  9. Michael Ryom

    Inspiret by your script I made one which takes the raid systems block size into account, and check if the disk is aligned to that… Fx windows 2008 has a disk offset of 1048576 which in the above scripts would show the disk as unaligned:

    $vms = get-vm
    $winvms = $vmsview | where {$_.Config.GuestId -match “win”}

    Foreach($winvm in $winvms){$raidblocksize = 64; $wmivm = get-wmiobject -class “Win32_DiskPartition” -namespace “root\CIMV2” -ComputerName $winvm.name; if($?){Foreach($obj in $wmivm){$a = $obj.StartingOffset/$obj.BlockSize/$raidblocksize; if($a % 2 -eq “0”){$a = “$True”}else{$a = “$false”}$winvm.name, $obj.Name, $a}}}

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s