none
Automatisiertes Klonen verschiedener VMs unter Hyper-V mit Powershell im laufenden Betrieb möglich? RRS feed

  • Frage

  • Hallo Zusammen,

    besteht die Möglichkeit, virtuelle Maschinen, welche auf einem Windows Server 2008 R2 / Windows Server 2012 / Windows 8 Pro betrieben werden, im laufenden Betrieb per Powershell zu klonen? Bisher habe ich keine Lösung diesbezüglich gefunden. Auf den VMs laufen verschiedene Linux Distributionen und Windows Server Versionen.

    Im Bereich Powershell bin ich noch recht neu, daher bitte ich um Nachsicht bei meiner Frage.

    Viele Grüße


    Dienstag, 24. September 2013 08:13

Antworten

  • Hallo Rene,

    dazu gibt es ein Technet-Video auf Youtube.

    http://www.youtube.com/watch?v=PGUecLd0EV8

    Die Sprecher sind Bernhard Frank (blogs.technet.com/bernhard_frank) und Carsten Rachfahl (hyper-v-server.de)
    Das Script findest du im Anhang:

    <#
    .Synopsis
       Function to clone a running VM
    .DESCRIPTION
       This function can be used to clone a running vm and connect the copied vhd´s and network
    .EXAMPLE
       Clone-VM -VMName vmdisktest -VMCloneName vmdisktest-clone -Path c:\VMs
    .EXAMPLE
       Clone-VM -VMName vmdisktest -VMCloneName vmdisktest-clone -Path c:\VMs -Switch Private
    .Notes
    Author: Niklas Akerlund
    Date: 2012-06-19
    #>
    function Clone-VM
    {
        [CmdletBinding()]
        [OutputType([int])]
        Param
        (
            # Name of the VM to be cloned
            [Parameter(Mandatory=$true,
                       ValueFromPipelineByPropertyName=$true,
                       Position=0)]
            $VMName,
            [string] $VMCloneName,
            # Where to store the VM-clone 
            [string] $Path,
            # Set to another network switch
            [string] $Switch = " "    
        )
    
        # Get VM
        $VM = Get-VM $VMName
        $VHDs = Get-VMHardDiskDrive -VM $VM
        #$VHDPath = (Get-VMHardDiskDrive -VM $VM).Path
        $VHDClonePath = "$Path\$VMCloneName\Virtual Hard Disks\"
        
        # Create a new array of VHD info
        $VHDOrg = @()
        foreach ($VHD in $VHDs){
            $data = New-Object PSObject -property @{
                VHDName = (Get-Item $VHD.Path).Name
                VHDPath = $VHD.Path
                ControllerType = $VHD.ControllerType
                ControllerNumber = $VHD.ControllerNumber
                ControllerLocation = $VHD.ControllerLocation
    
            }
            $VHDOrg +=$data
        }
    
        $VMNics = Get-VMNetworkAdapter -VM $VM
    
        # Take snapshot 
        $VM | Checkpoint-VM 
    
        New-Item -ItemType directory -Path $VHDClonePath
    
        New-VM -Name $VMCloneName -Path $Path -NoVHD -MemoryStartupBytes $VM.MemoryStartup -BootDevice IDE
        $VMClone = Get-VM -Name $VMCloneName
        Get-VMNetworkAdapter -VMName $VMCloneName | Remove-VMNetworkAdapter
       
        # Configure VM-Clon
        if ($VM.DynamicMemoryEnabled){
            Set-VM -VMName $VMCloneName -ProcessorCount $VM.ProcessorCount -DynamicMemory -MemoryMinimumBytes $VM.MemoryMinimum -MemoryMaximumBytes $VM.MemoryMaximum
        }else{
            Set-VM -VMName $VMCloneName -ProcessorCount $VM.ProcessorCount -StaticMemory
        }
    
        # Add all network cards
        foreach ($VMNic in $VMNics){
            if ($Switch -eq " "){
                Add-VMNetworkAdapter -VMName $VMCloneName -SwitchName $VMNic.SwitchName -IsLegacy $VMNic.IsLegacy
            }else{
                Add-VMNetworkAdapter -VMName $VMCloneName -SwitchName $Switch -IsLegacy $VMNic.IsLegacy
            }
        }
    
        # Copy all VHDs
        foreach ($VHDcopy in $VHDOrg){
            
            $Dest = $VHDClonePath + $VHDcopy.VHDName
            Copy-Item -Path $VHDcopy.VHDPath -Destination $Dest
            Add-VMHardDiskDrive -VMName $VMCloneName -ControllerType $VHDCopy.ControllerType -ControllerLocation $VHDCopy.ControllerLocation  -ControllerNumber $VHDCopy.ControllerNumber -Path $Dest   
        }
    
        # Remove snapshot 
        $VM | Remove-VMSnapshot
    
    }
    


    Beste Grüsse, M. Heitmann
    MCSA: SQL Server 2012


    • Als Antwort vorgeschlagen M. Heitmann Dienstag, 24. September 2013 08:30
    • Bearbeitet M. Heitmann Dienstag, 24. September 2013 09:10
    • Als Antwort markiert Rene Keller Dienstag, 24. September 2013 13:10
    Dienstag, 24. September 2013 08:30
  • Clone VM on Win 2012 Hyper-V v3 when it is running using Powershell

    http://vniklas.djungeln.se/2012/06/19/clone-vm-on-win-2012-hyper-v-v3-when-it-is-running-using-powershell/


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort vorgeschlagen M. Heitmann Dienstag, 24. September 2013 09:12
    • Als Antwort markiert Rene Keller Dienstag, 24. September 2013 13:10
    Dienstag, 24. September 2013 08:34

Alle Antworten

  • Hallo Rene,

    dazu gibt es ein Technet-Video auf Youtube.

    http://www.youtube.com/watch?v=PGUecLd0EV8

    Die Sprecher sind Bernhard Frank (blogs.technet.com/bernhard_frank) und Carsten Rachfahl (hyper-v-server.de)
    Das Script findest du im Anhang:

    <#
    .Synopsis
       Function to clone a running VM
    .DESCRIPTION
       This function can be used to clone a running vm and connect the copied vhd´s and network
    .EXAMPLE
       Clone-VM -VMName vmdisktest -VMCloneName vmdisktest-clone -Path c:\VMs
    .EXAMPLE
       Clone-VM -VMName vmdisktest -VMCloneName vmdisktest-clone -Path c:\VMs -Switch Private
    .Notes
    Author: Niklas Akerlund
    Date: 2012-06-19
    #>
    function Clone-VM
    {
        [CmdletBinding()]
        [OutputType([int])]
        Param
        (
            # Name of the VM to be cloned
            [Parameter(Mandatory=$true,
                       ValueFromPipelineByPropertyName=$true,
                       Position=0)]
            $VMName,
            [string] $VMCloneName,
            # Where to store the VM-clone 
            [string] $Path,
            # Set to another network switch
            [string] $Switch = " "    
        )
    
        # Get VM
        $VM = Get-VM $VMName
        $VHDs = Get-VMHardDiskDrive -VM $VM
        #$VHDPath = (Get-VMHardDiskDrive -VM $VM).Path
        $VHDClonePath = "$Path\$VMCloneName\Virtual Hard Disks\"
        
        # Create a new array of VHD info
        $VHDOrg = @()
        foreach ($VHD in $VHDs){
            $data = New-Object PSObject -property @{
                VHDName = (Get-Item $VHD.Path).Name
                VHDPath = $VHD.Path
                ControllerType = $VHD.ControllerType
                ControllerNumber = $VHD.ControllerNumber
                ControllerLocation = $VHD.ControllerLocation
    
            }
            $VHDOrg +=$data
        }
    
        $VMNics = Get-VMNetworkAdapter -VM $VM
    
        # Take snapshot 
        $VM | Checkpoint-VM 
    
        New-Item -ItemType directory -Path $VHDClonePath
    
        New-VM -Name $VMCloneName -Path $Path -NoVHD -MemoryStartupBytes $VM.MemoryStartup -BootDevice IDE
        $VMClone = Get-VM -Name $VMCloneName
        Get-VMNetworkAdapter -VMName $VMCloneName | Remove-VMNetworkAdapter
       
        # Configure VM-Clon
        if ($VM.DynamicMemoryEnabled){
            Set-VM -VMName $VMCloneName -ProcessorCount $VM.ProcessorCount -DynamicMemory -MemoryMinimumBytes $VM.MemoryMinimum -MemoryMaximumBytes $VM.MemoryMaximum
        }else{
            Set-VM -VMName $VMCloneName -ProcessorCount $VM.ProcessorCount -StaticMemory
        }
    
        # Add all network cards
        foreach ($VMNic in $VMNics){
            if ($Switch -eq " "){
                Add-VMNetworkAdapter -VMName $VMCloneName -SwitchName $VMNic.SwitchName -IsLegacy $VMNic.IsLegacy
            }else{
                Add-VMNetworkAdapter -VMName $VMCloneName -SwitchName $Switch -IsLegacy $VMNic.IsLegacy
            }
        }
    
        # Copy all VHDs
        foreach ($VHDcopy in $VHDOrg){
            
            $Dest = $VHDClonePath + $VHDcopy.VHDName
            Copy-Item -Path $VHDcopy.VHDPath -Destination $Dest
            Add-VMHardDiskDrive -VMName $VMCloneName -ControllerType $VHDCopy.ControllerType -ControllerLocation $VHDCopy.ControllerLocation  -ControllerNumber $VHDCopy.ControllerNumber -Path $Dest   
        }
    
        # Remove snapshot 
        $VM | Remove-VMSnapshot
    
    }
    


    Beste Grüsse, M. Heitmann
    MCSA: SQL Server 2012


    • Als Antwort vorgeschlagen M. Heitmann Dienstag, 24. September 2013 08:30
    • Bearbeitet M. Heitmann Dienstag, 24. September 2013 09:10
    • Als Antwort markiert Rene Keller Dienstag, 24. September 2013 13:10
    Dienstag, 24. September 2013 08:30
  • Clone VM on Win 2012 Hyper-V v3 when it is running using Powershell

    http://vniklas.djungeln.se/2012/06/19/clone-vm-on-win-2012-hyper-v-v3-when-it-is-running-using-powershell/


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort vorgeschlagen M. Heitmann Dienstag, 24. September 2013 09:12
    • Als Antwort markiert Rene Keller Dienstag, 24. September 2013 13:10
    Dienstag, 24. September 2013 08:34
  • Hallo M. Heitmann!

    Soll ich meine Antwort jetzt auch als Antwort vorschlagen?

    Da jeder von uns denkt, das er der einzige ist der recht hat, sollte man grundsätzlich nicht selbst seine Antworten als Antwort vorschlagen.

    Wenn das jeder machen würde, dann würde das ganze System keine Sinn mehr machen.

    Dies ist dazu gedacht, das ein dritter Forenteilnehmer eine Antwort vorschlägt.
    Alles andere sieht ein bisschen selbstherrlich aus! ;-)


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Bearbeitet Peter Kriegel Dienstag, 24. September 2013 09:10 fdvdsd
    Dienstag, 24. September 2013 09:09
  • Hallo Peter,

    danke für deinen Hinweis.

    Wenn ich einen Beitrag sinnvoll finde, so makiere ich ihn auch als solches
    und gebe auch meine Stimme für besonders hervorzugebende Antworten ab (z.B. dein Beitrag).

    Wenn das nicht so vorgesehen ist (wie z.B. bei wählen einer Antwort mit +1) dann sollte dies auch deaktiviert werden.

    Ich kann dir auch gerne ein Beispiel geben wo sich moderatoren, die eine Antwort gegeben haben selbst als Antwort vorschlagen und die dann genehmigen.

    http://social.technet.microsoft.com/Forums/de-DE/afd48b64-0bec-46f5-be8b-aa32b0629380/lync-anrufweiterleitung-per-snom-deaktivieren

    Gerade ein Moderator sollte eine Vorbildfunktion darstellen.

    Peter, wie siehst du das?

    Gerne bin ich bereit meine vorgeschlagende Antwort zurückzunehmen und den Fragesteller darüber entscheiden zu lassen.


    Beste Grüsse, M. Heitmann
    MCSA: SQL Server 2012

    Dienstag, 24. September 2013 09:21
  • Wenn das nicht so vorgesehen ist (wie z.B. bei wählen einer Antwort mit +1) dann sollte dies auch deaktiviert werden.

    Da hast du recht! Microsoft sollte das so einrichten. Sieht aber trotzdem immer etwas selbstherrlich aus oder nicht?

    Du kannst in diesem Microsoft TechNet Forum eine Vorschlag dafür machen / suchen.

    Using Forums > Suggestions and Feedback for the Forums

    http://social.technet.microsoft.com/Forums/de-DE/home?forum=suggest&filter=alllanguages

    Ich kann dir auch gerne ein Beispiel geben wo sich moderatoren, die eine Antwort gegeben haben selbst als Antwort vorschlagen und die dann genehmigen.

    http://social.technet.microsoft.com/Forums/de-DE/afd48b64-0bec-46f5-be8b-aa32b0629380/lync-anrufweiterleitung-per-snom-deaktivieren

    Gerade ein Moderator sollte eine Vorbildfunktion darstellen.

    Das sehe ich genauso! Ich habe mich zusammen mit anderen in dem Obigen Forum erfolgreich dafür eingesetzt, das man auch sieht wer denn was Markiert/vorgeschlagen hat. Damit so etwas überhaupt entdeckt werden kann. Auch dort beschweren sich viele über "unsaubere" Moderatoren.

    http://social.technet.microsoft.com/Forums/de-DE/7773cfda-e905-4878-9b4c-f816552216d1/important-information-about-posts-is-missing

    Unser Moderator hier Denniver Reining sieht das genauso. Leider agieren die Mitarbeiter von Microsoft hier öfter "willkürlich" herum. Deshalb hat Denniver diesen Thread eingerichtet wo man "Ungerechtigkeiten" in diesem PowerShell Forum Melden kann:

    (Re-) Moderationswünsche

    Gerne bin ich bereit meine vorgeschlagende Antwort zurückzunehmen und den Fragesteller darüber entscheiden zu lassen.

    Warum brauchst du dazu eine Aufforderung? ;-)

    Ich hatte mich nur über den "unlauteren Wettbewerb" geärgert ;-)


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Dienstag, 24. September 2013 11:07