宿主机要重启、业务不能停?KVM 热迁移 + NFS 共享存储实操记录

发布时间:2026/10/28 10:14:17
宿主机要重启、业务不能停?KVM 热迁移 + NFS 共享存储实操记录 生产机上的一次重启往往意味着一片业务的停顿。KVM 热迁移要解决的就是这件事把一台正在运行的虚拟机从 A 宿主机搬到 B 宿主机业务几乎无感知。这篇用一套三节点实验KVM1 / KVM2 / NFS走完「克隆 → 配网络 → 搭共享存储 → 建虚拟机 → 迁移 → 验收 → 迁回」的完整链路并把课件里没写的迁移命令、SSH 免密前提和回退步骤一并补齐。文中命令名均标注英文全称如virsh virtual shell完整清单见文末《附命令英文全称速查表》。本文概要项目内容文章主题KVM 虚拟机热迁移的完整实验流程共享存储搭建、迁移命令、验收与回退所属类别云计算 → 虚拟化 → KVM 运维知识关键字virsh migrate·--live·virt-clone·nfs-server·showmount -e·exports·_netdev·nofail·virt-install·pool-define-as主线导读这篇分两条线走。第一条是步骤线第四到八章照着敲就能把虚拟机从 KVM1 搬到 KVM2第二条是原理线第一到三章讲清「为什么磁盘不用搬」「什么条件下才迁得动」。命令的参数解释集中在各命令小节步骤线里只给要敲的命令本身。一、热迁移在搬什么磁盘不动只搬内存与 CPU 状态热迁移live migration指虚拟机保持开机运行的前提下从一台宿主机转移到另一台。整个过程业务侧只感知到一次极短的卡顿通常是几十毫秒到几秒。1.1 搬过去的是三样东西搬运对象说明内存虚拟机当前的全部内存页分多轮迭代搬完CPU 设备状态vCPU 寄存器、中断控制器状态、时钟偏移虚拟机定义XML 配置在目标端重建保证迁移后配置一致磁盘不在搬运清单里。源与目标宿主机必须同时能访问同一份虚拟磁盘磁盘留在原处两边只是切换「谁在读谁在写」。这就是共享存储成为核心前提的原因。1.2 迭代迁移为什么要搬好几轮内存不是一块静止的快照。迁移期间虚拟机还在跑内存页持续被改写第一轮搬过去的页面到第二轮可能又脏了。解决办法是多轮迭代第一轮把全量内存页搬到目标端期间被改写的页标记为「脏页」下一轮只搬脏页每轮搬运的增量越来越小小到一定程度时暂停源虚拟机通常几十毫秒把最后剩余部分一次性搬完目标端恢复运行源端清理。这也是热迁移有「可容忍短时间中断」说法的由来——中断只发生在最后暂停的那一瞬间。1.4 四种可用的共享存储课件列了 NFS / Ceph / RBD / iSCSI 四种实际选型看规模方案形态适合场景注意事项NFS文件级共享实验环境、中小规模依赖网络延迟敏感型业务要评估iSCSI块级共享已有 SAN 的环境需要多路径配置防单点Ceph RBD分布式块存储中大型云平台三副本起步成本高Ceph FS分布式文件存储与 KVM 深度整合调优项多运维门槛高本实验用 NFS是因为它配置最简、三台机器就能验证完整链路。生产上 Ceph 与 iSCSI 更常见但迁移命令与前置条件完全一样——换掉的只是「磁盘放在哪」。1.3 与另外两种迁移的对照迁移类型虚拟机状态中断时长适用场景冷迁移静态迁移关机分钟级停机窗口充足的维护热迁移动态迁移保持运行毫秒到秒级不能停的业务课件里「用于可容忍短时间中断但必须要快速恢复业务。比如轻量级数据库业务桌面云业务」说的就是热迁移的适用边界高并发写密集的业务要谨慎内存脏页产生速度超过搬运速度时迁移可能迟迟无法收敛。二、什么时候用三个真实场景场景动因迁移方向服务器维护前要重启 / 换硬件先把虚拟机挪走迁出 → 维护完迁回服务器升级前升级过程有中断风险迁出 → 升级完迁回整合闲置资源把空闲机上的虚拟机集中关掉空机器迁往集中节点第三类是数据中心最常用的一台物理机上跑着几十台虚拟机运维可以把它们均匀分布到少数几台然后关掉完全空载的机器省电。三、前置条件四项迁移开始前逐项自查任何一项不满足都会在中途失败磁盘在共享存储上且源与目标宿主机都能访问。可用 NFS / Ceph / RBD / iSCSI。目标端有一台规格相同的空虚拟机CPU 核数、内存大小一致。名字可以与源相同也可以不同。两台宿主机之间网络可达且建议关闭防火墙本实验systemctl stop firewalld.service。生产环境应改为放行迁移所需端口。能接受一次短时间中断。业务层要有重连机制数据库类业务要确认连接池会重试。⚠️注意共享存储上的磁盘文件不能被任何一方以独占方式打开。如果源虚拟机磁盘还在 KVM1 的本地目录即使手工把文件复制到 NFS 上再改 XML 指向它也会因为缓存不一致导致数据损坏——必须在共享存储上重新创建虚拟机或先把磁盘转成共享存储上的 raw/qcow2 文件。四、搭环境从一台 KVM 克隆出三节点实验拓扑KVM1 是已经做完单机实验的宿主机从它完整克隆出 KVM2 和 NFS三台机器通过192.168.108.0/24网段互通。4.1 完整克隆 KVM1 → KVM2 / NFS克隆前先还原 KVM1 的快照保证源状态干净。virt-manager 里右键虚拟机 → 克隆 →选择完整克隆不要链接克隆完整克隆才是一份独立磁盘。# KVM1 上操作命令行等价写法virt-clone--originalkvm-node--nameKVM2--auto# --auto自动生成磁盘与 MACvirt-clone--originalkvm-node--nameNFS--autovirt-clone用法速查表参数含义英文原意--original源虚拟机名original--name新虚拟机名name--auto自动生成磁盘文件名与 MAC 地址auto--replace目标已存在时直接覆盖不再询问replace--file指定新磁盘路径默认与源同目录file完整克隆与链接克隆的区别完整克隆把磁盘完整复制一份新机器与原机器互不影响链接克隆只建一个差异盘原机器的磁盘文件被删链接克隆立刻失效。要做迁移实验必须用完整克隆。4.2 改主机名与 IP三台机器开机顺序先 KVM1再依次开 KVM2、NFS。逐台改主机名和 IP。# KVM1 上把克隆出来的机器改成 KVM2[rootKVM1 ~]# hostnamectl set-hostname KVM2[rootKVM1 ~]# bash # 换 shell 让新主机名生效[rootKVM2 ~]#[rootKVM2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160TYPEEthernetBOOTPROTOnoneONBOOTyesIPADDR192.168.108.102# 改成本机 IPPREFIX24GATEWAY192.168.108.2#UUID3b58adc4-7bfb-4ce7-bdc5-7893a708ebb3 ← 这一行必须删掉[rootKVM2 ~]# nmcli connection reload ens160 # 让配置生效[rootKVM2 ~]# ip addr show ens160 # 验证地址已变机器IP角色KVM1192.168.108.101源宿主机KVM2192.168.108.102目标宿主机NFS192.168.108.100共享存储⚠️注意克隆出来的机器带着和源机器相同的 UUID网卡配置文件里那行#UUID不删两台机器会有相同的网卡标识nmcli会拒绝加载并报「连接已存在」。NFS 那台同样照此办理IP 改成192.168.108.100。4.3 三节点 hosts 同步迁移命令要用主机名互访先把 hosts 配好再复制到另外两台# KVM1 上操作[rootKVM1 ~]# cat /etc/hosts EOF192.168.108.100 NFS192.168.108.101 KVM1192.168.108.102 KVM2 EOF[rootKVM1 ~]# scp /etc/hosts rootKVM2:/etc/hosts # 复制到 KVM2[rootKVM1 ~]# scp /etc/hosts rootNFS:/etc/hosts # 复制到 NFS五、NFS 共享存储让两台 KVM 看到同一份磁盘5.1 /etc/exports 五个参数逐个讲[rootNFS ~]# mkdir /nfs # 用于共享的目录[rootNFS ~]# vim /etc/exports/nfs *(rw,no_root_squash,no_subtree_check)参数含义英文原意/nfs共享出去的目录第一列固定是路径导出路径*允许所有网段访问通配所有客户端rw客户端对该目录有读写权限read-writeno_root_squash客户端用 root 访问时不映射 root不压缩 rootno_subtree_check不检查父目录权限不检查子树root_squash默认行为会把客户端的 root 映射成匿名用户虚拟机的磁盘文件以 root 身份写入时就会权限不足所以这里必须写no_root_squash。5.2 服务端验证本地先通[rootNFS ~]# systemctl restart nfs-server.service # 重启 NFS 服务[rootNFS ~]# showmount -e localhost # 本地测试共享成功没Export listforlocalhost: /nfs *[rootNFS ~]# systemctl stop firewalld.service # 停止防火墙服务5.3 客户端验证跨机能看见# 在 KVM1、KVM2 上分别执行[rootKVM1 ~]# showmount -e 192.168.108.100Export listfor192.168.108.100: /nfs *[rootKVM1 ~]# mkdir /NFS[rootKVM2 ~]# mkdir /NFS两级验证都要过本地showmount -e localhost能列出来说明服务端导出正常跨机showmount -e NFS IP能列出来说明网络与防火墙没挡。只过第一级就往下走是新手最常卡住的地方。5.4 挂载与持久化临时挂载用于立即验证写进 fstab 才能重启后还在mount-tnfs192.168.108.100:/nfs /NFS# 临时挂载df-h/NFS# 验证应看到 192.168.108.100:/nfs# /etc/fstab 追加一行192.168.108.100:/nfs /NFS nfs defaults,_netdev,nofail00选项作用英文原意_netdev声明这是网络挂载等网络就绪后再挂network devicenofail挂不上也不阻塞启动no fail_netdev不加开机时网卡还没起来就去挂 NFS必然失败nofail不加NFS 那台没开会让本机卡在启动阶段。两个都写是网络存储 fstab 的固定写法。六、KVM 挂载 NFS 存储池并在共享存储上建虚拟机6.1 图形化添加存储池virt-manager 里选中 KVM1 → 左下角添加新存储字段填法TypenetfsTarget Path/NFS本机挂载目录Host NameNFS的地址Source Path/nfsNFS 共享目录KVM2 做同样的操作。6.2 命令行等价写法图形化点选背后是这几条命令脚本化部署时直接抄[rootKVM1 ~]# virsh pool-define-as nfs-pool netfs \--source-host192.168.108.100 --source-path /nfs--target/NFS[rootKVM1 ~]# virsh pool-build nfs-pool # 建挂载点目录[rootKVM1 ~]# virsh pool-start nfs-pool # 挂载[rootKVM1 ~]# virsh pool-autostart nfs-pool # 设开机自启[rootKVM1 ~]# virsh pool-list --details # 验证state 应为 runningpool-define-as用法速查表参数含义英文原意名称存储池名字位置参数netfs池类型网络文件系统network file system--source-hostNFS 服务器地址source host--source-pathNFS 上共享出来的目录source path--target本机的挂载点目录targetpool-define-as只是把定义写进 libvirt 配置并不会真的挂上。pool-build建目录、pool-start才执行挂载三步缺一不可。6.3 在共享存储上创建虚拟机上传 CentOS 镜像到 KVM1然后创建虚拟机磁盘位置选共享存储# 命令行写法磁盘放在 nfs-pool 里virt-install--namevm-web01--ram2048--vcpus2\--diskpoolnfs-pool,size20,busvirtio\--cdrom/var/lib/libvirt/images/CentOS-stream-9.iso\--networknetworkdefault--graphicsvnc,listen0.0.0.0\--os-variant centos-stream9--disk poolnfs-pool,size20指定磁盘建在存储池里。正常装完系统重启时会自动弹出光盘。virt-install用法速查表全文仅此一张两处示例共用参数含义英文原意--name虚拟机名称name--ram内存大小单位 MBrandom access memory--vcpus虚拟 CPU 核数virtual CPUs--disk磁盘可写pool池名,sizeGB,bus总线disk--cdrom挂载安装镜像CD-ROM--network网络可写network网络名network--graphics图形方式vnc,listen0.0.0.0监听所有地址graphics--os-variant操作系统类型影响默认硬件配置OS variant--noautoconsole不自动打开控制台窗口no auto console--print-xml只打印 XML 不真正创建常配管道给virsh defineprint XML--location指定安装源网络仓库或 ISO 路径location--print-xml | virsh define /dev/stdin这个组合很常用先生成 XML 再定义得到一台不装系统的空虚拟机正是热迁移目标端需要的形态。七、执行迁移两条路7.1 前置目标端建好空虚拟机 SSH 免密迁移的目标端要先有一台规格相同的空虚拟机。用virt-clone带--replace不适用源还在跑正解是直接建一台不装系统的# KVM2 上建一台同规格空虚拟机不装系统virt-install--namevm-web01--ram2048--vcpus2\--diskpoolnfs-pool,size20,busvirtio\--networknetworkdefault--graphicsvnc\--os-variant centos-stream9--noautoconsole--print-xml|virshdefine /dev/stdin再配 SSH 免密virsh migrate走的是 libvirt 远端协议# KVM1 上操作[rootKVM1 ~]# ssh-keygen -t ed25519 -N -f /root/.ssh/id_ed25519[rootKVM1 ~]# ssh-copy-id rootKVM2 # 输入 KVM2 的 root 密码一次[rootKVM1 ~]# ssh rootKVM2 virsh --version # 验证免密可用7.2 virsh migrate参数逐个表virshmigrate--live--persistent--undefinesource\vm-web01 qemussh://KVM2/system参数含义英文原意--live热迁移虚拟机不停机在线--persistent目标端配置持久化重启后仍在持久--undefinesource迁移成功后删除源端虚拟机定义取消源定义--copy-storage-all磁盘也一起复制非共享存储场景复制全部存储--change-protection禁止迁移期间被意外中断保护模式qemussh://KVM2/system目标 libvirt 地址qemu 协议 SSH 通道--undefinesource对应课件里「将源虚拟机删除」那一步。如果不加KVM1 上会留下一份已关机的同名定义之后在 KVM1 上误启动会同时挂载同一份磁盘造成数据损坏。7.3 图形化迁移virt-manager 里右键虚拟机 →Migrate迁移填目标主机名KVM2勾选「迁移后删除源定义」等待进度条走完。图形化本质就是调用同一条virsh migrate --live。7.4 迁移前的最后一步关防火墙# KVM1、KVM2 都要执行[rootKVM1 ~]# systemctl stop firewalld.service[rootKVM2 ~]# systemctl stop firewalld.service7.5 迁移过程的实时观测迁移是异步进行的命令返回后作业仍在后台跑。用domjobinfo看进度# 在 KVM1 上执行另开一个终端[rootKVM1 ~]# virsh domjobinfo vm-web01Job type: Virtual machine migration Operation: Outgoing migration Time elapsed:8124ms Time remaining:43876ms Data processed:1.125GiB Data remaining:2.875GiB Memory processed:1.125GiB Memory remaining:2.875GiB Expected downtime:12ms Compression cache:256.5MiB字段含义怎么用Data processed/Data remaining已搬 / 待搬的内存总量估算还要多久Expected downtime预计的最后一次暂停时长判断业务能否接受Memory bandwidth当前搬运速率过低说明网络或磁盘是瓶颈⚠️ 关注Expected downtime它随迭代轮次逐步收敛。若长时间停留在几百毫秒以上说明脏页产生速度接近搬运速度迁移可能迟迟无法完成——写密集型业务要警惕这一点。7.6 限速与大规模迁移一次迁走十几台虚拟机会把网络占满影响同网段的其他业务。virsh migrate-setmaxdowntime控制暂停时长上限带宽则靠存储与网络侧控制# 在 KVM1 上执行[rootKVM1 ~]# virsh migrate-setmaxdowntime vm-web01 500 # 暂停上限 500 毫秒[rootKVM1 ~]# virsh migrate-setmaxdowntime vm-web01 0 # 0 取消上限尽快完成暂停上限越大总迁移时间越短省去反复迭代但业务中断感越明显上限越小中断越短总时间越长。生产上按业务的敏感程度折中取 100~500 毫秒。八、验收与回退8.1 四项验收迁移命令返回即算成功但要确认真的落在 KVM2 上# 在 KVM2 上执行[rootKVM2 ~]# virsh list --all # 状态应为 running[rootKVM2 ~]# virsh domblklist vm-web01 # 磁盘应指向 /NFS 下的共享文件[rootKVM2 ~]# virsh domjobinfo vm-web01 # 无进行中的作业# 在虚拟机内部执行ipaddr show ens160# 业务连通性仍在IP 未变domblklist是最关键的一条如果磁盘还指向 KVM1 的本地路径说明这台虚拟机根本没建在共享存储上之前几步有遗漏。8.2 中途失败的回退迁移过程中中断源虚拟机通常仍在运行业务不受影响。若源端状态异常# KVM1 上执行[rootKVM1 ~]# virsh list --all # 确认源还在[rootKVM1 ~]# virsh domjobabort vm-web01 # 放弃未完成的迁移作业[rootKVM1 ~]# virsh snapshot-revert vm-web01 clean # 必要时还原到迁移前的快照8.3 迁回 KVM1维护 / 升级完成后原路迁回方向反过来即可# 在 KVM2 上操作[rootKVM2 ~]# virsh migrate --live --persistent --undefinesource \vm-web01 qemussh://KVM1/system九、踩坑记录现象根因处置nmcli connection reload后 IP 没变配置文件里 UUID 行没删加载的是旧连接删#UUID行后重新 reloadshowmount -e IP超时防火墙没关或 NFS 服务没起systemctl stop firewalldsystemctl restart nfs-server客户端 root 写不进共享目录exports 用了默认的root_squash改成no_root_squash并exportfs -r迁移报磁盘路径不可访问磁盘不在共享存储或在 KVM1 本地在共享存储池上重建虚拟机迁移后 KVM1 仍留同名定义漏加--undefinesource手工virsh undefine vm-web01十、补遗libvirt 工具族与虚拟化产品清单10.1 virt-viewer只做一件事的图形控制台项说明作用连接虚拟机的 VNC / SPICE 画面单独弹出窗口不管什么不创建、不修改、不删除虚拟机典型用法virt-viewer --connect qemu:///system vm-web01virt-manager 内置的虚拟机控制台就是调用它。只想看一台机器屏幕时单独开一个 viewer 比打开整个管理界面轻。10.2 virt-sysprep镜像交付前的清理把虚拟机转成模板前用它清掉机器相关的身份信息避免克隆出来的机器主机名、SSH 主机密钥、MAC 缓存全一样virt-sysprep-dvm-web01# 直接作用于一台已关机的虚拟机清理项说明主机名与 /etc/hosts还原成默认值SSH 主机密钥删除下次开机重新生成网卡 MAC 与 udev 持久化规则清除日志与历史记录清空⚠️ 操作前必须关机且不可逆建议先做一份快照。10.3 常见虚拟化产品对照产品定位KVMLinux 内核虚拟化模块开源云厂商主流QEMU硬件模拟器常与 KVM 配合做 I/O 虚拟化XenHypervisor 在操作系统之下Dom0 管理域VMware ESX / ESXi商业 HypervisorvSphere 体系核心Microsoft Hyper-VWindows Server 内置虚拟化Virtuozzo容器级虚拟化共享内核LXCLinux 容器操作系统级隔离FusionCompute华为服务器虚拟化产品 参考资料官方文档 · 中英双语英文原版virsh 命令行工具手册libvirt 迁移官方文档exports 文件格式手册man7中文版在 Linux ECS 上挂载 NFS 协议文件系统阿里云其余手册在服务器上直接查showmount、exportfs、mount.nfs等无需联网man1virsh# 虚拟机管理命令man1virt-install# 创建虚拟机man1virt-clone# 克隆虚拟机man1virt-sysprep# 镜像清理man5exports# NFS 导出配置man8exportfs# 导出表维护man8showmount# 查看 NFS 导出表man8nfsd# NFS 服务端守护进程附命令英文全称速查表命令 / 缩写英文全称 / 原意作用virshvirtual shelllibvirt 命令行管理工具virt-installvirtual install命令行创建虚拟机virt-clonevirtual clone克隆虚拟机virt-viewervirtual viewer虚拟机图形控制台virt-sysprepvirtual system preparation虚拟机镜像清理migratemigrate虚拟机迁移NFSNetwork File System网络文件系统nfs-serverNFS serverNFS 服务端showmountshow mount查看 NFS 导出表exportsexportsNFS 导出配置文件exportfsexport file system维护导出表TCOTotal Cost of Ownership总体拥有成本总结热迁移的关键不在那条virsh migrate命令而在它前面的准备——磁盘必须落在 NFS / Ceph 这类共享存储上目标端要有同规格空虚拟机两台宿主机之间 SSH 免密与防火墙都要提前打通。这篇的三节点实验把这四件事按顺序做完了命令可以直接照着敲。同系列 · KVM 虚拟化实战上一篇《KVM 虚拟机管理virt-manager 与 virsh 命令速查手册》相关篇《KVM 装完连不上VNC、光驱、快照三类坑的排错实录》相关篇《虚拟化到底虚拟了什么CPU、内存、IO 三层原理拆解》⬅️ 上一篇KVM 虚拟机管理与命令速查 ➡️ 下一篇ESXi 嵌套部署与磁盘置备 你迁移虚拟机时踩过什么坑Permission denied还是磁盘路径不可访问评论区贴出报错一起看。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询