QEMU-KVM基本操作
本文主要介绍KVM虚拟机的一些基本实践操作。对KVM虚拟机的管理操作主要是基于libvirt的命令行工具virsh进行的。
一、安装与启动
1. KVM模块检查
(1)查看当前Linux系统核心是否包含KVM模块(Linux内核2.6.20及以上版本包含KVM模块):
1 2 3 4 5 | uname -r #或 cat /proc/version #或 dmesg | grep Linux |
(2)检查当前Linux系统是否已加载KVM核心模块:
1 | lsmod | grep kvm |
2. 安装libvirt,qemu-kvm
1 | yum install libvirt libvirt-devel qemu-kvm |
3. 启动libvirtd
1 2 | systemctl start libvirtd systemctl enable libvirtd |
二、连接配置
1. 本地控制配置
libvirt安装后默认配置就可以连接到本地libvirtd。
测试是否可用:
1 | virsh list |
不可用重启试试:
1 | systemctl restart libvirtd |
2. 远程控制配置
只需修改服务端配置项,客户端保持默认配置即可。
(1)修改服务端配置文件/etc/libvirt/libvirtd.conf
1 2 3 4 | listen_tls = 0 listen_tcp = 1 tcp_port = "16509" auth_tcp = "none" |
(2)修改服务端/etc/sysconfig/libvirtd
1 | LIBVIRTD_ARGS= "--listen" |
(3)重启服务端libvirtd服务
1 | systemctl restart libvirtd |
(4)客户端保持默认配置,连接服务端的libvirtd服务执行命令
示例:
1 | virsh -c qemu+tcp: //root @192.168.2.102:16509 /system list --all |
此命令连接到服务端192.168.2.102的libvirtd服务,执行命令 virsh list --all。
这里使用的是tcp连接,也可使用其它连接方式,如TLS、ssl等,但配置文件需要做相应修改。
三、日志配置
libvirtd的日志文件一般为:/var/log/libvirt/libvirtd.log
若没有这个文件,需要修改libvirtd服务的日志级别和日志文件配置,配置文件:/etc/libvirt/libvirtd.conf。
配置示例:
1 2 | log_level = 1 log_outputs = "1:file:/var/log/libvirt/libvirtd.log" |
然后重启libvirtd:
1 | systemctl restart libvirtd |
在日志文件 /var/log/libvirt/libvirtd.log 中可查看每次执行virsh命令输出的info、debug等信息。
另外,目录 /var/log/iibvirt/qemu/ 下保存了每个虚拟机具体的日志信息,log文件名称与虚拟机名称相关。
四、网络配置
1. 默认网络配置
查看libvirt的默认网络配置:
1 | virsh net-list |
默认网络配置文件为:/etc/libvirt/qemu/networks/default.xml,其内容示例如下:

其中配置项“bridge”、“mac”和“ip”分别定义了宿主机用于与虚拟机通信的网桥名称、mac地址和ip地址,libvirtd服务启动的时候会自动创建并启动该网桥,“dhcp”则配置了libvirt启动的虚拟机的ip地址范围。
“forward”配置的是网络模式,kvm虚拟机支持两种网络模式:
(1)NAT(网络地址转换):虚拟系统通过网络地址转换,将虚拟机地址映射到宿主机地址上,通过宿主机进行网络访问。这样虚拟机就可访问外网和局域网内的其他主机,但是局域网内的其他主机不能访问虚拟机,相当于单向访问。
(2)Bridge(桥接):双向访问。每个虚拟机都具有一个独立的局域网ip地址,虚拟机与局域网其他主机可相互访问。
2. 自定义网络配置
用户可参考libvirt的默认网络配置文件添加自定义网络配置。
(1)创建网络xml配置文件,然后创建新网络:
1 | virsh net-define net-name.xml |
此命令会将网络配置文件移至/etc/libvirt/qemu/networks/目录下。
查看/导出网络配置:
1 | virsh net-dumpxml net-name |
(2)启动网络:
1 | virsh net-start net-name |
(3)设置开机自启动:
1 | virsh net-autostart net-name |
此命令会在 /etc/libvirt/qemu/networks/autostart/ 目录下创建 /etc/libvirt/qemu/networks/ 目录下网络配置文件的软链接。
3. 删除网络
(1)关闭网络:
1 | virsh net-destroy my-net |
(2)删除网络:
1 | virsh net-undefine my-net |
此命令会将网络配置文件从/etc/libvirt/qemu/networks/目录下删除,若/etc/libvirt/qemu/networks/autostart/目录下存在对应软连接也一并删除。
4. 修改网络配置
修改libvirt网络配置有两种方式。
(1)virsh net-edit
修改网络配置文件:
1 | virsh net-edit my-net |
重启网络才能生效:
1 2 | virsh net-destroy my-net virsh net-start my-net |
(2)virsh net-update
1 | virsh net-update my-net add-last ip-dhcp-host "<host mac='' name='' ip='' />" --live --config --parent-index 0 |
virsh net-edit需要重启网络,对线上系统不友好,而virsh net-update可动态修改运行中的网络,不会影响线上系统,但有些修改无法使用virsh net-update进行。
五、KVM虚拟机管理操作
1. 创建虚拟机
(1)从xml配置文件创建虚拟机但是不启动
1 | virsh define vm-name.xml |
(2)从xml配置文件创建虚拟机并启动,但不会持久化,虚拟机关机后就消失了
1 | virsh create vm-name.xml |
创建虚拟机后,在 /etc/libvirt/qemu/ 路径下自动生成一份虚拟机的xml配置文件,该配置文件在virsh undefine删除虚拟机的时候会自动删除。
虚拟机的xml配置文件主要配置了虚拟机名称、内存大小、vcpu数量、镜像文件路径、网桥等信息。
查看/导出虚拟机xml文件:
1 | virsh dumpxml vm-name |
xml文件修改:
1 | virsh edit vm-name |
修改后重启虚拟机才能生效:
1 | virsh reboot vm-name |
登录虚拟机:
1 | virsh console vm-name |
创建示例:
准备好虚拟机镜像文件,在虚拟机 xml 配置文件中配置好镜像文件的路径:
然后通过 virsh 命令创建虚拟机:
1 | virsh define vm-name.xml |
2. 启动虚拟机
(1)启动:
1 | virsh start vm-name |
(2)重启:
1 | virsh reboot vm-name |
3. 查看虚拟机列表
(1)运行状态的虚拟机列表
1 | virsh list |
(2)所有的虚拟机列表
1 | virsh list --all |
4. 关闭虚拟机
(1)正常关闭
1 | virsh shutdown vm-name |
(2)下电,强制立即关闭
1 | virsh destroy vm-name |
5. 删除虚拟机
1 | virsh undefine vm-name |
将非运行状态的虚拟机从virsh列表中删除,无法删除运行状态的虚拟机。
undefine命令会将虚拟机配置文件 /etc/libvirt/qemu/vm-name.xm 删除,但不会删除镜像文件。
6. 虚拟机挂起与恢复
(1)挂起
1 | virsh suspend vm-name |
只有运行状态(running)的虚拟机才能被挂起。
挂起状态的虚拟机无法被登录,也无法关闭。
(2)恢复
1 | virsh resume vm-name |
只有挂起状态(paused)的虚拟机才能被恢复。
7. 设置虚拟机在宿主机启动时自动启动
1 | virsh autostart vm-name |
8. 查看虚拟机
(1)查看虚拟机状态
1 | virsh domstate vm-name |
(2)查看虚拟机信息
1 | virsh dominfo vm-name |
9. 虚拟机磁盘管理操作
(1)查看磁盘列表
1 | virsh domblklist vm-name |
(2)查看磁盘信息
1 | virsh domblkinfo vm-name block-name |
(3)扩容磁盘
1 | virsh blockresize --domain vm-name --path block-name --size 10G |
(4)动态设置磁盘qos
1 | virsh blkdeviotune vm-name block-name -- read -bytes-sec 1024 --write-bytes-sec 1024 -- read -iops-sec 1000 --write-iops-sec 1024 --live |
(5)持久化挂载rbd
1 | virsh attach-device vm-name rbd.xml --persistent |
10. 内存、CPU管理操作
(1)动态设置CPU个数
1 | virsh setvcpus vm-name --count 4 --config --live |
(2)动态设置内存大小
1 | virsh setmem vm-name --size 1024 --config --live |
(3)设置最大内存大小
1 | virsh setmaxmem vm-name --size 102400 --config |
11. 网卡管理操作
(1)查看网卡列表
1 | virsh domiflist vm-name |
(2)添加持久化网卡
1 | virsh attach-interface --domain vm-name -- type bridge -- source br111 --model virtio --mac '00.00.00.00.00.01' - -live --config --persistent |
(3)删除持久化网卡
1 | virsh detach-interface --domain vm-name -- type bridge --mac '00.00.00.00.00.01' - -live --config --persistent |
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2015-05-21 网页授权——扫二维码获取openid
2015-05-21 删除自定义菜单
2015-05-21 创建自定义菜单
2015-05-21 微信公众平台开发接口PHP SDK