共享存储必须提前挂载且路径完全一致,热迁移仅同步内存状态而非复制磁盘文件;nfs是最常用选择,但两台宿主机的挂载点必须均为/var/lib/libvirt/images,且需配置--live和--unsafe参数、同名网桥、兼容cpu模型。

共享存储必须提前挂载且路径完全一致
热迁移不是复制磁盘文件,而是同步内存状态,所以虚拟机磁盘镜像必须对两台宿主机“同时可见”。NFS 是最常用也最稳妥的选择,但容易踩的坑是:/var/lib/libvirt/images 这个默认路径在两边宿主机上必须是同一个 NFS 挂载点,不能一边挂到 /mnt/nfs、另一边挂到 /data/vms —— 否则 virsh migrate 会报 cannot access storage file 错误。
实操建议:
- 在 NFS 服务端(比如
192.168.31.194)导出目录时用/var/lib/libvirt/images *(rw,sync,no_root_squash),避免权限问题 - 两台宿主机都执行:
mount -t nfs 192.168.31.194:/var/lib/libvirt/images /var/lib/libvirt/images,并写入/etc/fstab - 验证:两边都运行
ls -l /var/lib/libvirt/images/myvm1.qcow2,确保属主是root:root且可读写
virsh migrate 命令必须带 --live 和 --unsafe 参数
virsh migrate 默认是冷迁移;漏掉 --live 就会停机,失去“在线”意义。而 --unsafe 不是可选项——当目标主机没有同名定义、或磁盘路径未被 libvirt 自动识别时,不加它会直接报错 operation failed: domain 'myvm1' already exists on destination host 或 unable to get disk source path。
典型命令格式:
virsh migrate --live --unsafe myvm1 qemu+ssh://192.168.31.203/system
注意点:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
qemu+ssh://表示走 SSH 传输控制指令,不是传磁盘数据(磁盘已在共享存储上) - 目标主机必须已安装
libvirt-daemon-system并启动libvirtd服务 - 源宿主机需配置到目标主机的 SSH 免密登录,且双方
/etc/hosts中必须有对方的 FQDN 解析(例如kvm02.example.com),否则报Failed to connect to remote libvirt URI
网络桥接设备名和 MAC 地址必须保持一致
迁移后虚拟机网卡如果无法获取 IP 或直接断网,大概率是桥接配置不匹配。KVM 默认使用 virbr0,但它只是 NAT 模式,不适用于跨宿主机通信。你得手动创建一个同名的 Linux 网桥(如 br0),并在两台宿主机上绑定同一张物理网卡(如 ens33),且确保 STP 关闭、forward_delay 设为 0。
关键验证步骤:
- 两边都运行:
ip link show br0和brctl show br0,确认状态为UP且含物理网卡 - 虚拟机 XML 中的
<interface type="bridge"></interface>必须指定<source bridge="br0"></source>,不能用network='default' - 虚拟机内部的网卡 MAC 地址不能变,否则 DHCP 可能分配新 IP;可在
virsh edit myvm1中固定<mac address="52:54:00:12:34:56"></mac>
CPU 模型必须兼容,否则迁移中途失败
KVM 热迁移要求源和目标宿主机 CPU 基本指令集一致。如果一边是 Intel Xeon、一边是 AMD EPYC,即使都开了 SVM/VT-x,virsh migrate 也会在“最终切换”阶段卡住,日志里出现 failed to start domain on destination: internal error: unable to execute QEMU command 'cont': Device 'cpu' is not available。
解决方法只有两个:
- 在虚拟机 XML 中显式指定兼容 CPU 模型:
<cpu mode="host-passthrough" fallback="allow"></cpu>改为<cpu mode="host-model" check="partial"></cpu>,让 libvirt 自动降级到双方共有的 feature 集 - 更稳妥的是统一用
qemu64模型:<cpu mode="custom" match="exact"><model fallback="forbid">qemu64</model></cpu>,牺牲少量性能换取稳定性 - 迁移前务必在两边运行
kvm-ok和lscpu | grep -E "(Model|Flags)"对比基础信息
真正麻烦的从来不是命令敲几遍,而是共享存储挂载点路径、网桥名、CPU 模型这三处细微不一致——它们不会在迁移开始时报错,而是在“快成功时”突然中断,且错误日志分散在 /var/log/libvirt/qemu/myvm1.log 和 journalctl -u libvirtd 里,需要交叉比对才能定位。










