上传通用化 VHD 并使用它在 Azure 中创建新 VM
本主题逐步讲解如何使用 PowerShell 将通用化 VM 的 VHD 上传到 Azure、从该 VHD 创建映像,然后从该映像创建新 VM。 可以上传从本地虚拟化工具或其他云导出的 VHD。 对新的 VM 使用托管磁盘可以简化 VM 管理,在将 VM 置于可用性集中时提供更好的可用性。
若要使用示例脚本,请参阅将 VHD 上传到 Azure 并创建新的 VM 的示例脚本
开始之前
- 将任何 VHD 上传到 Azure 之前,应该遵循准备要上传到 Azure 的 Windows VHD 或 VHDX
- 开始迁移到托管磁盘之前,请先查看规划迁移到托管磁盘。
请确保有最新版本的 AzureRM.Compute PowerShell 模块。 运行以下命令来安装该模块。
PowerShell复制Install-Module AzureRM.Compute -RequiredVersion 2.6.0
有关详细信息,请参阅 Azure PowerShell 版本控制。
使用 Sysprep 通用化 Windows VM
Sysprep 将删除所有个人帐户信息及其他某些数据,并准备好要用作映像的计算机。 有关 Sysprep 的详细信息,请参阅如何使用 Sysprep:简介。
确保 Sysprep 支持计算机上运行的服务器角色。 有关详细信息,请参阅 Sysprep Support for Server Roles
Important
如果在首次将 VHD 上传到 Azure 之前运行 Sysprep,请确保先准备好 VM,然后再运行 Sysprep。
- 登录到 Windows 虚拟机。
- 以管理员身份打开“命令提示符”窗口。 将目录切换到 %windir%\system32\sysprep,然后运行
sysprep.exe
。 - 在“系统准备工具”对话框中,选择“进入系统全新体验(OOBE)”,确保已选中“通用化”复选框。
- 在“关机选项”中选择“关机”。
单击 “确定”。
- 在 Sysprep 完成时,它会关闭虚拟机。 不要重新启动 VM。
登录到 Azure
如果尚未安装 Azure PowerShell 1.4 版或更高版本,请阅读 如何安装和配置 Azure PowerShell。
打开 Azure PowerShell 并登录到 Azure 帐户。 此时会打开一个弹出窗口让输入 Azure 帐户凭据。
PowerShell复制Login-AzureRmAccount -EnvironmentName AzureChinaCloud
获取可用订阅的订阅 ID。
PowerShell复制Get-AzureRmSubscription
使用订阅 ID 设置正确的订阅。 将 替换为正确订阅的 ID。
PowerShell复制Select-AzureRmSubscription -SubscriptionId "<subscriptionID>"
获取存储帐户
需要在 Azure 中创建存储帐户来存储上传的 VM 映像。 可以使用现有存储帐户,也可以创建新存储帐户。
如果要使用 VHD 为 VM 创建托管磁盘,存储帐户位置必须与要创建 VM 的位置相同。
显示可用的存储帐户,请键入:
Get-AzureRmStorageAccount
如果要使用现有存储帐户,请转到 上传 VM 映像 部分。
若要创建存储帐户,请执行以下步骤:
需要应在其中创建存储帐户的资源组的名称。 若要查找订阅中的所有资源组,请键入:
PowerShell复制Get-AzureRmResourceGroup
若要在中国东部区域中创建名为 myResourceGroup 的资源组,请键入:
PowerShell复制New-AzureRmResourceGroup -Name myResourceGroup -Location "China East"
使用 New-AzureRmStorageAccount cmdlet 在此资源组中创建名为 mystorageaccount 的存储帐户:
PowerShell复制New-AzureRmStorageAccount -ResourceGroupName myResourceGroup -Name mystorageaccount -Location "China East"`
-SkuName "Standard_LRS" -Kind "Storage"
-SkuName 的有效值为:
- Standard_LRS - 本地冗余存储。
- Standard_ZRS - 区域冗余存储。
- Standard_GRS - 异地冗余存储。
- Standard_RAGRS - 读取访问权限异地冗余存储。
- Premium_LRS - 高级本地冗余存储。
将 VHD 上传到存储帐户
使用 Add-AzureRmVhd cmdlet 将 VHD 上传到存储帐户中的容器。 本示例将文件 myVHD.vhd 从 "C:\Users\Public\Documents\Virtual hard disks\" 上传到 myResourceGroup 资源组中名为 mystorageaccount 的存储帐户。 该文件将放入名为 mycontainer 的容器,新文件名为 myUploadedVHD.vhd。
$rgName = "myResourceGroup"
$urlOfUploadedImageVhd = "https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myUploadedVHD.vhd"
Add-AzureRmVhd -ResourceGroupName $rgName -Destination $urlOfUploadedImageVhd `
-LocalFilePath "C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd"
如果成功,会显示类似于下面的响应:
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 创建托管磁盘或新 VM,请保存 目标 URI 路径供稍后使用。
用于上传 VHD 的其他选项
也可以使用以下方法之一将 VHD 上传到存储帐户:
- AzCopy
- Azure 存储复制 Blob API
- Azure 存储资源管理器上传 Blob
- Storage Import/Export Service REST API Reference(存储导入/导出服务 REST API 参考)
- 如果预估上传时间大于 7 天,建议使用导入/导出服务。 可根据数据大小和传输单位,利用 DataTransferSpeedCalculator 预估时间。 导入/导出可用于复制到标准存储帐户。 需要使用 AzCopy 等工具从标准存储复制到高级存储帐户。
通过上传的 VHD 创建托管映像
使用通用 OS VHD 创建托管映像。 将值替换为自己的信息。
首先,设置公共参数:
PowerShell复制$vmName = "myVM"
$computerName = "myComputer"
$vmSize = "Standard_DS1_v2"
$location = "China East"
$imageName = "yourImageName"
使用通用 OS VHD 创建映像。
PowerShell复制$imageConfig = New-AzureRmImageConfig -Location $location
$imageConfig = Set-AzureRmImageOsDisk -Image $imageConfig -OsType Windows -OsState Generalized -BlobUri $urlOfUploadedImageVhd
$image = New-AzureRmImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig
创建虚拟网络
创建虚拟网络的 vNet 和子网。
创建子网。 此示例创建名为 mySubnet 的子网,其地址前缀为 10.0.0.0/24。
PowerShell复制$subnetName = "mySubnet"
$singleSubnet = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix 10.0.0.0/24
创建虚拟网络。 此示例创建名为 myVnet 的虚拟网络,其地址前缀为 10.0.0.0/16。
PowerShell复制$vnetName = "myVnet"
$vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $location `
-AddressPrefix 10.0.0.0/16 -Subnet $singleSubnet
创建公共 IP 地址和网络接口
若要与虚拟网络中的虚拟机通信,需要一个 公共 IP 地址 和网络接口。
创建公共 IP 地址。 此示例创建名为 myPip的公共 IP 地址。
PowerShell复制$ipName = "myPip"
$pip = New-AzureRmPublicIpAddress -Name $ipName -ResourceGroupName $rgName -Location $location `
-AllocationMethod Dynamic
创建 NIC。 此示例创建名为 myNic的 NIC。
PowerShell复制$nicName = "myNic"
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $location `
-SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
创建网络安全组和 RDP 规则
若要使用 RDP 登录到 VM,需要创建一个允许在端口 3389 上进行 RDP 访问的网络安全规则 (NSG)。
此示例创建名为 myNsg 的 NSG,其中包含一个允许通过端口 3389 传输 RDP 流量的、名为 myRdpRule 的规则。 有关 NSG 的详细信息,请参阅 Opening ports to a VM in Azure using PowerShell(使用 PowerShell 在 Azure 中打开 VM 端口)。
$nsgName = "myNsg"
$ruleName = "myRdpRule"
$rdpRule = New-AzureRmNetworkSecurityRuleConfig -Name $ruleName -Description "Allow RDP" `
-Access Allow -Protocol Tcp -Direction Inbound -Priority 110 `
-SourceAddressPrefix Internet -SourcePortRange * `
-DestinationAddressPrefix * -DestinationPortRange 3389
$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $rgName -Location $location `
-Name $nsgName -SecurityRules $rdpRule
为虚拟网络创建变量
为完成的虚拟网络创建变量。
$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName $rgName -Name $vnetName
获取 VM 的凭据
以下 cmdlet 将打开一个窗口,需在其中输入远程访问 VM 所用的本地管理员帐户的新用户名和密码。
$cred = Get-Credential
将 VM 的名称和大小添加到 VM 配置。
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize
将 VM 映像设置为新 VM 的源映像
使用托管 VM 映像的 ID 设置源映像。
$vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id
设置 OS 配置并添加 NIC。
输入 OS 磁盘的存储类型(PremiumLRS 或 StandardLRS)和大小。 此示例将帐户类型设置为 PremiumLRS,将磁盘大小设置为 128 GB,将磁盘缓存设置为 ReadWrite。
$vm = Set-AzureRmVMOSDisk -VM $vm -DiskSizeInGB 128 `
-CreateOption FromImage -Caching ReadWrite
$vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $computerName `
-Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
创建 VM
使用存储在 $vm 变量中的配置创建新 VM。
New-AzureRmVM -VM $vm -ResourceGroupName $rgName -Location $location
验证是否已创建 VM
完成后,应会在 Azure 门户的“浏览” > “虚拟机”下看到新建的 VM,也可以使用以下 PowerShell 命令查看该 VM:
$vmList = Get-AzureRmVM -ResourceGroupName $rgName
$vmList.Name
后续步骤
若要登录到新虚拟机,请在门户中浏览到该 VM,单击“连接”,然后打开远程桌面 RDP 文件。 使用原始虚拟机的帐户凭据登录到新虚拟机。 有关详细信息,请参阅 How to connect and log on to an Azure virtual machine running Windows(如何连接并登录到运行 Windows 的 Azure 虚拟机)。
立即访问http://market.azure.cn
上传通用化 VHD 并使用它在 Azure 中创建新 VM的更多相关文章
- Oracle案例02——ORA-12034: "SCOTT"."USER_TABLE" 上的实体化视图日志比上次刷新后的内容新
最近同事在交接工作时,发现有几个schedule job没有执行成功,我这边给看了下,其中一个是由于数据库迁移,调用dblink的host主机IP在tnsnames中没有变更导致,还有一个是无法视图的 ...
- 在 Azure 中的 Linux VM 上创建 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈
本教程介绍如何在 Azure 中的 Linux VM 上实现 MongoDB.Express.AngularJS 和 Node.js (MEAN) 堆栈. 通过创建的 MEAN 堆栈,可以在数据库中添 ...
- .Net 图片缩略图上传通用方法
日常开发中,经常碰到图片上传的需求,尤其在商城系统开发的时候,商品列表商品图片展示如果使用高清原图,由于高清原图比较大,加载原图时间会大大增加,直接导致系统性能底下,用户体验不好,并发量高的时候直接就 ...
- 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下Nu ...
- php上传大文件时,服务器端php.ini文件中需要额外修改的选项
几个修改点: 1.upload_max_filesize 上传的最大文件 2.post_max_size 上传的最大文件 3.max_execution_time 修改为0表示无超时,一直等待 4.m ...
- java servlet上传文件并把文件内容显示在网页中
servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...
- thinkphp表单上传文件并将文件路径保存到数据库中
上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` ( `id` int(11) ...
- Springboot(九).多文件上传下载文件(并将url存入数据库表中)
一. 文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...
- Express+MySQL实现图片上传到服务器并把路径保存到数据库中
demo准备:mysql5.7.20 express4.0 处理图片文件的中间件Multer 先搭建服务器并展示html页面 const express = require("express ...
随机推荐
- mono for android之文件系统与应用程序首选项(转)
Aside from persistent files, your application might need to store cache data in a file. To do that, ...
- winform FormBordStyle=none 及 wpf FormBordStyle=none 的鼠标点击移动问题
winform: //bool formMove = false;//窗体是否移动 //Point formPoint;//记录窗体的位置 private void Login_MouseDown(o ...
- (转)CentOS7.4环境下搭建--Gluster分布式集群存储
原文:https://blog.csdn.net/qq_39591494/article/details/79853038 环境如下:OS:Centos7.4x86_64IP地址如下: Daasban ...
- Guava源码解析之EventBus
最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执 ...
- HTML 权重标签的使用
<H>标签通常使用<H1><H2><H3>这3个标签是有权重加分的,<H4>用于无用途的文字标记等 非重要相关字. <H1>有别 ...
- 创建自己的加密货币MNC——以太坊代币(二)
创建一个基于以太坊平台的分红币MNC,根据持有的代币数量,进行分红的算法.github地址: https://github.com/lxr1907/MNC 1.使用以太坊根据比例换购token MNC ...
- 在ViewDidLoad中往导航栈推ViewController报错
Unbalanced calls to begin/end appearance transitions for <YZPMainViewController: 0x7fa04b4970f0& ...
- Delegate背后的秘密
表面上看来使用delegate是一件很简单的事. 用delegate关键字定义,使用老套的new创建一个instance ,使用熟悉的方法调用写法调用,只不过不在是方法名,而是委托名. 但是在这背后C ...
- Java的文档注释之生成帮助文档
示例: /** * Title: Person类<br/> * Description:通过Person类说明Java中的文档注释<br/> * Company: *** * ...
- js中的同步与异步的问题
前言 近来,总是忙于拿js写一些案例,因为是小白,并没有什么丰富的经验,对各个知识点把握也不是很全面,写起来真的是...一言难尽,太痛苦了= =.尤其是在写一些轮播的时候,里面需要用到定时器,而一旦用 ...