# 如何从 VMWare 导入传统 Windows 虚拟机到云原生虚拟机平台
本文将详细介绍如何通过命令行将外部平台 VMware 上的虚拟机导入到 DCE 5.0 的虚拟机中。
!!! info
本文档外部虚拟平台是 VMware vSphere Client,后续简写为 vSphere。
技术上是依靠 kubevirt cdi 来实现的。操作前,vSphere 上被导入的虚拟机需要关机。
以 Windows 操作系统的虚拟机为例。
## 环境准备
导入前,需要参考[网络配置](../vm/vm-network.md)准备环境。
### 获取 Windows 虚拟机的信息
与导入 Linux 操作系统的虚拟机类似,可参考[如何从 VMWare 导入传统 Linuxs 虚拟机到云原生虚拟机平台](import-ubuntu.md)获取以下信息:
- 获取 vSphere 账号密码
- 获取 vSphere 虚拟机信息
### 检查 Windows 的引导类型
将外部平台的虚拟机导入到 DCE 5.0 的虚拟化平台中时,需要根据虚拟机的启动类型(BIOS 或 UEFI)进行相应的配置,以确保虚拟机能够正确启动和运行。
可以通过"系统信息"检查 Windows 是 BIOS 还是 UEFI 引导。如果是 UEFI 则需要在 YAML 文件中添加相关信息。
![系统信息](../images/window-uefi.png)
## 导入过程
准备 `window.yaml` 文件,注意以下配置项
- 引导 Virtio 驱动的 PVC
- 磁盘总线类型,根据引导类型设置为 sata 或 virtio
- 如果使用 UEFI,需要添加 UEFI 配置
点击查看 window.yaml 示例
```yaml title="window.yaml"
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
labels:
virtnest.io/os-family: windows
virtnest.io/os-version: "server2019"
name: export-window-21
namespace: default
spec:
dataVolumeTemplates:
- metadata:
name: export-window-21-rootdisk
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 22Gi
storageClassName: local-path
source:
vddk:
backingFile: "[A05-09-ShangPu-Local-DataStore] virtnest-export-window/virtnest-export-window.vmdk"
url: "https://10.64.56.21"
uuid: "421d40f2-21a2-cfeb-d5c9-e7f8abfc2faa"
thumbprint: "D7:C4:22:E3:6F:69:DA:72:50:81:12:FA:42:18:3F:29:5C:7F:41:CA"
secretRef: "vsphere21"
initImageURL: "release.daocloud.io/virtnest/vddk:v8"
- metadata:
name: export-window-21-datadisk
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
source:
vddk:
backingFile: "[A05-09-ShangPu-Local-DataStore] virtnest-export-window/virtnest-export-window_1.vmdk"
url: "https://10.64.56.21"
uuid: "421d40f2-21a2-cfeb-d5c9-e7f8abfc2faa"
thumbprint: "D7:C4:22:E3:6F:69:DA:72:50:81:12:FA:42:18:3F:29:5C:7F:41:CA"
secretRef: "vsphere21"
initImageURL: "release.daocloud.io/virtnest/vddk:v8"
# <1>. 引导 virtio 驱动的 pvc
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
- metadata:
name: virtio-disk
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: local-path
source:
blank: {}
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
running: true
template:
metadata:
annotations:
ipam.spidernet.io/ippools: '[{"cleangateway":false,"ipv4":["test86"]}]'
spec:
dnsConfig:
nameservers:
- 223.5.5.5
domain:
cpu:
cores: 2
memory:
guest: 4Gi
devices:
disks:
- bootOrder: 1
disk:
bus: sata # <2> 磁盘总线类型,根据引导类型设置为 sata 或 virtio
name: rootdisk
- bootOrder: 2
disk:
bus: sata # <2> 磁盘总线类型,根据引导类型设置为 sata 或 virtio
name: datadisk
# <1>. 引导 virtio 驱动的 disk
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
- bootOrder: 3
disk:
bus: virtio
name: virtdisk
- bootOrder: 4
cdrom:
bus: sata
name: virtiocontainerdisk
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
interfaces:
- bridge: {}
name: ovs-bridge0
# <3> 在上文“查看 window 引导是 BIOS 还是 UEFI”
# 如果使用了 UEFI 需要添加的信息
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
features:
smm:
enabled: true
firmware:
bootloader:
efi:
secureBoot: false
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
machine:
type: q35
resources:
requests:
memory: 4Gi
networks:
- multus:
default: true
networkName: kube-system/test1
name: ovs-bridge0
volumes:
- dataVolume:
name: export-window-21-rootdisk
name: rootdisk
- dataVolume:
name: export-window-21-datadisk
name: datadisk
# <1> 引导 virtio 驱动的 volumes
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
- dataVolume:
name: virtio-disk
name: virtdisk
- containerDisk:
image: release-ci.daocloud.io/virtnest/kubevirt/virtio-win:v4.12.12-5
name: virtiocontainerdisk
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
```
### 通过 VNC 安装 VirtIO 驱动
1. 通过 VNC 访问和连接到虚拟机。
2. 根据 Windows 版本下载并安装相应的 VirtIO 驱动程序。
3. 可以开启远程桌面(Remote Desktop),方便在后续通过远程桌面协议(RDP)连接到虚拟机。
4. 安装完成后,重启虚拟机后更新 YAML。
![下载 VirtIO 1](../images/install01.png)
![下载 VirtIO 2](../images/install02.png)
![开启远程桌面Remote Desktop](../images/turn-on.png)
### 重启后更新 YAML
点击查看修改后的 window.yaml 示例
```yaml title="window.yaml"
# 删除 标号 <1> 相关字段,修改标号 <2> 字段:sata 改成 virtio
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
labels:
virtnest.io/os-family: windows
virtnest.io/os-version: "server2019"
name: export-window-21
namespace: default
spec:
dataVolumeTemplates:
- metadata:
name: export-window-21-rootdisk
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 22Gi
storageClassName: local-path
source:
vddk:
backingFile: "[A05-09-ShangPu-Local-DataStore] virtnest-export-window/virtnest-export-window.vmdk"
url: "https://10.64.56.21"
uuid: "421d40f2-21a2-cfeb-d5c9-e7f8abfc2faa"
thumbprint: "D7:C4:22:E3:6F:69:DA:72:50:81:12:FA:42:18:3F:29:5C:7F:41:CA"
secretRef: "vsphere21"
initImageURL: "release.daocloud.io/virtnest/vddk:v8"
- metadata:
name: export-window-21-datadisk
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
source:
vddk:
backingFile: "[A05-09-ShangPu-Local-DataStore] virtnest-export-window/virtnest-export-window_1.vmdk"
url: "https://10.64.56.21"
uuid: "421d40f2-21a2-cfeb-d5c9-e7f8abfc2faa"
thumbprint: "D7:C4:22:E3:6F:69:DA:72:50:81:12:FA:42:18:3F:29:5C:7F:41:CA"
secretRef: "vsphere21"
initImageURL: "release.daocloud.io/virtnest/vddk:v8"
running: true
template:
metadata:
annotations:
ipam.spidernet.io/ippools: '[{"cleangateway":false,"ipv4":["test86"]}]'
spec:
dnsConfig:
nameservers:
- 223.5.5.5
domain:
cpu:
cores: 2
memory:
guest: 4Gi
devices:
disks:
- bootOrder: 1
disk:
bus: virtio # <2>
name: rootdisk
- bootOrder: 2
disk:
bus: virtio # <2>
name: datadisk
interfaces:
- bridge: {}
name: ovs-bridge0
# <3> 在上文“查看 window 引导是 BIOS 还是 UEFI”
# 如果使用了 UEFI 需要添加的信息
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
features:
smm:
enabled: true
firmware:
bootloader:
efi:
secureBoot: false
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
machine:
type: q35
resources:
requests:
memory: 4Gi
networks:
- multus:
default: true
networkName: kube-system/test1
name: ovs-bridge0
volumes:
- dataVolume:
name: export-window-21-rootdisk
name: rootdisk
- dataVolume:
name: export-window-21-datadisk
name: datadisk
```
### RDP 访问和验证
- 使用 RDP 客户端连接到虚拟机。输入默认账号 `admin` 和密码 `dangerous!123` 进行登录。
![访问虚拟机](../images/pc.png)
- 验证网络访问和数据盘数据
![验证网络](../images/windows-network.png)
![查看数据盘数据](../images/disk.png)
## 对比导入 Linux 和 Windows 虚拟机的差异
- Windows 可能需要 UEFI 配置。
- Windows 通常需要安装 VirtIO 驱动。
- Windows 多磁盘导入通常不需要重新挂载磁盘。