前言简述
描述:之前各位看有想必已经跟随作者脚步,对[[虚拟化云计算基础知识概念]]文章进行了解学习了吧,此章节将针对 VMware 虚拟化软件所生成的众多的文件格式进行介绍,帮助大家在使用时不会因为不了解此文件的作用从而在清理空间时误删除。
0x01 基础知识
VMware 在创建完虚拟机后,你会在存放目录中看到有类似 .vmdk 和 .vmx 的一些文件,它们究竟是什么?有何功能?以及如何在备份迁移中使用呢?
在此,之前先来了解虚拟机文件到底有哪些文件格式。
虚拟机文件格式:
.vmdk : VMware 虚拟磁盘文件,即虚拟机存放文件的虚拟机磁盘,我们可以采用虚拟机映射或者diskgenius磁盘管理软件进行打开;
weiyigeek.top-打开虚拟磁盘文件
.vmx : VMware虚拟机配置,通过打开设置虚拟机文件以启动系统并且可以进行自定义配置修改(用文本文档的方式将其打开)。
# 躲避游戏检测时配置
monitor_control.restrict_backdoor = "TRUE"
.vmx.lck : VMware虚拟机磁盘锁文件,防止多台虚拟机同时访问一个.vmdk虚拟磁盘文件带来的数据丢失和性能下降;
.log : Vmware 工作日志;
.vmxf : VMware 组成员(VMware team member),即该文件为虚拟机组team中的虚拟机的辅助配置文件。
.vmsd : VMware快照元素,即VM快照和相关联的vmdk的字典文件;
.nvram : VMware虚拟机非易变RAM(二进制格式),即存放虚拟机的BIOS信息;
.vmem:表示虚拟机的虚拟内存文件,与物理机的分页文件类似。虚拟机挂起时会保留该文件。
.vmsn: 快照文件,记录快照时虚拟机的状态信息。每个快照会生成一个 .vmsn 文件,与 .vmem 文件配对。
.ova : 开放虚拟化设备 (Open Virtualization Appliance) ,现在基本采用ovf格式进行分发,单个文件更加方便。
.ovf : (Open Virtualization Format) 开放虚拟化格式 ,即它描述了一个开源、安全、有效、可拓展的便携式虚拟打包以及软件分布格式,组成部分分别是ovf文件、mf文件、cert文件、vmdk文件和iso文件;
.mf : 记录 .nvram 以及 vmdk 文件的SHA1、SHA256值,以便校验使用;
.iso: VMware 虚拟机原始的安装光盘镜像文件,ISO映像是一种光盘的存档文件,是磁盘映像的类型之一,数据由一张光盘的每个扇区组成,这包括光盘的文件系统。
注意
若虚拟机非正常关闭
.vmx.lck磁盘锁文件可能就没能来得及删除,会导致虚拟机内系统显示崩溃以及虚拟机提示锁定文件失败,解决办法删除.vmx.lck磁盘锁文件即可;
0x02 虚拟机磁盘转换
除此之外,大家也可能经常遇到 VDI, VHD, VMDK 虚拟磁盘文件,那它们之间的区别是?
• 共同点: 支持动态存储分配
• 不同点:
VDI 是virtual box 的原生格式。
VMDK 虚拟机磁盘,是一组由 VMware 指定的虚拟磁盘映像格式。其文件扩展名为 .vmdk,在 Sun xVM, QEMU, VirtualBox, SUSE Studio, .NET DiscUtils 等平台也支持,它还能把存储文件拆分成小于2GB,在你的文件系统的文件大小限制比较小的时候有用。
VHD 虚拟硬盘,是由 Microsoft 制定的一组虚拟磁盘映像格式,是 Microsoft 开放规范许可的一部分。其文件扩展名为 .vhd
如何在 Windows 中生成VHD虚拟文件?
答:可使用 DISKPART 磁盘分区工具,具体操作命令和流程如下:
DISKPART> create vdisk file=F:synoboot.vhd maximum=60 type=expandable
100 百分比已完成
DiskPart 已成功创建虚拟磁盘文件。
DISKPART> attach vdisk
100 百分比已完成
DiskPart 已成功连接虚拟磁盘文件。
DISKPART> create partition primary
DiskPart 成功地创建了指定分区。
DISKPART> ASSIGN LETTER=L
DiskPart 成功地分配了驱动器号或装载点。
DISKPART> FORMAT LABEL=L
100 百分比已完成
DiskPart 成功格式化该卷。
如何将 vdi 、vmdk、vhd 虚拟磁盘进行转换?
作者使用的是 VirtualBox 应用的中携带的 VBoxManager 二进制文件进行转换,操作如下:
# vmdk -> vdi
VBoxManage.exe clonehd source.vmdk target.vdi --format VDI
# vdi -> vmdk
VBoxManage.exe clonehd source.vdi target.vmdk --format VMDK
# vdi -> vhd
VBoxManage.exe clonehd source.vdi target.vhd --format VHD
0x03 虚拟机映像导出格式
描述:当需要将虚拟机备份或者迁移到其它虚拟化平台时,就需要将虚拟机映像进行导出再导入,而导出的格式常见的有两种,一是 OVF 二 是 OVA 它们都是开放的虚拟化格式,下面作者将简单的介绍一下,以及在导出分享虚拟机时应该选那种格式最好。
1.1 OVF - 开源虚拟化格式
描述: 开源虚拟化格式 ( OVF, Open Virtualization Format,)是由分布式管理任务组 (DMTF) 指定的开放标准,用于打包和分发由一个或多个虚拟机 (VM) 组成的虚拟设备,许多虚拟化平台,包括VMware、微软、甲骨文与Citrix的产品在内,能够从OVF文件安装虚拟设备。
OVF 包中始终包含一个描述符文件 (*.ovf) 中包含用于描述 VM 的元数据和文件元素,以及对于 OVF 包中应用程序的部署和操作至关重要的其他信息,其文件扩展名为 .ovf。
OVF包中内容:
| 文件类型 | 说明 |
|---|---|
.ovf 描述符 |
描述符用于指定服务对虚拟硬件的要求,并且还包括其他信息,例如虚拟磁盘的说明、服务本身、来宾操作系统、许可协议 (EULA)、在设备中启动和停止 VM 的说明以及服务安装说明。描述符文件的扩展名为 .ovf |
.mf清单摘要 |
清单文件是软件包中每个文件的 SHA-1 / SHA-256摘要,可以用来检测任何损坏,以验证软件包的内容。清单文件的扩展名为 .mf 。 |
.cert `签名 |
签名是用软件包所含 X.509 证书中的公钥进行签名的清单文件摘要,用于对软件包作者进行验证。签名文件的扩展名为 .cert 。 |
OVF 虚拟磁盘 |
OVF 不指定磁盘映像格式,OVF 包中包含组成虚拟磁盘的文件(格式由导出虚拟磁盘所用的虚拟化产品定义)。XenServer 生成的 OVF 包具有动态 VHD 格式的磁盘映像;VMware 产品和 Virtual Box 生成的 OVF 包具有流技术优化 VMDK 格式的虚拟磁盘 |
OVF包中内容
OVF 描述文件内容说明
<?xml version='1.0' encoding='UTF-8'?>
<Envelopexmlns="http://schemas.dmtf.org/ovf/envelope/1"xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"xmlns:vmw="http://www.vmware.com/schema/ovf"xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData">
<!-- 文件源说明 -->
<References>
<Fileovf:id="file1"ovf:href="CentOS7-194-1.vmdk"/>
</References>
<!-- 绑定的虚拟磁盘 -->
<DiskSection>
<Info>List of the virtual disks</Info>
<Diskovf:capacityAllocationUnits="byte"ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized"ovf:diskId="vmdisk1"ovf:capacity="53687091200"ovf:fileRef="file1"/>
</DiskSection>
<!-- 绑定的虚拟网络 -->
<NetworkSection>
<Info>The list of logical networks</Info>
<Networkovf:name="VM Network">
<Description>The VM Network network</Description>
</Network>
</NetworkSection>
<!-- 虚拟系统说明 -->
<VirtualSystemovf:id="CentOS7-194">
<Info>A Virtual system</Info>
<Name>CentOS7-194</Name>
<!-- 操作系统说明 -->
<OperatingSystemSectionovf:id="80"ovf:version="7"vmw:osType="rhel7_64Guest">
<Info>The operating system installed</Info>
<Description>Red Hat Enterprise Linux 7 (64 位)</Description>
</OperatingSystemSection>
<!--
虚拟硬件部分
- CPU
- Memory
- 磁盘控制器
- 虚拟磁盘
- 网卡信息
- 视频卡信息
-->
<VirtualHardwareSection>
<Info>Virtual hardware requirements</Info>
<System>
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
<vssd:InstanceID>0</vssd:InstanceID>
<vssd:VirtualSystemType>vmx-11</vssd:VirtualSystemType>
</System>
<Item>
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
<rasd:Description>Number of Virtual CPUs</rasd:Description>
<rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
<rasd:InstanceID>1</rasd:InstanceID>
<rasd:ResourceType>3</rasd:ResourceType>
<rasd:VirtualQuantity>2</rasd:VirtualQuantity>
<vmw:CoresPerSocketovf:required="false">1</vmw:CoresPerSocket>
</Item>
<Item>
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
<rasd:Description>Memory Size</rasd:Description>
<rasd:ElementName>2048MB of memory</rasd:ElementName>
<rasd:InstanceID>2</rasd:InstanceID>
<rasd:ResourceType>4</rasd:ResourceType>
<rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
</Item>
<Item>
<rasd:Address>0</rasd:Address>
<rasd:Description>SCSI Controller</rasd:Description>
<rasd:ElementName>SCSI Controller 1</rasd:ElementName>
<rasd:InstanceID>3</rasd:InstanceID>
<rasd:ResourceSubType>VirtualSCSI</rasd:ResourceSubType>
<rasd:ResourceType>6</rasd:ResourceType>
<vmw:Configovf:required="false"vmw:key="slotInfo.pciSlotNumber"vmw:value="160"/>
</Item>
<Item>
<rasd:Address>0</rasd:Address>
<rasd:Description>SATA Controller</rasd:Description>
<rasd:ElementName>SATA Controller 1</rasd:ElementName>
<rasd:InstanceID>4</rasd:InstanceID>
<rasd:ResourceSubType>vmware.sata.ahci</rasd:ResourceSubType>
<rasd:ResourceType>20</rasd:ResourceType>
<vmw:Configovf:required="false"vmw:key="slotInfo.pciSlotNumber"vmw:value="33"/>
</Item>
<Item>
<rasd:AddressOnParent>0</rasd:AddressOnParent>
<rasd:ElementName>Hard Disk 1</rasd:ElementName>
<rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
<rasd:InstanceID>5</rasd:InstanceID>
<rasd:Parent>3</rasd:Parent>
<rasd:ResourceType>17</rasd:ResourceType>
</Item>
<Item>
<rasd:AddressOnParent>0</rasd:AddressOnParent>
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
<rasd:Connection>VM Network</rasd:Connection>
<rasd:ElementName>Network adapter 1</rasd:ElementName>
<rasd:InstanceID>7</rasd:InstanceID>
<rasd:ResourceSubType>VmxNet3</rasd:ResourceSubType>
<rasd:ResourceType>10</rasd:ResourceType>
<vmw:Configovf:required="false"vmw:key="connectable.allowGuestControl"vmw:value="true"/>
<vmw:Configovf:required="false"vmw:key="slotInfo.pciSlotNumber"vmw:value="192"/>
<vmw:Configovf:required="false"vmw:key="wakeOnLanEnabled"vmw:value="true"/>
</Item>
<Itemovf:required="false">
<rasd:ElementName>Video card</rasd:ElementName>
<rasd:InstanceID>8</rasd:InstanceID>
<rasd:ResourceType>24</rasd:ResourceType>
<vmw:Configovf:required="false"vmw:key="useAutoDetect"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="use3dRenderer"vmw:value="automatic"/>
<vmw:Configovf:required="false"vmw:key="graphicsMemorySizeInKB"vmw:value="262144"/>
<vmw:Configovf:required="false"vmw:key="enable3DSupport"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="numDisplays"vmw:value="1"/>
<vmw:Configovf:required="false"vmw:key="videoRamSizeInKB"vmw:value="8192"/>
</Item>
<vmw:Configovf:required="false"vmw:key="cpuHotAddEnabled"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="nestedHVEnabled"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="virtualSMCPresent"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="cpuHotRemoveEnabled"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="memoryHotAddEnabled"vmw:value="false"/>
<vmw:Configovf:required="false"vmw:key="firmware"vmw:value="bios"/>
<vmw:Configovf:required="false"vmw:key="virtualICH7MPresent"vmw:value="false"/>
<vmw:ExtraConfigovf:required="false"vmw:key="nvram"vmw:value="CentOS7-194.nvram"/>
<vmw:ExtraConfigovf:required="false"vmw:key="virtualHW.productCompatibility"vmw:value="hosted"/>
</VirtualHardwareSection>
</VirtualSystem>
</Envelope>
.mf 清单摘要文件内容说明
不同平台导出的 ovf 清单摘要算法是不同的,例如:
- • 从ESXI 7.X 导出的ovf格式中的清单是采用SHA-1摘要;
SHA1(MsSQL-Server2019.nvram)= f3a081df0bc1d49e97d967335381ee47b390b644
SHA1(MsSQL-Server2019-1.vmdk)= f8bfb4534e94b48db591624890b0ec795dc793be
- • 从VCenter中导出的ovf格式中的清单是采用SHA-256摘要;
SHA256(CentOS7-194.ovf)= 4525a25050315a21866e4d87f9c6d4ae7f65b41a83134391138f74dd0e363bc4
SHA256(CentOS7-194-1.vmdk)= f250cfa7d18e0e4c690515a2450f39b95be5d8bdaccc870b7c7186b4e678a61f
SHA256(CentOS7-194-2.iso)= 659691c28a0e672558b003d223f83938f254b39875ee7559d1a4a14c79173193
特别注意: 1.使用 OVF 格式导入虚拟机时,需要将.ovf / .mf / .vmdk等文件一起导入,并且每当对ovf文件进行更改后需要在.mf清单中重新生成文件的 SHA-256 或者 SHA-1摘要;
# Windows
# Certuntil | 哈希算法: MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512
$certutil -HashFile CentOS7-194.ovf SHA256
SHA256 的 CentOS7-194.ovf 哈希:
4525a25050315a21866e4d87f9c6d4ae7f65b41a83134391138f74dd0e363bc4
CertUtil: -hashfile 命令成功完成。
# Linux
$sha256sum /opt/application/CentOS7-194.ovf
4525a25050315a21866e4d87f9c6d4ae7f65b41a83134391138f74dd0e363bc4 /opt/application/CentOS7-194.ovf
2.使用 OVF 作为打包方法时不能保证软件包中所包含的虚拟机能够跨虚拟机管理程序实现兼容。在一个虚拟机管理程序上创建的 OVF 包可能无法自动在其他虚拟机管理程序上工作,出现这种情况的原因有多种,其中包括:不同虚拟机管理程序对于 OVF 规范、来宾操作系统设备、驱动程序及实施有不同的解释。
3.另外,当导出OVF的时候未将CD/DVD 驱动器勾选掉,它会将系统原始的安装镜像进行一起导出,此时候您可以编辑OVF文件去掉cd-dvd与iso相关的元素如下所示。
<References>
...
<Fileovf:id="file2"ovf:href="CentOS7-194-2.iso"ovf:size="1085276160"/>
</References>
<Item>
<rasd:AddressOnParent>0</rasd:AddressOnParent>
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
<rasd:ElementName>CD/DVD Drive 1</rasd:ElementName>
<rasd:HostResource>ovf:/file/file2</rasd:HostResource>
<rasd:InstanceID>6</rasd:InstanceID>
<rasd:Parent>4</rasd:Parent>
<rasd:ResourceSubType>vmware.cdrom.iso</rasd:ResourceSubType>
<rasd:ResourceType>15</rasd:ResourceType>
</Item>
1.2 OVA - 开放虚拟化格式
描述:开放式虚拟设备 (OVA,Open Virtualization Appliance) 是一个包含组成 OVF 包的文件,它是一个未压缩磁带存档 (TAR) 格式的单个存档文件,其文件扩展名为.ova 。OVA 更适用于适合使用一个文件的特定应用场合(例如创建用于 Web 下载的软件包),这种情况下软件包更易于处理。与 OVF 相比,导出和导入 OVA 包所需的时间更长。
另外,对于存储为单个文件的OVF包,OVF描述符中的所有文件引用都应是相对路径,并且文件存储在档案中顺序如下:
- 1. .ovf descriptor2. .mf manifest (optional)3. .cert certificate (optional)4. The remaining files shall be in the same order as listed in the References section5. .mf manifest (optional)6. cert certificate (optional)
[!info] 请注意,证书文件是可选的。如果没有证书文件,则清单文件也是可选的。如果清单或证书文件存在,则应将它们都放在OVF描述符之后,或者都放在存档的末尾。
现在问题来了 OVF 与 OVA 我们应使用哪种格式?
1.OVF 包包含一系列未压缩的文件,对于需要访问文件中各个磁盘映像的用户而言较为方便,而 OVA 包只是一个大型文件尽管您可以
压缩此文件但它(不如 OVF)那样灵活,不能够直接手动调整相关文件。 2.OVA 更适用于适合只使用一个文件的特定应用场合(例如创建用于 Web 下载的软件包)更易于处理,但是与 OVF 相比导出和导入 OVA 包所需的时间更长。
参考文档:https://www.dmtf.org/sites/default/files/standards/documents/DSP0243_1.0.0.pdf
学习:作者知识星球
『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。
323