13 Replies Latest reply on Feb 20, 2019 7:19 AM by LucD

    How to find Base/original disk of VM which is running from snapshot?

    RR9 Enthusiast

      in our backup solution..

      1. client VM's snapshot will be taken and VM's base disk will be attached to backup proxy nodes.

       

      After backup completes VM's base disk will be detached from backup proxy nodes..but sometime base disk remains in backup proxy nodes.

       

      so i am looking for script where i want to find base/original disks of $vm and compare it with $backupnode and remove that disk from virtual machine $backupnode.

      But problem here is $vm has snapshot and i am not able to get the base/original hard disk name... could someone help me on this?

       

       

      $vm="abc"

      $backupnode="xyz"

       

      regards,

      Ranjit

        • 1. Re: How to find Base/original disk of VM which is running from snapshot?
          LucD Guru
          vExpertUser ModeratorsCommunity Warriors

          This should list the harddisks that do not belong to the backup VM.

           

          $backupVM = "backupVM"

          $vm = Get-VM -Name $backupVM
          $vm.ExtensionData.Layout.Disk | %{
           
          $_.DiskFile | where {$_ -notmatch $backupVM}
          }
          Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz
          1 person found this helpful
          • 2. Re: How to find Base/original disk of VM which is running from snapshot?
            RR9 Enthusiast

            LucD ..thanks a lot for your reply..i was struggling for this to work....

             

             

            $bkpserver="xyz"------------this is my backup proxy node

            $backupclient = "abc" ----- VM whose backup is completed. It is running from snapshot and its base disk is still attached in "xyz" ---NOW --I want to remove these base disks of "abc" from "xyz"

             

            ----------------------------------------------------------------------------------

            $bkpserver="xyz"

            $backupclient = "abc"

             

            $vm = Get-VM -Name $bkpserver

            $a = $vm.ExtensionData.Layout.Disk | %{

              $_.DiskFile | where {$_ -match $backupclient}

            }

             

            ----------------------------------------------------------------------------------

            with above code i am getting list of disks need to be removed from "xyz" but if i use  "$a | Remove-HardDisk -Confirm:$false" in above code it returns below error...

             

            Remove-HardDisk : The input object cannot be bound to any parameters for the co

            mmand either because the command does not take pipeline input or the input and

            its properties do not match any of the parameters that take pipeline input.

            • 3. Re: How to find Base/original disk of VM which is running from snapshot?
              LucD Guru
              vExpertUser ModeratorsCommunity Warriors

              The Remove-Harddisk cmdlet requires a Harddisk object as input.

              Try it like this

               

              $bkpserver="xyz"
              $backupclient = "abc"


              Get-VM -Name $bkpserver | Get-HardDisk |
              where {$_.Filename -match $backupclient } |
              Remove-HardDisk -Confirm:$false
              Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz
              1 person found this helpful
              • 4. Re: How to find Base/original disk of VM which is running from snapshot?
                RR9 Enthusiast

                thanks for your help... worked... thanks again...

                 

                current code..

                 

                $bkpserver="xyz"

                $backupclient = Get-VM | where {$_.ExtensionData.Runtime.consolidationNeeded}

                 

                $vm = Get-VM -Name $bkpserver

                Get-VM -Name $bkpserver | Get-HardDisk |

                where {$_.Filename -match $backupclient } |

                Remove-HardDisk -Confirm:$false

                 

                 

                Get-VM |

                Where-Object {$_.Extensiondata.Runtime.ConsolidationNeeded} |

                ForEach-Object {

                  $_.ExtensionData.ConsolidateVMDisks()

                }

                • 5. Re: How to find Base/original disk of VM which is running from snapshot?
                  RR9 Enthusiast

                  Hi LucD,

                   

                  i am following resolution in KB... http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2033537

                   

                  current code..

                  ---------------------- ------------------------------

                  $bkpserver=get-vm Test**

                  $backupclient = Get-VM | where {$_.ExtensionData.Runtime.consolidationNeeded}

                   

                  Get-VM -Name $bkpserver | Get-HardDisk |

                  where {$_.Filename -match $backupclient } |

                  Remove-HardDisk -Confirm:$false

                   

                  Get-VM |

                  Where-Object {$_.Extensiondata.Runtime.ConsolidationNeeded} |

                  ForEach-Object {

                    $_.ExtensionData.ConsolidateVMDisks()

                  }

                   

                  ---------------------- ------------------------------

                  Note:--

                  $bkpserver will be multiple VMs and base/original disks of $backupclient VMs could be attached to any of the $bkpserver

                  $backupclient can be multiple VMs and these VMs are running from snapshot

                   

                   

                  IN my current code

                  Get-VM -Name $bkpserver | Get-HardDisk |

                  where {$_.Filename -match $backupclient }

                   

                  this doesn't return any list of disk...

                  • 6. Re: How to find Base/original disk of VM which is running from snapshot?
                    LucD Guru
                    Community WarriorsUser ModeratorsvExpert

                    Isn't that because you only look at VMs that need consolidation ?

                    A VM that has a harddisk mounted on the backup server will not automatically need consolidation afaik.

                    Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz
                    • 7. Re: How to find Base/original disk of VM which is running from snapshot?
                      RR9 Enthusiast

                      I had checked manually ... $backupclient = i was having 4 VMs which needed consolidation.These 4 VMs were running from snapshot disks (-0000**.vmdk)  and these 4 VMs base disks were mounted on VMs in $bkpserver .

                       

                      Note:-

                      If i run $backupclient | get-harddisk ..then it returns -0000**.vmdk disks

                       

                      In script ..i want check base disks of VMs in $backupclient which are attached to $bkpserver and then remove these base disks

                      • 8. Re: How to find Base/original disk of VM which is running from snapshot?
                        LucD Guru
                        Community WarriorsUser ModeratorsvExpert

                        On the client you will indeed see the snapshot for its harddisks.

                        You should check on the $bkpserver if any of these is mounted.

                        Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz
                        • 9. Re: How to find Base/original disk of VM which is running from snapshot?
                          RR9 Enthusiast

                          backup nodes remove client snapshots..but $backupclient | get-snapshots is null as snapshots are removed but $backupclient vms continue to run from snapshot disks (-000001.vmdk)

                           

                          base/original disks of $backupclient remain mounted on $bkpserver vms

                           

                          so we want to compare disks of $backclient to $bkpserver

                          $backupclient disks are like datastore/test-000001.vmdk

                           

                          $bkpserver disks are like datastore/test.vmdk

                           

                          here how to compare,list and remove these base disks from $bkpserver using powercli

                           

                          we want to compare actual filenames so that there should not be any errors... please suggest if have any solution or workaround to this issue.

                          • 10. Re: How to find Base/original disk of VM which is running from snapshot?
                            RR9 Enthusiast

                            script is completed to perform steps described in KB ...  kb.vmware.com/kb/2033537

                            ...Luc thanks for your help.

                             

                            if anyone find any error ,please highlight

                             

                            Script does following tasks:-

                            1. Connect to vCenter server

                            2. get list of VMs which need consolidation

                            3. Find datastore folder path of ncvm

                            4. Find datastore name of ncvm

                            5. Find VMDK filenames of ncvm from /datastore/folder

                            6. Find leftover disks on backup proxy nodes

                            7. Remove leftover disks from backup proxy nodes

                            8. Consolidate VMs

                            9. Disconnect VIserver

                            10. send mail

                             

                            ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                            #################################################### Start ########################################

                            add-pssnapin VMware.VimAutomation.Core

                             

                            $vcenter1 = ""

                             

                             

                            #######################################backup server proxy nodes VM names are starting from "test" e.g. test01 , test02################

                            $bkpserver = get-vm test*

                             

                             

                            Connect-VIServer -Server $vcenter1

                             

                            #############

                            # Variables #

                            #############

                            $date=(get-date).ToString('dd-MM-yyyy')

                             

                             

                            $MH = @"

                            <style>

                            TABLE {border-width: 1px;border-style: solid;border-color: black;}

                            TH {border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color: Gold;}

                            TD {border-width: 1px;padding: 3px;border-style: solid;border-color: black;}

                            </style>

                            "@

                             

                             

                            ##################

                            # Mail variables #

                            ##################

                            $enablemail="yes"

                            $smtpServer = ""

                            $mailfrom = ""

                            $mailto = ""

                            ##############################################script start##########################################

                             

                             

                            #######################get list of VMs which need consolidation#####################################

                             

                            $ncvms = get-vm | where {$_.ExtensionData.Runtime.consolidationNeeded}

                            $ncvmsnames= $ncvms | select Name

                            $ncvmsnameshtml= $ncvmsnames | ConvertTo-Html –title "$vcenter1 VMs needed consolidation" –body "<H2>$vcenter1 VMs needed consolidation</H2>" -head $MH

                             

                            if ($ncvms -ne $null)

                             

                            {

                            #######################################Find datastore folder path of ncvms##########################

                            foreach ($ncvm in ($ncvms))

                             

                            {

                             

                            $ncvmdisks = get-vm $ncvm | get-harddisk

                            $ncvmdisksoutstr = $ncvmdisks | select Filename |Out-String

                             

                             

                             

                            $c= $ncvmdisksoutstr.Substring($ncvmdisksoutstr.LastIndexOf('--------')+8)

                            $pos = $c.IndexOf("/")

                            $leftPart = $c.Substring(0, $pos+1)

                            $rightPart = $c.Substring($pos+1)

                            $dspath=$leftPart.trimstart()

                             

                            #######################################Find datastore name path of ncvms##########################

                            $vmdisk = Get-VM $ncvm | Get-harddisk

                            $vmdiskDatastores=($vmdisk | %{$_.Filename.Split('[]')[1]})

                            #$vmdiskfilename=($vmdisk | %{$_.Filename.Split('[]')[2]})

                             

                            #######################################Find VMDK filenames of ncvms###############################

                             

                            $ncvmdsdiskfiles=foreach ($vmdiskDatastore in ($vmdiskDatastores)) {Get-HardDisk -Datastore $vmdiskDatastore -DatastorePath $dspath}

                             

                            #######################################Find leftover disks on backup proxy nodes##################

                            $leftoverdisks += foreach ($ncvmdsdiskfile in ($ncvmdsdiskfiles))

                            {

                            $bkpserver| get-harddisk |sort |where{ ForEach-Object{$_.Filename -eq $ncvmdsdiskfile.Filename} }

                             

                             

                            }

                             

                            }

                             

                            }

                             

                            #######################################Remove leftover disks from backup proxy nodes##############

                             

                            $leftoverdisktable = $leftoverdisks | select Parent,Filename,Name

                            $leftoverdisktablehtml = $leftoverdisktable | ConvertTo-Html –title "$vcenter1 VADP leftover disks details" –body "<H2>$vcenter1 VADP leftover disks details.</H2>" -head $MH

                            $leftoverdisks | remove-harddisk -Confirm:$false

                             

                            #################################################### Consolidate VMs  ##########################

                             

                            Get-VM $ncvms |

                            ForEach-Object {

                              $_.ExtensionData.ConsolidateVMDisks()

                            }

                             

                            #################################################### Disconnect VIserver##########################

                            disconnect-viserver $vcenter1 -force -confirm:$false

                             

                             

                             

                             

                            ######################

                            # E-mail HTML output #

                            ######################

                             

                            if ($enablemail -match "yes")

                            {

                            $msg = new-object Net.Mail.MailMessage

                             

                            #$att = new-object Net.Mail.Attachment($filelocation)

                             

                             

                            $smtp = new-object Net.Mail.SmtpClient($smtpServer)

                            $msg.From = $mailfrom

                            $msg.To.Add($mailto)

                            $msg.Subject = “VADP leftover Disk removal & Consolidation Report”

                            $msg.IsBodyHTML = $true

                            $msg.Body = $ncvmsnameshtml

                            $msg.Body +=$leftoverdisktablehtml

                             

                             

                            #$msg.Attachments.Add($att)

                            #$msg.Attachments.Add($att1)

                             

                            $smtp.Send($msg)

                            }

                             

                             

                            #################################################### End ########################################

                            ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                            • 11. Re: How to find Base/original disk of VM which is running from snapshot?
                              Bunty11 Enthusiast

                              We get this error

                               

                              Remove-HardDisk : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

                              • 12. Re: How to find Base/original disk of VM which is running from snapshot?
                                Bunty11 Enthusiast

                                Remove-HardDisk : Cannot bind parameter 'HardDisk'. Cannot convert the "[XXX] XX.XX.XX/XX.XX.XX.vmdk" value of type

                                "System.String" to type "VMware.VimAutomation.ViCore.Types.V1.VirtualDevice.HardDisk".

                                • 13. Re: How to find Base/original disk of VM which is running from snapshot?
                                  LucD Guru
                                  Community WarriorsvExpertUser Moderators

                                  Not sure what you trying to do, but the filenames that are returned are just the VMDK files that are not attached to a VM.

                                  Meaning the Get-HardDisk cmdlet will not be able to find them this way.

                                  Same goes for the Remove-HardDisk.

                                   

                                  If you want to remove orphaned disk files, you might want to take a look at my Orphaned Files And Folders – Spring Cleaning post.

                                  That function also has the option to remove the orphaned files.

                                  Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz