【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

如何在 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:451537

评论

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

英特尔锐炫实力出击,游戏、内容创作双管齐下!

E科讯

华为云UniXcoder-VESO-v1问鼎CodeXGLUE榜单第一名

华为云PaaS服务小智

算法 代码 华为云 代码语义

焱融科技入选赛迪 2022 中国分布式存储报告挑战者象限

焱融科技

#高性能 #分布式文件存储 #文件存储

《Klustron Tech Talk》直播选题有奖问卷调查,获MySQL系列丛书

KunlunBase昆仑数据库

MySQL

基于WebGPU的AI原生3D引擎迎来新机遇!Orillusion在GOTC上演讲!

Orillusion

开源 渲染引擎 元宇宙 webgpu AIGC

创建矢量图形:Patternodes 3 免激活版

真大的脸盆

Mac Mac 软件 矢量图形创作 创建矢量图形

使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

devpoint

node.js websocket GPT-4

4 种 MySQL 同步 ES 方案,yyds!

Java你猿哥

Java MySQL sql elasticsearch Binlog

引领下一代云计算技术的变革:无服务器架构

xfgg

云计算 severless

GitHub发布即百万!字节内网超实用 java性能优化手册,star超十万

Java你猿哥

Java ssm jvm调优 Java性能优化

2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次数的两类操作 如果元素是 偶数 ,除以 2 例如,如果数组是 [1,2,3,4] 那么你可以对最后一

福大大架构师每日一题

golang 算法 rust 福大大

可逆计算理论中的Delta合并算法

canonical

设计模式之模板方法模式

越长大越悲伤

设计模式

为什么要用线程池?

javacn.site

GitHub上开源24小时获星96K的,从零到实战Java架构师成长手册

Java你猿哥

架构 架构师 高可用架构 高性能架构 高可扩展

数据可视化:趋势类可视化图表大全

2D3D前端可视化开发

数据分析 数据可视化 数据可视化工具 可视化图表

Generative AI 新世界 | 走进文生图(Text-to-Image)领域

亚马逊云科技 (Amazon Web Services)

自然语言处理 机器学习 开源

【1对1咨询】土木女生,挖掘个人优势转行程序员

程序员晚枫

程序员 求职 转行

如何科学地利用MTTR优化软件交付流程?

SEAL安全

DevOps MTTR 企业号 5 月 PK 榜

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

福大大架构师每日一题

福大大 ChatGPT 文心一言 讯飞星火

一块显存为 12GB 的 GPU 卡能够在CST 时域求解器仿真的最大网格数是多少?

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 cst仿真软件

解锁人机交互新技术 华为开发者联创日·全栈AI黑客松大赛等你来

说山水

2023数博会丨软通智慧发布“一屏统揽”TongView 数字政府慧治平台解决方案

说山水

Django笔记三十八之发送邮件

Hunter熊

Python django 发送邮件

硬核!阿里2023版Spring全家桶进阶笔记流出,堪称Java跳槽神器

Java你猿哥

spring Spring Boot spring security Spring全家桶 Spring Cloud Aliababa

前端开发如何更好的避免样式冲突?级联层(CSS@layer)

vivo互联网技术

CSS 级联 @layer

量子程序设计基础 | 从经典计算到量子计算

TiAmo

量子计算 经典计算

打造繁荣社区:Solaris 与 Web3 合作的力量

股市老人

TiDB x Bolt丨超强可扩展性与弹性助力超 1 亿用户畅享出行服务

PingCAP

MySQL 数据库 TiDB

不止游戏!英特尔锐炫“天生爱创作”

E科讯

深度理解:Redis Hash(散列表)实现原理

Java你猿哥

redis 开源 ssm hash 散列表

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