通过使用 Powershell 将专用托管磁盘附加为 OS 磁盘来创建新 VM。 专用磁盘是保留原始 VM 中的用户帐户、应用程序和其他状态数据的现有 VM 中虚拟硬盘 (VHD) 的副本。

使用专用 VHD 创建新 VM 时,新 VM 将保留原始 VM 的计算机名。 还会保留其他计算机特定信息,在某些情况下,这种重复信息可能会导致问题。 请注意,在复制 VM 时,应用程序依赖哪些类型的计算机特定信息。

可以使用两个选项:

本主题演示如何使用托管磁盘。 如果有需要使用存储帐户的旧版部署,请参阅从存储帐户中的专用 VHD 创建 VM

开始之前

如果使用 PowerShell,请确保使用的是最新版本的 AzureRM.Compute PowerShell 模块。

PowerShell复制
Install-Module AzureRM.Compute -RequiredVersion 2.6.0

有关详细信息,请参阅 Azure PowerShell 版本控制

选项 1:上传专用 VHD

可从使用本地虚拟化工具(如 Hyper-V)创建的专用 VM 或从另一个云导出的 VM 上传 VHD。

准备 VM

如果想要使用当前 VHD 创建新 VM,请确保完成以下步骤。

  • 准备好要上传到 Azure 的 Windows VHD。 不要使用 Sysprep 通用化 VM。
  • 删除 VM 上安装的所有来宾虚拟化工具和代理(例如 VMware 工具)。
  • 确保 VM 配置为通过 DHCP 来提取其 IP 地址和 DNS 设置。 这确保服务器在启动时在 VNet 中获取 IP 地址。

获取存储帐户

需要 Azure 中的存储帐户来存储上传的 VHD。 可以使用现有存储帐户,也可以创建新存储帐户。

显示可用的存储帐户,请键入:

PowerShell复制
Get-AzureRmStorageAccount

如果要使用现有存储帐户,请转到上传 VHD 部分。

若要创建存储帐户,请执行以下步骤:

  1. 需要应在其中创建存储帐户的资源组的名称。 若要查找订阅中的所有资源组,请键入:

    PowerShell复制
    Get-AzureRmResourceGroup

    若要在中国北部区域中创建名为 myResourceGroup 的资源组,请键入:

    PowerShell复制
    New-AzureRmResourceGroup -Name myResourceGroup -Location "China North"
  2. 使用 New-AzureRmStorageAccount cmdlet 在此资源组中创建名为 mystorageaccount 的存储帐户:

    PowerShell复制
    New-AzureRmStorageAccount -ResourceGroupName myResourceGroup -Name mystorageaccount -Location "China North" `
    -SkuName "Standard_LRS" -Kind "Storage"

将 VHD 上传到存储帐户

使用 Add-AzureRmVhd cmdlet 将 VHD 上传到存储帐户中的容器。 本示例将文件 myVHD.vhd 从 "C:\Users\Public\Documents\Virtual hard disks\" 上传到 myResourceGroup 资源组中名为 mystorageaccount 的存储帐户。 该文件存储在名为 mycontainer 的容器中,新文件名为 myUploadedVHD.vhd

PowerShell复制
$resourceGroupName = "myResourceGroup"
$urlOfUploadedVhd = "https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myUploadedVHD.vhd"
Add-AzureRmVhd -ResourceGroupName $resourceGroupName -Destination $urlOfUploadedVhd `
-LocalFilePath "C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd"

如果成功,会显示类似于下面的响应:

PowerShell复制
MD5 hash is being calculated for the file C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd.
MD5 hash calculation is completed.
Elapsed time for the operation: 00:03:35
Creating new page blob of size 53687091712...
Elapsed time for upload: 01:12:49 LocalFilePath DestinationUri
------------- --------------
C:\Users\Public\Doc... https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myUploadedVHD.vhd

完成执行此命令可能需要一段时间,具体取决于网络连接速度和 VHD 文件的大小

从 VHD 创建托管磁盘

使用 New-AzureRMDisk 通过存储帐户中的专用 VHD 创建托管磁盘。 此示例使用 myOSDisk1 作为磁盘名称,将磁盘置于 StandardLRS 存储中并使用 https://storageaccount.blob.core.chinacloudapi.cn/vhdcontainer/osdisk.vhd 作为源 VHD 的 URI。

创建适用于新 VM 的新资源组。

PowerShell复制
$destinationResourceGroup = 'myDestinationResourceGroup'
New-AzureRmResourceGroup -Location $location -Name $destinationResourceGroup

从上传的 VHD 创建新 OS 磁盘。

PowerShell复制
$sourceUri = (https://storageaccount.blob.core.chinacloudapi.cn/vhdcontainer/osdisk.vhd)
$osDiskName = 'myOsDisk'
$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
(New-AzureRmDiskConfig -AccountType StandardLRS -Location $location -CreateOption Import `
-SourceUri $sourceUri) `
-ResourceGroupName $destinationResourceGroup

选项 2:复制现有 Azure VM

通过拍摄 VM 快照来创建使用托管磁盘的 VM 副本,并使用该快照创建一个新的托管磁盘和一个新 VM。

拍摄 OS 磁盘快照

可拍摄整个 VM(包括所有磁盘)快照或仅拍摄单个磁盘快照。 以下步骤展示了如何使用 New-AzureRmSnapshot cmdlet 拍摄仅 VM 的 OS 磁盘的快照。

设置一些参数。

PowerShell复制
$resourceGroupName = 'myResourceGroup'
$vmName = 'myVM'
$location = 'chinanorth'
$snapshotName = 'mySnapshot'

获取 VM 对象。

PowerShell复制
$vm = Get-AzureRmVM -Name $vmName -ResourceGroupName $resourceGroupName

获取 OS 磁盘名称。

PowerShell复制
$disk = Get-AzureRmDisk -ResourceGroupName $resourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name

创建快照配置。

PowerShell复制
$snapshotConfig =  New-AzureRmSnapshotConfig -SourceUri $disk.Id -OsType Windows -CreateOption Copy -Location $location

创建快照。

PowerShell复制
$snapShot = New-AzureRmSnapshot -Snapshot $snapshotConfig -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName

如果计划使用快照创建需要高性能的 VM,请结合使用 -AccountType Premium_LRS 参数和 New-AzureRmSnapshot 命令。 该参数创建快照,使其作为高级托管磁盘进行存储。 高级托管磁盘比标准托管磁盘开销大。 因此使用该参数前,请确保确实需要高级托管磁盘。

从快照创建新磁盘

使用 New-AzureRMDisk 从快照创建托管磁盘。 此示例使用“myOSDisk”作为磁盘名称。

创建适用于新 VM 的新资源组。

PowerShell复制
$destinationResourceGroup = 'myDestinationResourceGroup'
New-AzureRmResourceGroup -Location $location -Name $destinationResourceGroup

设置 OS 磁盘名称。

PowerShell复制
$osDiskName = 'myOsDisk'

创建托管磁盘。

PowerShell复制
$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
(New-AzureRmDiskConfig -Location $location -CreateOption Copy `
-SourceResourceId $snapshot.Id) `
-ResourceGroupName $destinationResourceGroup

创建新 VM

创建新 VM 使用的网络和其他 VM 资源。

创建子网和 vNet

创建虚拟网络的 vNet 和子网。

创建子网。 本示例在资源组“myDestinationResourceGroup”中创建名为“mySubNet”的子网,并将子网地址前缀设置为 10.0.0.0/24。

PowerShell复制
$subnetName = 'mySubNet'
$singleSubnet = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix 10.0.0.0/24

创建 vNet。 本示例将虚拟网络名称设置为 myVnetName,将位置设置为“中国北部”,将虚拟网络的地址前缀设置为 10.0.0.0/16。

PowerShell复制
$vnetName = "myVnetName"
$vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $destinationResourceGroup -Location $location `
-AddressPrefix 10.0.0.0/16 -Subnet $singleSubnet

创建网络安全组和 RDP 规则

若要使用 RDP 登录到 VM,需要创建一个允许在端口 3389 上进行 RDP 访问的安全规则。 由于新 VM 的 VHD 是从现有专用 VM 创建的,因此可以将源虚拟机中的帐户用于 RDP。

本示例将 NSG 名称设置为 myNsg,将 RDP 规则名称设置为 myRdpRule。

PowerShell复制
$nsgName = "myNsg"

$rdpRule = New-AzureRmNetworkSecurityRuleConfig -Name myRdpRule -Description "Allow RDP" `
-Access Allow -Protocol Tcp -Direction Inbound -Priority 110 `
-SourceAddressPrefix Internet -SourcePortRange * `
-DestinationAddressPrefix * -DestinationPortRange 3389
$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $destinationResourceGroup -Location $location `
-Name $nsgName -SecurityRules $rdpRule

有关终结点和 NSG 规则的详细信息,请参阅 Opening ports to a VM in Azure using PowerShell(使用 PowerShell 在 Azure 中打开 VM 端口)。

创建公共 IP 地址和 NIC

若要与虚拟网络中的虚拟机通信,需要一个 公共 IP 地址 和网络接口。

创建公共 IP。 在此示例中,公共 IP 地址名称设置为 myIP。

PowerShell复制
$ipName = "myIP"
$pip = New-AzureRmPublicIpAddress -Name $ipName -ResourceGroupName $destinationResourceGroup -Location $location `
-AllocationMethod Dynamic

创建 NIC。 在此示例中,NIC 名称设置为 myNicName。

PowerShell复制
$nicName = "myNicName"
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $destinationResourceGroup `
-Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id

设置 VM 名称和大小

此示例将 VM 名称设置为“myVM”,将 VM 大小设置为“Standard_A2”。

PowerShell复制
$vmName = "myVM"
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize "Standard_A2"

添加 NIC

PowerShell复制
$vm = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id

添加 OS 磁盘

使用 Set-AzureRmVMOSDisk 将 OS 磁盘添加到配置。 此示例将磁盘大小设置为 128 GB 并附加托管磁盘作为 Windows OS 磁盘。

PowerShell复制
$vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -StorageAccountType StandardLRS `
-DiskSizeInGB 128 -CreateOption Attach -Windows

完成该 VM

使用刚刚创建的 New-AzureRMVM 配置创建 VM。

PowerShell复制
New-AzureRmVM -ResourceGroupName $destinationResourceGroup -Location $location -VM $vm

如果此命令成功,会看到类似于下面的输出:

PowerShell复制
RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
True OK OK

验证是否已创建 VM

应会在 Azure 门户的“浏览” > “虚拟机”下看到新建的 VM,也可以使用以下 PowerShell 命令查看该 VM:

PowerShell复制
$vmList = Get-AzureRmVM -ResourceGroupName $destinationResourceGroup
$vmList.Name

后续步骤

若要登录到新虚拟机,请在门户中浏览到该 VM,单击“连接”,然后打开远程桌面 RDP 文件。 使用原始虚拟机的帐户凭据登录到新虚拟机。 有关详细信息,请参阅 How to connect and log on to an Azure virtual machine running Windows(如何连接并登录到运行 Windows 的 Azure 虚拟机)。

立即访问http://market.azure.cn

从专用磁盘创建 Windows VM的更多相关文章

  1. 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM

    本文说明如何在 Azure 中上传自定义的虚拟硬盘 (VHD) 或复制现有 VHD,并从自定义磁盘创建 Linux 虚拟机 (VM). 可以根据要求安装并配置 Linux 分发版,并使用该 VHD 快 ...

  2. 如何使用 Azure PowerShell 在 Azure Marketplace 中查找 Windows VM 映像

    本主题介绍如何使用 Azure PowerShell 在 Azure Marketplace 中查找 VM 映像. 创建 Windows VM 时使用此信息来指定 Marketplace 映像. 确保 ...

  3. 如何在 Azure 门户中将托管数据磁盘附加到 Windows VM

    本文介绍了如何通过 Azure 门户将新的托管数据磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 对于新磁 ...

  4. 使用 PowerShell 将数据磁盘附加到 Windows VM

    本文介绍如何使用 PowerShell 将新磁盘和现有磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 若要 ...

  5. 关于 Azure Windows VM 的磁盘和 VHD

    就像其他任何计算机一样,Azure 中的虚拟机将磁盘用作存储操作系统.应用程序和数据的位置. 所有 Azure 虚拟机都至少有两个磁盘,即 Windows 操作系统磁盘和临时磁盘. 操作系统磁盘基于映 ...

  6. 【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)

    在参考Azure官方文档进行VM创建时,发现其中没有包含如何设置NSG的内容,以及如何在创建时就添加数据磁盘的代码(设置磁盘为SSD类型).本文的内容以"使用 Java 创建和管理 Azur ...

  7. 如何加密 Windows VM 上的虚拟磁盘

    为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...

  8. 如何使用 Packer 在 Azure 中创建 Windows 虚拟机映像

    Azure 中的每个虚拟机 (VM) 都是基于定义 Windows 分发和操作系统版本的映像创建的. 映像可以包括预安装的应用程序和配置. Azure 应用商店为最常见的操作系统和应用程序环境提供了许 ...

  9. 在 Azure 中创建通用 VM 的托管映像

    可以从在存储帐户中存储为托管磁盘或非托管磁盘的通用 VM 中创建托管映像资源. 然后可以使用该映像创建多个 VM. 使用 Sysprep 通用化 Windows VM Sysprep 将删除所有个人帐 ...

随机推荐

  1. JavaScript初探二

    //----------总结01.查找dom元素 document.getElementById();//通过id获取一个dom元素 document.getElementsByClassName() ...

  2. 215. 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示 ...

  3. 多线程编程(六)-Executor与ThreadPoolExecutor的使用

    使用Executors工厂类创建线程池 1.使用newCachedThreadPool()方法创建无界线程池 newCachedThreadPool()方法创建的是无界线程池,可以进行线程自动回收,此 ...

  4. 【详解】JNI(Java Native Interface)(一)

    前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...

  5. 快速搭建一个“微视”类短视频 App

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 " ...

  6. mongodb备份策略

    概述 数据库的备份非常非常非常重要!!!否则出问题连哭的机会有没有(欲哭无泪)今天主要是做一个mongodb的数据库备份. 1.关于备份 备份其实很简单,这里选择的是对mongodb中的某个库进行全备 ...

  7. 分布式理论(一) —— CAP 定理

    目录: 什么是 CAP 定理 为什么只能 3 选 2 能不能解决 3 选 2 的问题 引用 1. 什么是 CAP 定理 2000 年的时候,Eric Brewer 教授提出了 CAP 猜想,2年后,被 ...

  8. 学习Memcached:2基本应用之控制台使用

    1.首先新建一个控制台应用. 2.将下载好需要引用的Memcached的Dll导入进来. 3.前期准备工作就结束了,其实很简单,memcache的配置使用是挺简单.下面就是写代码了. using Me ...

  9. 简单的SpringMVC经典案例

    主题:构建一个基于SpringMVC的HelloWord Web 项目 目的:快速体验什么是SpringMVC 方案: 1.创建工程,命名:SpringMVC 2.导包 3.在SRC下添加spring ...

  10. Java代码优化笔记

    指定类.方法的final修饰符 为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写.如果指定了一个类为final,则该类所有的方法都是final的.Java ...