KVM虚拟化保姆级实战:图形界面建机 + virsh命令管理 + 热迁移全流程,一篇打通!

KVM虚拟化保姆级实战:图形界面建机 + virsh命令管理 + 热迁移全流程,一篇打通!

无论是桌面云、轻量级数据库,还是日常服务器运维,KVM 都是云计算底层绕不开的虚拟化技术。本文基于实战笔记整理,从 virt-manager 图形界面创建虚拟机,到 virsh 命令行全量管理,再到基于 NFS 共享存储的热迁移实验,一步一图带你跑通 KVM 全流程,适合入门到进阶的云计算学习者。


一、KVM 是什么?为什么值得学?

KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是 Linux 内核自带的全虚拟化方案。它把 Linux 内核直接变成一个 Hypervisor(虚拟机监视器),配合 QEMU 完成设备模拟,配合 libvirt 提供统一管理接口,是目前 OpenStack、云桌面、企业私有云最主流的底层虚拟化技术之一。

学习 KVM 你只需要掌握两条主线:

主线 工具 作用
图形化操作 virt-manager 可视化创建、管理虚拟机,适合新手入门
命令行操作 virsh / virt-install / qemu-img 生产环境批量管理、无人值守自动化,必会技能

环境说明:本文实验基于 RHEL 8 / CentOS 8 系宿主机,虚拟化软件版本为 libvirt 8.0.0、QEMU 6.2.0。


二、 KVM安装方式-两种

2.1 系统自带

主要是安装处理器选择和虚拟化主机选择,其他步骤跟正常安装虚拟机一样,默认选择

2.2 yum方式安装

选择图形化安装,其他步骤跟正常安装虚拟机一样,默认选择

bash 复制代码
# 在 CentOS/RHEL 系统上,通过 yum 一键安装全套 KVM 虚拟化软件(相当于把系统变成一台 "Linux 版的 ESXi")
yum group install "Virtualization*" -y

三、图形界面篇:virt-manager 创建 Windows 虚拟机

1. 呼出 virt-manager 的两种方式

方式一:图形界面调出KVM图形界面

方式二:命令行调出KVM图形界面

bash 复制代码
# 方式二:命令行呼出(SSH 连接时建议配合 X11 转发)
[root@KVM1 ~]# virt-managervirt-manager

2. 创建虚拟机完整流程

打开 virt-manager 后,点击 新建虚拟机,按以下步骤操作:

步骤 操作 说明
① 选择安装方式 选择 本地光盘安装(ISO 镜像) 使用本地上传的镜像
② 选择镜像 Other Locations -> Computer -> /iso -> win7镜像 找到 /iso 下的镜像文件
③ 配置资源 设置合理的内存和 CPU 视宿主机资源而定
④ 配置磁盘 设置磁盘容量 默认存放在 /var/lib/libvirt/images
⑤ 命名 设置虚拟机名为 win7 便于后续识别管理

创建时若弹出 Virtual Machine Manager wants to inhibit shortcuts(抑制快捷方式)提示,选择 Allow 允许即可。

3. Win7 系统安装关键点

进入系统安装界面后,与正常安装 Windows 一致:

  1. 点击 现在安装
  2. 勾选 我接受许可条款 ,点击 下一步
  3. 选择 自定义(高级) 安装
  4. 选择磁盘,点击 下一步

小技巧:激活内置 administrator 用户(跳过创建普通用户)

在系统要求创建用户的界面,按 Shift + F10 调出 CMD 命令行(部分笔记本需多按 Fn),执行:

bash 复制代码
# 在 Win7 安装 CMD 中激活内置 administrator 账户
net user administrator /active:yes

随后回到界面,在 administrator 账户的"账户已禁用"选项前去勾选,即可用内置管理员登录。

系统安装结束后关闭虚拟机。之后可以:

  • 给虚拟机拍快照:双击虚拟机进入配置界面,选择拍摄快照,为后续实验留好"后悔药"。
  • 测试加设备:例如给虚拟机加一块硬盘、加一块网卡,体验热插拔设备。

四、命令行篇:virsh 管理虚拟机生命周期

图形界面适合入门,但生产环境运维讲究的是命令行批量管理。virsh 是 libvirt 的命令行管理工具,先看版本:

bash 复制代码
[root@KVM1 ~]# virsh version          # 查看 KVM 相关组件版本
Compiled against library: libvirt 8.0.0
Using library: libvirt 8.0.0
Using API: QEMU 8.0.0
Running hypervisor: QEMU 6.2.0

1. virsh 命令分组速览

bash 复制代码
[root@KVM1 ~]# virsh --help           # 查看 virsh 全部命令(按功能分组)
命令组 help 关键字 功能
Domain Management domain 虚拟机生命周期管理命令(核心)
Domain Monitoring monitor 查看虚拟机状态、磁盘、网络信息
Host and Hypervisor host KVM 物理机/节点信息命令
Snapshot snapshot 虚拟机快照相关配置
Storage Pool pool 存储池管理
Storage Volume volume 存储卷(虚拟磁盘)管理
Networking network 虚拟网络管理

提示:输入 virsh help <关键字> 可查看某分组下的详细命令,例如 virsh help snapshot

2. 虚拟机生命周期管理命令大全

这是本文的重点,直接上图一样的命令对照表:

操作 命令 说明
正常关机 virsh shutdown win7 优雅关机,相当于点"开始->关机"
开机 virsh start win7 启动已定义的虚拟机
重启 virsh reboot win7 重启虚拟机
强制关机 virsh destroy win7 相当于拔电源,系统无法正常响应时使用
挂起 virsh suspend win7 内存数据保存到磁盘,释放 CPU/内存
恢复 virsh resume win7 从挂起状态恢复运行
列出运行中 virsh list 只显示 running 状态的虚拟机
列出全部 virsh list --all 显示所有状态的虚拟机
设置开机自启 virsh autostart win7 虚拟机随宿主机一起开机
取消开机自启 virsh autostart --disable win7 关闭开机自启
列出自启虚拟机 virsh list --autostart 查看随宿主机启动的虚拟机
查看配置 virsh dumpxml win7 输出虚拟机 XML 配置文件
编辑配置 virsh edit win7 修改虚拟机 XML 配置
查看 CPU 数 virsh vcpucount --active win7 查看当前配置的 vCPU 数量

实战演示一:开关机与强制关机

bash 复制代码
[root@KVM1 ~]# virsh shutdown win7        # 正常关机
Domain 'win7' is being shutdown

[root@KVM1 ~]# virsh list                 # 列出运行中的虚拟机(关机后为空)
 Id   Name   State
--------------------

[root@KVM1 ~]# virsh list --all           # 列出所有状态虚拟机
 Id   Name   State
-----------------------
 -    win7   shut off

[root@KVM1 ~]# virsh start win7           # 开启虚拟机
Domain 'win7' started

[root@KVM1 ~]# virsh list
 Id   Name   State
----------------------
 1    win7   running                      # 可用名字 win7 或 ID 1 操作该虚拟机
bash 复制代码
[root@KVM1 ~]# virsh reboot win7          # 重启虚拟机
Domain 'win7' is being rebooted

[root@KVM1 ~]# virsh destroy win7         # 强制关机(拔电源),系统无法响应时才用
Domain 'win7' destroyed

实战演示二:挂起与恢复

bash 复制代码
[root@KVM1 ~]# virsh suspend win7         # 挂起:内存数据写入磁盘,CPU/内存释放
Domain 'win7' suspended

[root@KVM1 ~]# virsh list                 # 查看状态
 Id   Name   State
----------------------
 2    win7   paused                       # 状态显示 paused(挂起)

[root@KVM1 ~]# virsh resume win7          # 恢复运行
Domain 'win7' resumed

[root@KVM1 ~]# virsh list
 Id   Name   State
----------------------
 2    win7   running                      # 状态恢复 running

实战演示三:开机自启

默认情况下,客户机(guest)不会随着宿主机(host)一起开机。如果需要开机自启:

bash 复制代码
[root@KVM1 ~]# virsh autostart win7               # 设置随 KVM 一起开机
Domain 'win7' marked as autostarted

[root@KVM1 ~]# virsh list --autostart             # 列出自启虚拟机
 Id   Name   State
----------------------
 1    win7   running

[root@KVM1 ~]# virsh autostart --disable win7     # 取消自启
Domain 'win7' unmarked as autostarted

实验验证方法:设置自启后重启宿主机,观察 win7 是否跟随自动开机;取消自启后再验证一次,形成对照。

3. 查看虚拟机配置(dumpxml)

bash 复制代码
[root@KVM1 ~]# virsh dumpxml win7         # 查看 win7 完整 XML 配置
<domain type='kvm' id='1'>
  <name>win7</name>
  <uuid>bc5c3fb5-6cc6-4e3f-820c-0fef20ce38c5</uuid>
  <memory unit='KiB'>4194304</memory>     # 内存 4GB
  <vcpu placement='static'>2</vcpu>       # 2 个 vCPU
  <os>
    <type arch='x86_64' machine='pc-q35-rhel8.6.0'>hvm</type>
    <boot dev='hd'/>                       # 从硬盘启动
  </os>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/win7.qcow2' />   # 磁盘文件位置
      <target dev='sda' bus='sata'/>
    </disk>
    ...
  </devices>
</domain>

XML 里能看到这台虚拟机的"完整档案":CPU 型号、内存、时钟、磁盘、网卡、显卡、声卡等。改配置用 virsh edit win7,只查看用 virsh dumpxml win7


五、磁盘管理:qemu-img 与默认存储路径

1. 虚拟机磁盘默认存放位置

bash 复制代码
[root@KVM1 ~]# cd /var/lib/libvirt/images/     # 默认磁盘存放目录
[root@KVM1 images]# ls
win7.qcow2                                     # win7 虚拟机硬盘

[root@KVM1 images]# ll -h                      # 长列表查看
total 7.7G
-rw-------. 1 qemu qemu 41G Sep  3 12:00 win7.qcow2

在 virt-manager 中点击左侧 Storage ,看到 default 存储池,其默认位置就是 /var/lib/libvirt/images。注意 41G 是虚拟磁盘的上限大小7.7G 才是实际占用------这就是 qcow2 格式"按需增长"的魅力。

2. qemu-img 查看磁盘信息

bash 复制代码
[root@KVM1 images]# qemu-img info win7.qcow2   # 查看磁盘信息(建议关机状态下看)
image: win7.qcow2
file format: qcow2                              # 磁盘格式:qcow2(写时复制)
virtual size: 40 GiB (42949672960 bytes)        # 虚拟容量 40G
disk size: 7.66 GiB                             # 实际占用 7.66G
cluster_size: 65536
Snapshot list:                                  # 快照信息
ID        TAG               VM SIZE      DATE
1         win7                0 B     2024-09-03 09:54:06
Format specific information:
    compat: 1.1
    lazy refcounts: true
字段 含义
file format 磁盘格式,qcow2 支持快照、压缩、按需增长
virtual size 虚拟磁盘容量上限
disk size 实际占用磁盘大小
Snapshot list 该磁盘上保存的快照列表

六、命令行创建虚拟机:qemu-img + virt-install

图形界面虽然方便,但生产环境批量建机必须用命令行。核心是两步:先建磁盘,再安装系统

1. 创建虚拟磁盘

bash 复制代码
[root@KVM1 images]# qemu-img create -f qcow2 vm2.qcow2 20G   # 创建 20G qcow2 磁盘
Formatting 'vm2.qcow2', fmt=qcow2 cluster_size=65536 size=21474836480 ...

[root@KVM1 images]# qemu-img info vm2.qcow2    # 查看新磁盘属性
image: vm2.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 196 KiB                             # 刚创建,实际只占 196K

如果想自定义磁盘位置(不放在默认目录),先建目录再建磁盘:

bash 复制代码
[root@KVM1 iso]# mkdir /disk
[root@KVM1 iso]# qemu-img create -f qcow2 /disk/vm2.qcow2 20G

2. 用 virt-install 安装系统

bash 复制代码
[root@KVM1 iso]# virt-install --name vm2 --memory 4096 --vcpus 2 \
--disk path=/disk/vm2.qcow2 \
--location /iso/CentOS-7-x86_64-Minimal-1810.iso \
--network network=default --noautoconsole
参数 说明
--name 指定虚拟机名字
--memory 指定虚拟机内存(MiB)
--vcpus 指定虚拟 CPU 数量
--disk path= 指定虚拟机磁盘位置
--location 指定系统镜像的位置(本地 ISO 或网络源)
--network 指定网络,default 是 KVM 默认的 NAT 网络
--noautoconsole 安装时自动连接控制台,方便后台运行

创建成功后用 virsh list 确认:

bash 复制代码
[root@KVM1 iso]# virsh list
 Id   Name   State
----------------------
 1    win7   running
 2    vm2    running          # 命令行创建的 vm2 已运行

3. 命令行创建的虚拟机怎么管理?

方式一:图形界面管理 ------ 打开 virt-manager 即可看到并操作 vm2。

方式二:VNC 远程连接(推荐,环境没有图形界面时也能用)

再创建一个 vm3,通过 VNC 管理:

bash 复制代码
[root@KVM1 ~]# qemu-img create -f qcow2 /disk/vm3.qcow2 20G    # 建磁盘

[root@KVM1 ~]# virt-install --name vm3 --memory 2048 --vcpus 1 \
> --disk path=/disk/vm3.qcow2 \
> --location /iso/CentOS-7-x86_64-Minimal-1810.iso \
> --network network=default --noautoconsole \
> --vnclisten=0.0.0.0 --vncport=5903 --vnc

[root@KVM1 ~]# systemctl stop firewalld.service    # 关闭防火墙,否则外部连不上 VNC
VNC 参数 说明
--vnclisten=0.0.0.0 VNC 监听所有地址(允许外部连接)
--vncport=5903 宿主机监听 5903 端口的 VNC 请求,转发到 vm3
--vnc 启用 VNC 图形输出

之后用任意 VNC 客户端(如 TigerVNC、RealVNC)连接 宿主机IP:5903 即可完成系统安装。整个过程没有用到 virt-manager,纯文本完成了安装


七、进阶实战:KVM 虚拟机热迁移(NFS 共享存储)

前面学会了建机和管理,接下来是生产环境最高频的操作------热迁移。所谓"热迁移",就是让一台运行中的虚拟机,从宿主机 A"无缝"搬到宿主机 B,业务几乎不中断。

1. 热迁移原理(先懂原理再动手)

适用场景 :可容忍短时间中断 (秒级),但必须快速恢复业务的场景,比如轻量级数据库、桌面云业务。

核心前提磁盘共享存储 (NFS / Ceph / RBD / iSCSI 均可)。源宿主机和目标宿主机能同时访问同一份虚拟机磁盘。

关键点:磁盘不迁移,只迁移"内存 + CPU 设备状态"。 正因为磁盘是共享的,所以迁移的只是内存数据,迁移量小、速度快。

迁移四步流程

  1. 在目的主机创建一个规格与源虚拟机相同的空虚拟机(磁盘指向共享存储);
  2. 通过迭代迁移 技术,把源虚拟机的内存迁移到目的主机。迁移过程中新产生的变化数据再补迁过来;经过几轮迁移,剩余数据很小时,暂停源虚拟机,把最后一点数据迁过去;
  3. 删除源虚拟机(释放资源);
  4. 目的主机拉起新虚拟机,业务无缝切换。

迭代迁移技术:先全量拷贝内存,再反复拷贝"迁移期间脏掉的页",直到剩余脏页足够小,短暂暂停完成最后一次拷贝,实现业务几乎不中断。

典型使用场景

场景 说明
服务器运维 维护前把虚拟机迁到其他服务器,降低维护期间业务中断风险
服务器升级 升级前迁走,升级完成后迁回,全程不中断
资源整合 把空闲服务器上的虚拟机迁走,关闭无负载服务器,降低运行成本

2. 实验拓扑与 IP 规划

复制代码
                 +-------------------------+
                 |        NFS 服务器        |
                 |   共享目录 /nfs          |
                 |   192.168.108.100       |
                 +------------+------------+
                              | NFS 共享存储
        +---------------------+---------------------+
        |                                           |
+-------+--------+                         +--------+-------+
|    KVM1 宿主机  |                         |    KVM2 宿主机  |
|  192.168.108.101|                         |  192.168.108.102|
|  运行 win7 等   | ====热迁移====>          |  接管虚拟机     |
+-----------------+                         +-----------------+
主机 IP 角色
NFS 192.168.108.100 提供共享存储(/nfs)
KVM1 192.168.108.101 源宿主机(迁移发起方)
KVM2 192.168.108.102 目的宿主机(迁移接收方)

3. 第一步:克隆节点与基础配置

KVM1 做完单机实验后还原快照,再通过 KVM1 完整克隆出 KVM2 和 NFS 两台虚拟机。三台全部开机(先开 KVM1,再依次开机)。

KVM2 修改主机名

bash 复制代码
[root@KVM1 ~]# hostnamectl set-hostname KVM2     # 修改主机名
[root@KVM1 ~]# bash                               # 刷新当前 shell
[root@KVM2 ~]#                                    # 主机名已生效

KVM2 修改 IP 为 192.168.108.102

bash 复制代码
[root@KVM2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
ini 复制代码
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=ens160
#UUID=3b58adc4-7bfb-4ce7-bdc5-7893a708ebb3       # 克隆机必须删掉 UUID 这行
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.108.102                           # 修改 IP 为 192.168.108.102
PREFIX=24
GATEWAY=192.168.108.2
bash 复制代码
[root@KVM2 ~]# nmcli connection reload ens160     # 重新加载网卡配置
[root@KVM2 ~]# ifconfig ens160                    # 验证 IP 已生效
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.108.102  netmask 255.255.255.0  broadcast 192.168.108.255

NFS 服务器同样操作hostnamectl set-hostname NFS,IP 改为 192.168.108.100(同样删掉 UUID 行),不再赘述。

三节点配置相同的 hosts 文件(互相用主机名访问):

bash 复制代码
# KVM1 上操作,然后分发到另外两个节点
[root@KVM1 ~]# cat >> /etc/hosts << EOF
192.168.108.100 NFS
192.168.108.101 KVM1
192.168.108.102 KVM2
EOF

[root@KVM1 ~]# scp /etc/hosts root@KVM2:/etc/hosts     # 复制到 KVM2
[root@KVM1 ~]# scp /etc/hosts root@NFS:/etc/hosts      # 复制到 NFS

4. 第二步:搭建 NFS 共享存储

NFS 服务器上操作

bash 复制代码
[root@NFS ~]# mkdir /nfs                        # 创建用于共享的目录
[root@NFS ~]# vim /etc/exports                  # 编辑共享配置文件
ini 复制代码
/nfs *(rw,no_root_squash,no_subtree_check)
exports 配置项 含义
第一列 /nfs 要共享出去的目录
第二列 * 允许所有网段访问
rw 客户端对该共享目录具有读写权限
sync 资料同步写入内存和磁盘
no_root_squash 客户端 root 访问时不映射为匿名用户(保留 root 权限)
no_subtree_check 不检查父目录权限,提升性能

启动并验证:

bash 复制代码
[root@NFS ~]# systemctl restart nfs-server.service    # 重启 NFS 服务
[root@NFS ~]# showmount -e localhost                  # 本地测试共享是否成功
Export list for localhost:
/nfs *
[root@NFS ~]# systemctl stop firewalld.service        # 停止防火墙

# 在 KVM1、KVM2 上分别测试能否访问 NFS 共享目录
[root@KVM1 ~]# showmount -e 192.168.108.100
Export list for 192.168.108.100:
/nfs *

KVM1、KVM2 创建挂载目录(后续 virt-manager 挂载用):

bash 复制代码
[root@KVM1 ~]# mkdir /NFS        # 用于挂载 NFS 的 /nfs 目录
[root@KVM2 ~]# mkdir /NFS

5. 第三步:virt-manager 添加共享存储

在 KVM1 的 virt-manager 中,将 KVM2 添加进来(右击 Details,把两台 KVM 改好名字便于区分)。然后为 KVM1 添加共享存储:

6. 第四步:使用共享存储创建虚拟机

  1. 上传 CentOS 镜像到 KVM1;
  2. 在 KVM1 的 virt-manager 中点击创建虚拟机;
  3. 选择刚才上传的镜像;
  4. 关键一步:磁盘选择安装到共享存储 NFS(而不是默认本地存储);
  5. 正常安装虚拟机,安装完重启时会自动弹出光盘,安装完成即可。

7. 第五步:开始热迁移!

bash 复制代码
# KVM1 和 KVM2 都关闭防火墙,保证迁移通道畅通
[root@KVM1 ~]# systemctl stop firewalld.service
[root@KVM2 ~]# systemctl stop firewalld.service

接下来在 virt-manager 中对运行中的虚拟机执行"迁移",选择目标主机 KVM2,确认后即可看到虚拟机从 KVM1 平滑迁移到 KVM2,业务不中断 ,这就是热迁移的效果。

  1. 点击左下角 + 号,添加新存储;
  2. 存储类型选择 NFS
  3. 填写如下信息:
配置项 填写内容
Type NFS
Target Path /NFS(KVM1/KVM2 的本地挂载目录)
Host Name NFS 服务器地址(192.168.108.100)
Source Path /nfs(NFS 共享目录)

KVM2 上做同样操作,添加同一个 NFS 共享存储。这样两台宿主机就能访问到同一份虚拟机磁盘了。

添加kvm2虚拟机设备,方便操作

八、总结

知识点全景回顾

模块 核心工具 关键点
图形界面建机 virt-manager 本地光盘安装、配置内存/CPU/磁盘、命名
命令行管理 virsh shutdown/start/reboot/destroy/suspend/resume/autostart/dumpxml
磁盘管理 qemu-img qcow2 格式、默认目录 /var/lib/libvirt/images
命令行建机 virt-install 先建盘后装机、--vnclisten/--vncport 配 VNC
热迁移 NFS + virt-manager 磁盘共享只迁内存、迭代迁移、业务几乎不中断

相关推荐
2401_8628808222 分钟前
Linux应用层开发 --- UDP&TCP
linux·运维·tcp/ip·udp
姚不倒28 分钟前
Nginx 虚拟主机:server_name 匹配规则与实战
运维·nginx
代码方舟1 小时前
零信任架构实战:基于天远车辆过户详版查询构建自动化车辆估值网关
运维·人工智能·架构·自动化
BlueAsia_Lab2 小时前
Wi‑Fi 认证:企业办理需要准备哪些资料?
运维·服务器·网络
Mortalbreeze3 小时前
深入理解 Linux IO 模型(一):阻塞 IO、非阻塞 IO 与信号驱动 IO
linux·运维·服务器
D_codingXuChu3 小时前
2026年物联网应用开发服务商选型指南|从设备接入、数据处理、业务联动到长期运维,拆解项目落地中的工程实践与可验证方法,帮助企业判断供应商真实交付能力
运维·物联网·开发经验·企业服务
2301_780789663 小时前
CDN提供商常用的DDoS缓解技术与策略
linux·运维·服务器·人工智能·架构
进击的雷神4 小时前
网站 SEO 功能怎么测:从手工检查到自动化脚本的实战思路
运维·爬虫·自动化·官网seo·收录
Kismet_nvi4 小时前
Python运维自动化核心模块
运维·python·自动化