NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

如何在 Azure Stack 中自定义虚拟机镜像?

  • 2017-10-01
  • 本文字数:4497 字

    阅读完需:约 15 分钟

Azure Stack 环境中服务的提供者或运营者从微软变成了 Azure Stack 集成环境的运营者,通过 Azure Stack 的 MarketPlace,我们可以根据用户的特定需求,提供一些定制化的应用,获得与公有云不一样的用户体验。本文将主要介绍如何在 Azure Stack 的 MarketPlace 中如何添加一个自定义的虚拟机镜像并定制满足需求的 Gallery Item,同时通过自服务的模式提供给业务的消费者。 这一篇,我们将探讨以下几个问题:

  • 如何制作自定义镜像
  • 从自定义镜像创建虚拟机的几种方式
  • 如何创建自定义的 Gallery Item

制作自定义镜像

Azure Stack 的镜像分为 generalized 和 specialized 两种不同的形式。 Generalized 镜像中已经删除了所有个人账户信息及一些其它数据,可以作为模板来创建一个或者多个虚拟机。微软在 Windows 和 Linux 下都提供了相应的工具来 generalize 镜像,Windows 下可以采用 Sysgrep,Linux 下可以安装 Azure Linux Agent,执行 sudo waagent –deprovision 来实现。 Specialized 镜像中保留了原始虚拟机中的用户账户、应用程序和其它状态数据,可以作为模板创建一台虚拟机。Specialized 镜像可以看作是原始虚拟机在某个时间的的 snapshot。 镜像既可以从 Azure Stack 或者 Azure 上运行的虚拟机来制作,比如捕获或者克隆虚拟机,也可以将在本地基于 Hyper-V Manager 启动的虚拟机导出作为镜像。几种不同的自定义镜像的详细制作过程请参考下面链接:

从自定义镜像创建虚拟机

在获得虚拟机镜像之后,如何在 Azure Stack 中根据镜像创建虚拟机? 这部分介绍如何将本地 VHD 镜像上传到 Azure Stack 中,并且创建虚拟机。Azure Stack 中可以通过 Portal、PowerShell,ARM Template 等方式来进行相应的操作,这些操作包括 2 步:

  • 上传本地 VHD 镜像到 Azure Stack 上
  • 创建虚拟机

通过 Portal 新建存储账户并上传本地镜像

  • 登陆 Azure Stack

  • 新建存储账户

  • 新建 Blob Container,名字为 vhds

  • 将本地 VHD 文件以 PageBlob 的类型上传到新建的 Container 中

通过 ARM Template 从镜像创建新的虚拟机

镜像上传后,就可以开始创建虚拟机了。从 VHD 创建虚拟机有两种模式:Attach 和 From-Image。Attach 模式下,VHD 文件是直接附加到新建的虚拟机上。因此采用 Attach 模式,一个 VHD 文件只能创建一台虚拟机。而 From-Image 模式,首先会将 VHD 文件复制一份到指定的 Blob Container 中,然后将 VHD 的副本附加到虚拟机上,因此可以从一个 generalized VHD 创建多台虚拟机。

这里采用 ARM Template 来创建虚拟机, ARM Template 的使用方式及创建虚拟机的完整 Template 可以在 AzureStack-QuickStart-Templates 上获得,这里仅提供两种模式下不同的部分来进行对比分析:

  • Attach 模式

Attach 模式下只需要提供 vhd 的 uri,createOption 采用"Attach" 这里 parameters(‘osDiskVhdUri’) 为

也就是前面通过 Portal 上传的 VHD 文件的 URL。

Attach 模式流程:

  • From-Image 模式

From-Image 模式下需要提供 image 的 uri 和 vhd 的 uri, createOption 采用 FromImage variables(‘userImageUri’) 为前面用 Portal 上传的 VHD 文件的 URL

而 variables(‘osDiskVhdUri’) 为

是用户指定的新的虚拟机绑定的 VHD 文件,实际上是 CentOS7-AzureStack-WithAgent.vhd 的副本。

注:这里为了方便,将 CentOS7-AzureStack-WithAgent.vhd 和 testVM.vhd 放在了同一个 Blob Container 中。实际上,副本 VHD 可以放在其他的存储账户中,并且名字也可以根据需要设置。

From-Image 模式流程:

Azure Stack 镜像库

上一节中介绍了如何上传镜像及通过 ARM Template 从镜像创建虚拟机。VHD 镜像上传到我们自己新建的存储账号中。创建虚拟机的时候直接通过 Blob 的 URL 来定位镜像文件。

那么除了用户自己维护镜像的存储,Azure Stack 有没有提供一个统一的镜像库来方便的存储镜像呢?除了用 URL 来标识和定位镜像,有没有别的方式来唯一指定镜像呢?

答案是有。本节讨论 Azure Stack 的镜像库,主要介绍下面几个问题:

  • 自定义镜像上传到镜像库
  • 镜像库中镜像的标识
  • 从镜像库中的镜像创建虚拟机

通过 Admin Portal 上传自定义镜像到镜像库

Azure Stack 的镜像库在 Resource Provider 的 Compute 当中,需要 admin 权限才能进行操作。

1、从 admin portal 用 admin 账号登陆 Azure Stack

admin portal 地址:

2、点击 Resource Providers-- 点击 Compute–VM images

可以看到目前已经上传到镜像库中的所有镜像。

3、点击 Add,填写镜像的相应标识信息,然后点击 Create

其中 OS Disk Blob URI: 就是我们上一小节中上传的 VHD 镜像的 Blob URL, 也即:

注: 由于上一小节是在 tenant portal 进行的操作,这里实际上需要在 admin portal 重新执行一遍。

4、成功后,即将镜像上传到了镜像库中

镜像库中镜像的标识

在上传镜像的过程中,我们需要填写一些相关信息,如 PUBLISHER, OFFER, SKU, VERSION, OSTYPE, OS DISK BLOB URI,那么这些信息到底有什么用呢?在点击了 Create 后,发生了什么过程呢?

实际上主要发生了两步:

1、将 OS DISK BLOB URI 指定的 vhd 文件复制到 VM Images 库中

在我们的 POC 测试环境中,镜像库位于 C:\ClusterStorage\Volume1\Shares\SU1_Infrastructure_1\CRP\PlatformImages 中,可以看到有两个文件夹,对应着我们在镜像库中的两个镜像。

2、生成该镜像的对应的 Manifest 文件,用来标识该镜像。

进入刚刚上传的镜像对应的文件夹中可以看到,除了存在着一个复制过来的 VHD 文件外还有一个 Manifest 文件。

Manifest 文件的内容如下:

Manifest 文件中包含了前面填写的 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 信息,也包含了镜像文件在镜像库中的存储位置以及镜像是从哪里复制过来的。

其中 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 唯一标识了当前的镜像。通过这些标识信息,就可以指定用该镜像创建虚拟机。

从镜像库中的镜像创建虚拟机

有了镜像的唯一标识信息,就可以创建虚拟机,前面小节介绍了如何通过 ARM Template 来创建虚拟机,这里则通过 PowerShell 来创建。

在 vmConfig 中通过标识信息来指定用我们刚刚上传的镜像来创建新的虚拟机。

自定义 Gallery Item

前面的几个小节介绍了从自定义镜像创建虚拟机的几种方式,无论是采用 PowerShell 还是 ARM Template,都需要一定的编程基础,那么有没有一种方式,可以在 Portal 上通过点击操作来创建自定义的虚拟机呢?本节就介绍如何为自定义镜像在 Portal 上创建图标,也就是 Gallery Item。

什么是 Gallery Item

简单的理解,在 Azure 中我们可以通过如下方式创建虚拟机:

如图点击对应的图标,就可以弹出创建虚拟机的界面:

不需要配置任何的开发环境,不需要一定的编程基础,只要点击,就可以弹出创建虚拟机的相关步骤和需要填写的项,来快速的创建一台虚拟机。

在 Azure Stack 中同样可以实现!

利用 Azure Stack Tool 创建 Gallery Item

在 Azure Stack 深入浅出系列的上一篇中介绍了 Azure Stack 运维工具 Azure Stack Tools 的使用,新版本的 Azure Stack Tools 提供了 Add-AzsVMImage 方法来实现:

执行上面的指令后就可以实现与 Azure 类似的通过 Portal 来创建虚拟机

更多 Azure Stack Tools 的内容请参考: Azure Stack Tools

深入理解自定义 Gallery Item 的流程

利用 Azure Stack Tools 的 Add-AzsVMImage 可快速的实现自定义 Gallery Item。那么 Add-AzsVMImage 到底封装了什么操作?自定义 Gallery Item 需要经过哪些过程呢? Add-AzsVMImage 主要做了 2 个工作:

  • 将本地 VHD 文件上传到 Azure Stack 的镜像库
  • 为镜像库中的镜像创建 Gallery Item

将本地 VHD 文件上传到 Azure Stack 镜像库

将镜像上传到镜像库的过程前面已经介绍过了,Add-AzsVMImage 所进行的操作与前面介绍的相同,流程如下:

  • 在 Azure Stack 中创建新的临时资源组,存储账号,Blob Container
  • 将本地 VHD 文件上传到新建的 Container 中
  • 将临时存储账户中的 VHD 文件的 BLob URL 作为 OS DISK BLOB URI 的值,Add-AzsVMImage 指令中的参数 publisher, offer, sku, version, osType 的值作为 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 的值,在镜像库中添加新的镜像
  • 删除创建的临时资源组,包括其中的存储账号、Container 以及临时的 VHD 文件

为镜像库中的镜像创建 Gallery Item

本小节将通过 PowerShell 来详细分析自定义 Gallery Item 的流程。主要分为以下几步:

  • 填写相应的 Json 描述文件
  • 生成 azkpg 包
  • 生成 Gallery Item

1、首先创建下面的目录结构及文件:

其中 DeploymentTmeplates、Icons、strings 为文件夹的名字。Icons 下面存放的是图标文件,可以选择自己需要的 png 文件进行替换。

注:可以从 github 上下载 CustomizedVMGalleryItem.azpkg,然后重命名为 CustomizedVMGalleryItem.zip。解压后删除掉多余的文件,只留下上面目录结构和文件。

下载地址

2、编辑 Manifest 文件:

Manifest 文件包含了一些对图标的描述,包括名字,发布者,版本,图标样式等信息。也就是对下图中 CentOS 7.2 的一些描述。

3、编辑 UIDefinition.json

UIDefinition 定义了在创建新的虚机时 UI 显示的步骤和内容,有两种类型 一种是 Azure 的默认类型 CreateVMWizardBlade,如下图共 四步,一般都采用这种类型比较好。

另一种是 DeployFromTemplateBlade 类型,这种需要在 DeploymentTemplates 文件夹下,填写需要显示的内容,感兴趣的读者可以深入研究一下。

4、编辑 DeplymentTemplates\CreateUIDefinition.json

ImageReference 中可以设置下面的属性来表示采用的镜像:

5、编辑 Strings\resources.resjon 里面主要是 Manifest.json 中用到的几个变量的详细信息

6、生成 azkpg 包

-> 使用工具 AzureGalleryPackager,下载地址

-> 解压,进入目录

-> 执行 powershell 指令

.\AzureGalleryPackageGenerator\AzureGalleryPackager.exe -m C: \CentOS.72\Manifest.json -o C:\InesaMarketPlaceItems

-> 执行成功后会在 InesaMarketPlaceItems 文件夹下生成相应的 azkpg 文件 Inesa.CentOS72.1.0.0.azpkg 。

7、上传 azkpg 文件到 Blob 中,并记录文件在 Blob 中的 URL

8、执行下列 PowerShell 指令,根据 azkpg 文件生成 Gallery Item

其中, https://itemstore.blob.local.azurestack.external/templates/Inesa.CentOS72.1.0.0.azpkg 是上传的文件的 Blob URI

经过上面的 8 步,已经可以实现创建 Gallery Item 的功能,实际上,Add-AzsVMImage 中也是根据这个过程来实现的。

利用 Publishing Tool 来添加 Gallery Item

在前面小节中,需要执行 PowerShell 指令来添加 Gallery Item。随着 Azure Stack GA,微软提供了一个 Publishing Tool 来实现可视化的添加 Gallery Item。界面如下图:

Publishing Tool 的详细使用教程: Add marketplace items using publishing tool

总结

通过本文,我们了解了如何创建自定义的虚拟机镜像,并且通过自定义镜像来创建虚拟机,为自定义镜像创建 Gallery Item 等。从较简单的例子入手,逐步深入,来介绍 Azure Stack Tools 中 Add-AzsVMImage 所做的工作,希望能够对读者有一定的启发。

感谢江柳对本文的审校。

2017-10-01 18:451558

评论

发布
暂无评论
发现更多内容

18 个 Java8 日期处理的实践,太有用了!

xcbeyond

Java java8 日期处理 3月日更

架构学习(2021年03月06日)

张小胖

最全Hive SQL语法、Hive函数及使用注意事项(一)

五分钟学大数据

大数据 Hive SQL 28天写作 3月日更

面向业务的高可用架构设计

架构精进之路

架构设计 七日更 3月日更

超干货 (实战经验)结合公司业务分析离线数仓建设实践

五分钟学大数据

大数据 数据仓库 28天写作 3月日更

力扣(LeetCode)刷题,简单题(第21期)

不脱发的程序猿

面试 LeetCode 28天写作 算法面经 3月日更

硬件设计必备,电子元器件高清矢量图

不脱发的程序猿

硬件产品 28天写作 硬件设计 电子元器件矢量图 3月日更

如何设计三极管控制继电器电路

不脱发的程序猿

28天写作 电路设计 继电器电路设计 三极管 3月日更

常用工具幕布高级会员获取

白程序员的自习室

关于 Python 中的字符串,我在补充两点,滚雪球学 Python

梦想橡皮擦

Python 28天写作 3月日更

面试官就是这么欺负人:new Object()到底占用几个字节?

xcbeyond

Java java对象分析 3月日更

写作平台的一些乱象

ES_her0

28天写作 3月日更

MySQL 数据查询语言(DQL)& 事务控制语言(TCL)详解

若尘

MySQL

简易项目搭建 Models层封装

happlyfox

学习 28天写作 3月日更

Docker部署ClickHouse监控平台

wjchenge

常见的设计模式原则

一个大红包

设计模式 设计原则 28天写作 3月日更

电商管理系统之发票子系统设计(二)

长沙造纸农

架构设计 高并发系统设计 电商 电子发票 发票

要拥有必先懂失去怎接受——浅谈前景理论

Justin

心理学 28天写作 游戏设计

Elasticsearch Mapping Root Object

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

kvm

梅花鹿鹿

kvm

工作中迷迷糊糊,不知道自己想要什么?

一笑

28天写作

话题讨论 | 又一家大厂进入汽车领域,"百车大战"即将来临?

程序员架构进阶

话题讨论 七日更 28天写作 话题王者 3月日更

虚拟化存储

lenka

产品经理 3月日更

新业务团队应用数字化的4个能力

boshi

数字化转型 七日更

(28DW-S8-Day15) 在线教育的MOT

mtfelix

在线教育 28天写作 峰值体验 关键时刻 MOT

【LeetCode】分割回文串Java题解

Albert

算法 LeetCode 28天写作

Oracle table()函数的合理运用,提高工作效率

xiezhr

oracle table() Oracle函数 3月日更

翻译:《实用的Python编程》04_00_Overview

codists

Python

专访 | 我与毕玄的对话

九叔(高翔龙)

Java 阿里巴巴 中间件 架构师 访谈录

在有限的时间里,拿到通才的帐号,登入无限的游戏。

叶小鍵

文字君和ta的朋友们

InfoQ写作社区官方

如何在Azure Stack中自定义虚拟机镜像?_微软_刘建志_InfoQ精选文章