1. 引言
在虚拟化、系统安装和备份迁移的场景里,ISO 和 VMDK 是两个出现频率极高的文件格式。很多人在 VMware 里装系统时,会同时接触到这两种文件:一个是下载来的系统安装镜像,另一个是虚拟机目录里那个体积巨大的磁盘文件。
它们看起来都是"一个大文件",但本质、用途和内部结构完全不同。本文从概念、结构、使用场景和相互转换几个角度,把 ISO 与 VMDK 的关系讲清楚。
2. 一句话结论
- ISO 是光盘镜像 :它模拟的是一张 CD/DVD 光盘,通常是只读的,用来分发和安装。
- VMDK 是虚拟磁盘 :它模拟的是一块硬盘,是可读写的,用来承载虚拟机的操作系统和数据。
二者不是同一类东西,但在虚拟化流程中经常配合使用:用 ISO 启动虚拟机,把系统安装到 VMDK 里。
3. ISO 文件详解
3.1 什么是 ISO
ISO 文件(ISO 9660 映像)是把光盘的完整数据按扇区顺序打包成的单个文件,扩展名为 .iso。它保留了光盘的文件系统结构(ISO 9660、Joliet、UDF 等),因此可以被操作系统或虚拟机当作"一张光盘"来读取。
3.2 典型用途
- 分发操作系统安装介质(如各类 Linux 发行版、Windows 安装镜像)。
- 作为虚拟机的光驱设备挂载,用于引导安装。
- 制作可启动的维护盘、PE 工具盘。
3.3 关键特征
| 特征 | 说明 |
|---|---|
| 模拟对象 | 光盘(CD/DVD) |
| 读写属性 | 通常只读,写入需重新制作镜像 |
| 文件系统 | ISO 9660 / Joliet / UDF |
| 典型大小 | 几百 MB 到数 GB |
| 引导能力 | 可带 El Torito 引导记录,支持启动 |
4. VMDK 文件详解
4.1 什么是 VMDK
VMDK(Virtual Machine Disk)是 VMware 定义的虚拟磁盘格式,用来保存虚拟机的硬盘内容。它把一块虚拟硬盘抽象成一个或多个文件,虚拟机启动后,客户机操作系统看到的就是一块普通硬盘。
4.2 典型用途
- 作为虚拟机的系统盘或数据盘。
- 虚拟机快照、克隆、迁移时的磁盘载体。
- 通过转换工具在物理机与其他虚拟化平台之间迁移。
4.3 关键特征
| 特征 | 说明 |
|---|---|
| 模拟对象 | 硬盘 |
| 读写属性 | 可读写,支持增量与快照 |
| 文件系统 | 由客户机操作系统格式化(ext4、NTFS 等) |
| 典型大小 | 几 GB 到数 TB |
| 磁盘类型 | 厚置备 / 精简置备、单文件 / 多文件拆分 |
5. 两者的核心区别
| 对比维度 | ISO | VMDK |
|---|---|---|
| 抽象对象 | 光盘 | 硬盘 |
| 是否可写 | 基本只读 | 可读写 |
| 是否含分区表 | 一般不含(按光盘文件系统组织) | 含 MBR/GPT 分区表与文件系统 |
| 生命周期 | 安装介质,装完即可卸载 | 长期存在,承载系统与数据 |
| 能否直接启动系统 | 可引导安装,但不能持久保存修改 | 是系统运行的实际存储 |
| 常见工具 | 刻录工具、镜像制作工具 | VMware、qemu-img、VirtualBox 等 |
一句话概括:ISO 是"安装源",VMDK 是"安装目标"。
6. 二者在虚拟机中的协作关系
以在 VMware 中安装 Linux 为例,典型流程如下:
#mermaid-svg-wV8cXAVpsqQzmMH3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wV8cXAVpsqQzmMH3 .error-icon{fill:#552222;}#mermaid-svg-wV8cXAVpsqQzmMH3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wV8cXAVpsqQzmMH3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .marker.cross{stroke:#333333;}#mermaid-svg-wV8cXAVpsqQzmMH3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wV8cXAVpsqQzmMH3 p{margin:0;}#mermaid-svg-wV8cXAVpsqQzmMH3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster-label text{fill:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster-label span{color:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster-label span p{background-color:transparent;}#mermaid-svg-wV8cXAVpsqQzmMH3 .label text,#mermaid-svg-wV8cXAVpsqQzmMH3 span{fill:#333;color:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .node rect,#mermaid-svg-wV8cXAVpsqQzmMH3 .node circle,#mermaid-svg-wV8cXAVpsqQzmMH3 .node ellipse,#mermaid-svg-wV8cXAVpsqQzmMH3 .node polygon,#mermaid-svg-wV8cXAVpsqQzmMH3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .rough-node .label text,#mermaid-svg-wV8cXAVpsqQzmMH3 .node .label text,#mermaid-svg-wV8cXAVpsqQzmMH3 .image-shape .label,#mermaid-svg-wV8cXAVpsqQzmMH3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-wV8cXAVpsqQzmMH3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .rough-node .label,#mermaid-svg-wV8cXAVpsqQzmMH3 .node .label,#mermaid-svg-wV8cXAVpsqQzmMH3 .image-shape .label,#mermaid-svg-wV8cXAVpsqQzmMH3 .icon-shape .label{text-align:center;}#mermaid-svg-wV8cXAVpsqQzmMH3 .node.clickable{cursor:pointer;}#mermaid-svg-wV8cXAVpsqQzmMH3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .arrowheadPath{fill:#333333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wV8cXAVpsqQzmMH3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wV8cXAVpsqQzmMH3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wV8cXAVpsqQzmMH3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster text{fill:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 .cluster span{color:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wV8cXAVpsqQzmMH3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wV8cXAVpsqQzmMH3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-wV8cXAVpsqQzmMH3 .icon-shape,#mermaid-svg-wV8cXAVpsqQzmMH3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wV8cXAVpsqQzmMH3 .icon-shape p,#mermaid-svg-wV8cXAVpsqQzmMH3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wV8cXAVpsqQzmMH3 .icon-shape .label rect,#mermaid-svg-wV8cXAVpsqQzmMH3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wV8cXAVpsqQzmMH3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wV8cXAVpsqQzmMH3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wV8cXAVpsqQzmMH3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 下载 ISO 安装镜像
新建虚拟机并创建 VMDK 虚拟磁盘
虚拟机光驱挂载 ISO
从 ISO 引导启动安装程序
安装程序把系统写入 VMDK
安装完成,卸载 ISO
虚拟机从 VMDK 正常启动
可以看到,ISO 只在安装阶段短暂参与,VMDK 才是虚拟机长期运行所依赖的存储。安装完成后,ISO 可以从虚拟光驱中移除,虚拟机依然能正常启动。
7. 常见转换与互操作
7.1 ISO 转 VMDK
严格来说,这不是"格式转换",而是把光盘内容写入虚拟磁盘。常见做法是:
- 新建一个空的 VMDK;
- 挂载 ISO 启动安装程序;
- 由安装程序把系统写入 VMDK。
也可以用 qemu-img 把 ISO 当作原始数据写入磁盘镜像,但这样得到的磁盘通常不可直接引导,因为缺少分区表和引导记录。
bash
# 把 ISO 内容原样写入一个新建的 raw 镜像(仅作数据搬运,通常不可引导)
qemu-img convert -f raw -O vmdk system.iso system.vmdk
7.2 VMDK 转 ISO
反过来,把 VMDK 转成 ISO 一般没有实际意义,因为 VMDK 里是带分区表的硬盘结构,而 ISO 是光盘文件系统。若确实需要,通常先挂载 VMDK 读取文件,再用 genisoimage / mkisofs 重新打包成 ISO。
bash
# 在 Linux 上挂载 VMDK 中的分区(需先转换为 raw 或用 qemu-nbd)
sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 disk.vmdk
sudo mount /dev/nbd0p1 /mnt
7.3 其他虚拟磁盘格式
VMDK 并非唯一选择,常见格式之间可以用 qemu-img 互相转换:
bash
# VMDK 转 QCOW2
qemu-img convert -f vmdk -O qcow2 disk.vmdk disk.qcow2
# VMDK 转 VHDX
qemu-img convert -f vmdk -O vhdx disk.vmdk disk.vhdx
8. 实践中的注意事项
- 不要混淆挂载方式:ISO 挂到虚拟光驱,VMDK 挂到虚拟硬盘控制器,位置错了虚拟机无法引导。
- 精简置备要留意空间:VMDK 精简置备文件会随写入增长,宿主机磁盘要留足余量。
- 快照不是备份:快照依赖基础 VMDK,删除基础盘会导致快照链失效。
- 迁移前先关机或静默:直接复制运行中的 VMDK 可能得到不一致的磁盘状态。
- 校验完整性:ISO 下载后建议核对 SHA256,避免安装中途失败。
9. 总结
ISO 与 VMDK 的关系可以这样理解:
- 本质不同:一个是光盘镜像,一个是虚拟硬盘。
- 角色互补:ISO 提供安装源,VMDK 提供运行存储。
- 流程衔接:安装阶段用 ISO 引导,安装完成后由 VMDK 独立承载系统。
把这两者的定位分清,在虚拟化环境里创建、安装、迁移和排障时就不会再被"到底该挂哪个文件"困扰。