Deploy a VM from a specialized image on your Azure Stack Edge Pro GPU device via Azure PowerShell

APPLIES TO: Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro RYes for Mini R SKUAzure Stack Edge Mini R                  

This article describes the steps required to deploy a virtual machine (VM) on your Azure Stack Edge Pro GPU device from a specialized image.

To prepare a generalized image for deploying VMs in Azure Stack Edge Pro GPU, see Prepare generalized image from Windows VHD or Prepare generalized image from an ISO.

About VM images

A Windows VHD or VHDX can be used to create a specialized image or a generalized image. The following table summarizes key differences between the specialized and the generalized images.

Image type Generalized Specialized
Target Deployed on any system. Targeted to a specific system.
Setup after boot Setup required at first boot of the VM. No setup needed.
Platform turns on the VM.
Configuration Hostname, admin-user, and other VM-specific settings required. Preconfigured.
Used when Creating multiple new VMs from the same image. Migrating a specific machine or restoring a VM from previous backup.

Workflow

The high-level workflow to deploy a VM from a specialized image is:

  1. Copy the VHD to a local storage account on your Azure Stack Edge Pro GPU device.
  2. Create a new managed disk from the VHD.
  3. Create a new virtual machine from the managed disk and attach the managed disk.

Prerequisites

Before you can deploy a VM on your device via PowerShell, make sure that:

Verify the local Azure Resource Manager connection

Verify that your client can connect to the local Azure Resource Manager.

  1. Call local device APIs to authenticate:

    Login-AzureRMAccount -EnvironmentName <Environment Name>
    
  2. Provide the username EdgeArmUser and the password to connect via Azure Resource Manager. If you don't recall the password, Reset the password for Azure Resource Manager and use this password to sign in.

Deploy VM from specialized image

The following sections contain step-by-step instructions to deploy a VM from a specialized image.

Copy VHD to local storage account on device

Follow these steps to copy VHD to local storage account:

  1. Copy the source VHD to a local blob storage account on your Azure Stack Edge.

  2. Take note of the resulting URI. You use this URI in a later step.

    To create and access a local storage account, see the sections Create a storage account through Upload a VHD in the article: Deploy VMs on your Azure Stack Edge device via Azure PowerShell.

Create a managed disk from VHD

Follow these steps to create a managed disk from a VHD that you uploaded to the storage account earlier:

  1. Set some parameters.

    $VhdURI = <URI of VHD in local storage account>
    $DiskRG = <managed disk resource group>
    $DiskName = <managed disk name>    
    

    Here's an example output.

    PS C:\WINDOWS\system32> $VHDURI = "https://myasevmsa.blob.myasegpudev.wdshcsso.com/vhds/WindowsServer2016Datacenter.vhd"
    PS C:\WINDOWS\system32> $DiskRG = "myasevm1rg"
    PS C:\WINDOWS\system32> $DiskName = "myasemd1"
    
  2. Create a new managed disk.

    $StorageAccountId = (Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName).Id
    
    $DiskConfig = New-AzureRmDiskConfig -Location DBELocal -StorageAccountId $StorageAccountId -CreateOption Import -SourceUri "Source URL for your VHD"
    
    

    Here's an example output. The location here is set to the location of the local storage account and is always DBELocal for all local storage accounts on your Azure Stack Edge Pro GPU device.

    PS C:\WINDOWS\system32> $DiskConfig = New-AzureRmDiskConfig -Location DBELocal -CreateOption Import -SourceUri $VHDURI
    PS C:\WINDOWS\system32> $disk = New-AzureRMDisk -ResourceGroupName $DiskRG -DiskName $DiskName -Disk $DiskConfig
    PS C:\WINDOWS\system32>    
    

Create a VM from managed disk

Follow these steps to create a VM from a managed disk:

  1. Set some parameters.

    $NicRG = <NIC resource group>
    $NicName = <NIC name>
    $IPConfigName = <IP config name>
    $PrivateIP = <IP address> #Optional
    
    $VMRG = <VM resource group>
    $VMName = <VM name>
    $VMSize = <VM size> 
    

    Note

    The PrivateIP parameter is optional. Use this parameter to assign a static IP else the default is a dynamic IP using DHCP.

    Here's an example output. In this example, the same resource group is specified for all the VM resources though you can create and specify separate resource groups for the resources if needed.

    PS C:\WINDOWS\system32> $NicRG = "myasevm1rg"
    PS C:\WINDOWS\system32> $NicName = "myasevmnic1"
    PS C:\WINDOWS\system32> $IPConfigName = "myaseipconfig1" 
    
    PS C:\WINDOWS\system32> $VMRG = "myasevm1rg"
    PS C:\WINDOWS\system32> $VMName = "myasetestvm1"
    PS C:\WINDOWS\system32> $VMSize = "Standard_D1_v2"   
    
  2. Get the virtual network information and create a new network interface.

    This sample assumes you're creating a single network interface on the default virtual network ASEVNET that is associated with the default resource group ASERG. If needed, you could specify an alternate virtual network, or create multiple network interfaces. For more information, see Add a network interface to a VM via the Azure portal.

    $armVN = Get-AzureRMVirtualNetwork -Name ASEVNET -ResourceGroupName ASERG
    $ipConfig = New-AzureRmNetworkInterfaceIpConfig -Name $IPConfigName -SubnetId $armVN.Subnets[0].Id [-PrivateIpAddress $PrivateIP]
    $nic = New-AzureRmNetworkInterface -Name $NicName -ResourceGroupName $NicRG -Location DBELocal -IpConfiguration $ipConfig
    

    Here's an example output.

    PS C:\WINDOWS\system32> $armVN = Get-AzureRMVirtualNetwork -Name ASEVNET -ResourceGroupName ASERG
    PS C:\WINDOWS\system32> $ipConfig = New-AzureRmNetworkInterfaceIpConfig -Name $IPConfigName -SubnetId $armVN.Subnets[0].Id
    PS C:\WINDOWS\system32> $nic = New-AzureRmNetworkInterface -Name $NicName -ResourceGroupName $NicRG -Location DBELocal -IpConfiguration $ipConfig
    WARNING: The output object type of this cmdlet will be modified in a future release.
    PS C:\WINDOWS\system32>    
    
  3. Create a new VM configuration object.

    $vmConfig = New-AzureRmVMConfig -VMName $VMName -VMSize $VMSize
    
  4. Add the network interface to the VM.

    $vm = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id
    
  5. Set the OS disk properties on the VM.

    $vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $disk.Id -StorageAccountType StandardLRS -CreateOption Attach –[Windows/Linux]
    

    The last flag in this command will be either -Windows or -Linux depending on which OS you're using for your VM.

  6. Create the VM.

    New-AzureRmVM -ResourceGroupName $VMRG -Location DBELocal -VM $vm 
    

    Here's an example output.

    PS C:\WINDOWS\system32> $vmConfig = New-AzureRmVMConfig -VMName $VMName -VMSize $VMSize
    PS C:\WINDOWS\system32> $vm = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id
    PS C:\WINDOWS\system32> $vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $disk.Id -StorageAccountType StandardLRS -CreateOption Attach -Windows
    PS C:\WINDOWS\system32> New-AzureRmVM -ResourceGroupName $VMRG -Location DBELocal -VM $vm
    WARNING: Since the VM is created using premium storage or managed disk, existing standard storage account, myasevmsa, is used for
    boot diagnostics.    
    RequestId IsSuccessStatusCode StatusCode ReasonPhrase
    --------- ------------------- ---------- ------------
                             True         OK OK        
    PS C:\WINDOWS\system32>
    

Delete VM and resources

This article used only one resource group to create all the VM resource. Deleting that resource group deletes the VM and all the associated resources.

  1. First view all the resources created under the resource group.

    Get-AzureRmResource -ResourceGroupName <Resource group name>
    

    Here's an example output.

    PS C:\WINDOWS\system32> Get-AzureRmResource -ResourceGroupName myasevm1rg
    
    
    Name              : myasemd1
    ResourceGroupName : myasevm1rg
    ResourceType      : Microsoft.Compute/disks
    Location          : dbelocal
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myasevm1rg/providers/Microsoft.Compute/disk
                        s/myasemd1
    
    Name              : myasetestvm1
    ResourceGroupName : myasevm1rg
    ResourceType      : Microsoft.Compute/virtualMachines
    Location          : dbelocal
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myasevm1rg/providers/Microsoft.Compute/virt
                        ualMachines/myasetestvm1
    
    Name              : myasevmnic1
    ResourceGroupName : myasevm1rg
    ResourceType      : Microsoft.Network/networkInterfaces
    Location          : dbelocal
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myasevm1rg/providers/Microsoft.Network/netw
                        orkInterfaces/myasevmnic1
    
    Name              : myasevmsa
    ResourceGroupName : myasevm1rg
    ResourceType      : Microsoft.Storage/storageaccounts
    Location          : dbelocal
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myasevm1rg/providers/Microsoft.Storage/stor
                        ageaccounts/myasevmsa
    
    PS C:\WINDOWS\system32>
    
  2. Delete the resource group and all the associated resources.

    Remove-AzureRmResourceGroup -ResourceGroupName <Resource group name>
    

    Here's an example output.

    PS C:\WINDOWS\system32> Remove-AzureRmResourceGroup -ResourceGroupName myasevm1rg
    
    Confirm
    Are you sure you want to remove resource group 'myasevm1rg'
    [Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y
    True
    PS C:\WINDOWS\system32>
    
  3. Verify that the resource group has deleted. Get all the resource groups that exist on the device.

    Get-AzureRmResourceGroup
    

    Here's an example output.

    PS C:\WINDOWS\system32> Get-AzureRmResourceGroup
    
    ResourceGroupName : ase-image-resourcegroup
    Location          : dbelocal
    ProvisioningState : Succeeded
    Tags              :
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ase-image-resourcegroup
    
    ResourceGroupName : ASERG
    Location          : dbelocal
    ProvisioningState : Succeeded
    Tags              :
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ASERG
    
    ResourceGroupName : myaserg
    Location          : dbelocal
    ProvisioningState : Succeeded
    Tags              :
    ResourceId        : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myaserg
    
    PS C:\WINDOWS\system32>
    

Next steps