Proxmox 导入 VHDX

Proxmox 支持导入 VHDX,但无法在创建 VM 时直接选择 VHDX 格式,需先转换为 Proxmox 支持的磁盘格式(raw 或 qcow2)。

TL;DR

  • 推荐直接用 qm importdisk,会根据存储类型自动转换(local → qcow2,local-lvm → raw)。
  • 大文件转换务必加 -p 看进度。
  • 来自 Hyper-V 的 VHDX 必须先删检查点、卸载 Hyper-V 集成服务,否则导入后启动会出问题。

导入前准备

导入前先确认 VHDX 状态:

1
2
3
4
5
# 检查完整性(修复/报错后不要继续)
qemu-img check windows.vhdx

# 查看虚拟大小、格式、是否有检查点
qemu-img info windows.vhdx

如果 VHDX 有 Hyper-V 检查点(checkpoint/snapshot),必须先在 Hyper-V 里合并或删除,否则只会导入父盘。

方法一:qm importdisk(推荐,PVE 7/8)

假设:

  • VM ID:100
  • VHDX 文件:/root/windows.vhdx
  • 存储:local-lvm

1. 创建一个空 VM

1
2
3
4
5
qm create 100 \
--name Windows \
--memory 8192 \
--cores 4 \
--net0 virtio,bridge=vmbr0

先不要创建硬盘。

2. 导入 VHDX

1
qm importdisk 100 /root/windows.vhdx local-lvm

qm importdisk 走的是 Proxmox Storage API,底层会调用 qemu-img convert,转换行为取决于目标存储:

目标存储 目标格式 文件位置
local qcow2 /var/lib/vz/images/100/...
local-lvm raw /dev/pve/vm-100-disk-0
其他存储 由插件决定

完成后会提示类似:

1
Successfully imported disk as unused0

3. 挂载硬盘

Web UI 路径:

1
2
3
4
5
VM
└── Hardware
└── Unused Disk 0
→ Edit
→ Bus/Device:VirtIO SCSI/SATA

或者命令:

1
qm config 100

看到类似:

1
unused0: local-lvm:vm-100-disk-0

挂载:

1
2
qm set 100 --scsi0 local-lvm:vm-100-disk-0
qm set 100 --scsihw virtio-scsi-single

4. 设置启动盘

1
qm set 100 --boot order=scsi0

方法二:先转换再导入

如果 qm importdisk 不支持你的 VHDX(例如某些老旧或损坏格式),可手动转换:

1
2
3
qemu-img convert -p -f vhdx -O qcow2 windows.vhdx windows.qcow2
# 或
qemu-img convert -p -f vhdx -O raw windows.vhdx windows.raw

-p 显示转换进度,大文件必备。

再导入:

1
qm importdisk 100 windows.qcow2 local-lvm

不同存储类型下的差异

存储 格式 导入命令 结果
local(目录) qcow2 qm importdisk 100 windows.vhdx local 生成 vm-100-disk-0.qcow2
local-lvm(默认) raw qm importdisk 100 windows.vhdx local-lvm 落在 /dev/pve/vm-100-disk-0
ceph / nfs 由插件 qm importdisk 100 windows.vhdx <storage> 视存储后端而定

Hyper-V 的 Windows 迁移注意事项

这是最容易踩坑的部分。

0. 导入前的清理

  1. 删除所有 Hyper-V 检查点,合并到父盘。
  2. 卸载 Hyper-V Integration Services(控制面板 → 程序 → 卸载),避免和 VirtIO 冲突。
  3. 关闭 Windows,导出 VHDX(不要导出运行中的虚机)。

1. 选择 BIOS 模式

源虚机 PVE BIOS 备注
Generation 2 OVMF (UEFI) Proxmox 会自动创建 EFI Disk
Generation 1 SeaBIOS 传统 BIOS

如果源虚机是 GPT 分区 + UEFI,必须用 OVMF;否则启动会卡在 No bootable device

2. 磁盘控制器与 VirtIO 驱动

初次启动务必先用 SATA 或 LSI 530/501 SCSI,不要直接用 VirtIO。

原因是 Windows 默认没有 VirtIO 磁盘/网卡驱动,直接挂 VirtIO 会出现:

  • INACCESSIBLE BOOT DEVICE 蓝屏
  • 启动卡住看不到磁盘

正确流程

  1. 先用 IDE/SATA 启动进入系统。
  2. 挂载 VirtIO ISO:virtio-win-XX.iso(Proxmox 主机已有,也可下载最新版)。
  3. 打开设备管理器,对带黄色叹号的设备「更新驱动」指向 ISO。
  4. 重启关机 → 把磁盘改到 VirtIO SCSI / 网卡改到 VirtIO。
  5. 再次启动,享受性能提升。

3. Secure Boot

如果启用 Secure Boot,需使用签名版的 VirtIO 驱动(viostor / NetKVM 在较新版本已签名)。最省事的做法是先关闭 Secure Boot 装好驱动,再按需开启。

4. 验证 VirtIO 驱动已安装

1
2
Get-WindowsDriver -Online -DriverClass DiskDrive
Get-WindowsDriver -Online -DriverClass Net

应该能看到 vioscsiviostorNetKVM

常见问题

qm importdisk 报 I/O error

通常是 VHDX 文件损坏或带检查点。先 qemu-img check windows.vhdx 排查。

磁盘在 Web UI 显示但启动找不到

  • 检查 BIOS 模式是否匹配(UEFI ↔ Legacy)。
  • qm config 100--boot order 是否正确。
  • OVMF 下确认 EFI Disk 已创建并被识别。

启动后蓝屏 INACCESSIBLE BOOT DEVICE

未装 VirtIO 驱动却用了 VirtIO 磁盘控制器。切回 SATA/IDE 启动再补驱动。

磁盘没出现在 Unused Disk

1
qm rescan 100

或在 Web UI 刷新。LVM-Thin 下偶尔需要 lvscan

导入后磁盘空间「变大」

VHDX 是稀疏格式,导入到 LVM-Thin (raw) 后会按虚拟大小占用。如果空间紧张,导入后可在 Windows 内压缩卷或扩容到合适大小。