KVM 环境部署调试、网络增强、虚拟机安装、故障解决手册
目录
[Centos 7 部署与配置使用KVM手册... 2](#Centos 7 部署与配置使用KVM手册... 2)
[一. KVM服务部署准备工作... 2](#一. KVM服务部署准备工作... 2)
[( 一) 系统基础配置略:... 2](#(一) 系统基础配置略:... 2)
[(二) 配置YUM 源... 2](#(二) 配置YUM 源... 2)
[(三) 检查KVM宿主机是否支持虚拟化... 6](#(三) 检查KVM宿主机是否支持虚拟化... 6)
[二. 部署KVM服务详细步骤... 6](#二. 部署KVM服务详细步骤... 6)
[(一) 安装kvm命令... 6](#(一) 安装kvm命令... 6)
[(二) 安装虚拟化管理工具... 7](#(二) 安装虚拟化管理工具... 7)
[(三) 安装虚机镜像文件编辑工具... 7](#(三) 安装虚机镜像文件编辑工具... 7)
[(四) 内核模块中是否含有kvm.. 8](#(四) 内核模块中是否含有kvm.. 8)
[(五) 验证kvm环境可用性... 8](#(五) 验证kvm环境可用性... 8)
[(六) 创建虚拟网络与物理网络的桥接(简单网络)... 9](#(六) 创建虚拟网络与物理网络的桥接(简单网络)... 9)
[三. 安装虚拟机... 16](#三. 安装虚拟机... 16)
[(一) 图形界面安装虚拟机... 16](#(一) 图形界面安装虚拟机... 16)
[(二) 命令行界面安装虚拟机... 22](#(二) 命令行界面安装虚拟机... 22)
[四. KVM虚拟机优化... 36](#四. KVM虚拟机优化... 36)
[五. KVM虚拟网络增强(虚拟交换机/vxlan)... 42](#五. KVM虚拟网络增强(虚拟交换机/vxlan)... 42)
[(一) openvSwitch 部署... 42](#(一) openvSwitch 部署... 42)
[(二) 虚拟机桥接至OVS. 44](#(二) 虚拟机桥接至OVS. 44)
[六. KVM虚拟机的导出/导入/及备... 49](#六. KVM虚拟机的导出/导入/及备... 49)
[(一) 导出KVM虚拟机... 49](#(一) 导出KVM虚拟机... 49)
[(二) 导入KVM虚拟机... 50](#(二) 导入KVM虚拟机... 50)
[(三) 用于导出和导入 KVM 虚拟机的 Bash 脚本... 51](#(三) 用于导出和导入 KVM 虚拟机的 Bash 脚本... 51)
[七. 其他辅助使用配置... 53](#七. 其他辅助使用配置... 53)
KVM 环境部署调试、网络增强、虚拟机安装、故障解决手册
服务简介:
KVM全称Kernel-based Virtual Machine,是一种开源的虚拟化技术,集成于Linux内核中,允许Linux将自身转变为一个虚拟机监控程序(hypervisor),从而在单一主机上运行多个隔离的虚拟环境,每个虚拟环境都有自己的私有虚拟化硬件(如CPU、内存、网络接口等)。
最初由以色列的初创公司Qumranet开发,并自Linux 2.6.20版本起成为Linux内核的一部分。
- KVM服务部署准备工作
- 系统基础配置略:
Centos 系统安装/IP配置/yum源配置/防火墙关闭;
注意:KVM YUM源,使用国内源
- 检查KVM宿主机是否支持虚拟化

grep -E '(vmx|svn)' /proc/cpuinfo
- 配置YUM 源
- 在配置YUM源库之前,首先要确保KVM虚拟机已经安装了YUM工具。如果没有,可以通过以下命令进行安装:
sudo yum install yum -y
- 备份原有YUM源配置文件
在修改YUM源配置文件之前,建议先备份原有的配置文件,以防配置失败时可以恢复:
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
- 更换yum源
- 选择centos、epel镜像
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- 修改默认yum源(上一步已更新,本部不执行)
root@kvm \~# cd /etc/yum.repos.d/
root@kvm yum.repos.d# vi yum.sh
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
root@kvm yum.repos.d# sh yum.sh
- 清除yum缓存
root@kvm yum.repos.d# yum clean all
- 生成缓存
root@kvm yum.repos.d# yum makecache

- 更新YUM源
在新的YUM源配置完成并清理缓存后,可以更新YUM源:
sudo yum update -y
- 安装基础软件包
安装一些常用的软件包,例如wget、curl、vim等:
sudo yum install wget curl vim -y
- 检查防火墙/selinux(测试环境打开,生产环境需注意)
- 关闭防火墙
如果不关闭防火墙可能会出现之后安装虚拟机的过程中vnc无法连接的情况。
firewall-cmd --state
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

- 关闭SELinux
将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=disabled

- 部署KVM服务详细步骤
- 安装kvm命令
root@kvm \~# yum install qemu-kvm
qemu/模拟器,具备模拟加速功能
libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以
由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,
vmware,XEN,Hyper-v, LXC 等 Hypervisor。
• Virsh:基于 libvirt 的 命令行工具 (CLI)
• Virt-Manager:基于 libvirt 的 GUI 工具
- 安装虚拟化管理工具
root@kvm \~# yum -y install virt-manager libvirt libvirt-python python-virtinst bridge-utils virt-install

注意检查"libvirtd"服务状态(保持持续运行状态)
systemctl status libvirtd
chkconfig libvirtd on

- 安装虚机镜像文件编辑工具
用于访问和修改虚拟机的磁盘镜像,libguestfs-tools 允许在宿主机上直接读写虚拟机的磁盘映像文件,无需启动虚拟机,这在某些维护、故障排查场景下非常有用。
yum install libguestfs-tools -y
- 内核模块中是否含有kvm
lsmod | grep kvm

- 验证kvm环境可用性
- virt-host-validate 是一个专门用于验证 KVM 虚拟化主机配置的工具,由 libvirt-client 软件包提供,与其他检查方法相比,它提供了更加详尽的检查项。
所有检查项都 PASS,则说明 KVM 环境配置正确,可以创建虚拟机,如果存在检查项 FAIL,则需要根据提示进行修复
root@donkey \~# virt-host-validate
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
...

-
如果验证需修复:IOMMU 警告问题
修复方法:IOMMU 警告问题解决
IOMMU 警告问题解决
Typically by default, IOMMU is not enabled in Linux. I'll show how to enable that virtualization feature on Fedora Linux!
- First, check if IOMMU support is enabled by running this command:
sudo virt-host-validate
If in the output you see something similar to the following, continue on below for help.
...
QEMU: Checking if IOMMU is enabled by kernel : FAIL
(IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
...
- Edit the file /etc/default/grub and add intel_iommu=on to the existing GRUB_CMDLINE_LINUX line.
Note: I have a lot going on here for mine, such as a fix for a weird usb power issue of my motherboard, enabling nested virtualization for kvm and more. Disregard those things and only add intel_iommu=on for this task!
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="
- 创建虚拟网络与物理网络的桥接(简单网络)
- 配置桥接网络
KVM虚拟机实际是支持多种网络模式,如 桥接、NAT、Host-Only 等,默认是使用桥接网络模式,该模式下,虚拟机可以像物理机一样直接连接到网络上,拥有独立的IP地址,适用于需要让虚拟机对外提供服务,如Web服务或FTP服务等。
在centos7系统上,网络服务管理既可以使用network,也可以使用NetworkManager,因为本篇为较新的7.9版本,所以采用NetworkManager进行管理,如果是7较早的版本,则推荐采用network来进行桥接网络的创建(因为7早期版本NetworkManager对网桥功能支持并不好)。
- 确定要绑定的网口设备
这里使用 lshw 命令来查看本机的网口设备情况,确定要桥接网络要绑定的网口是哪个,例如这里选择 enp1s0 网口。
lshw -c network -businfo
Bus info Device Class Description
=====================================================
pci@0000:02:01.0 ens33 network 82545EM Gigabit Ethernet Controller (Coppe
pci@0000:02:04.0 ens36 network 82545EM Gigabit Ethernet Controller (Coppe
virbr0-nic network Ethernet interface
virbr0 network Ethernet interface
输出中可以看出本机有ens33和ens36的两个物理网口,每个网口设备都有唯一的PCI地址。
- 创建桥接网络
对应步骤1确定的网口,使用 brctl 命令创建一个名称为 br0 的网桥。
brctl addbr br0 *#*创建桥接网络br0
brctl addif br0 ens33 *#*把br0 和enp2s0 网卡绑定,让物理网卡流量能够通过网桥传递
brctl stp br0 on *#*开启stp 协议,防止网络环路(loop )的产生
测试配置:
root@centos79-kvm-ovs-11 \~# brctl addbr br-lan4 #创建桥接网络"br-lan4"
root@centos79-kvm-ovs-11 \~# brctl show
bridge name bridge id STP enabled interfaces
br-lan4 8000.000000000000 no
virbr0 8000.5254005b2ed4 yes virbr0-nic
root@centos79-kvm-ovs-11 \~# brctl addif br-lan4 ens36 #把ens36和桥"br-lan4"绑定
root@centos79-kvm-ovs-11 \~# brctl stp br-lan4 on #开启stp协议,防止网络环路(loop)的产生
root@centos79-kvm-ovs-11 \~# brctl show
bridge name bridge id STP enabled interfaces
br-lan4 8000.000c29fddf24 yes ens36
virbr0 8000.5254005b2ed4 yes virbr0-nic
补充:对应的删除操作
brctl delif br0 enp2s0 *#*解除与物理网卡绑定
ifconfig br0 down *#*关闭桥接网络br0, 否则无法删除
brctl delbr br0 *#*删除桥接网络br0
【注意】如果是通过ssh等远程方式连接服务器,在操作网桥和物理网卡绑定操作时,注意不能选择当前连接正在使用的物理网卡,否则当前连接网络会被重置中断。
brctl --help
Usage: brctl commands
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
hairpin <bridge> <port> {on|off} turn hairpin on/off
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show \
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
- 创建网桥配置
对应确定的网口 enp2s0,创建对应的桥接网络配置文件 /etc/sysconfig/network-scripts/ifcfg-br0。方便起见,可以直接拷贝 enp2s0 的配置文件进行修改,如下示例。
root@donkey \~# more /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge # 指定网络接口类型为桥接
BOOTPROTO=static # 设置为手动配置静态IP地址
DEVICE=br0
IPADDR=192.168.1.112 # 绑定物理网卡的IP地址
NETMASK=255.255.255.0 #或者 PREFIX=24
ONBOOT=yes
测试配置:
查看ifcfg-ens36的配置信息
root@centos79-kvm-ovs-11 network-scripts# cat ifcfg-ens36
HWADDR=00:0C:29:FD:DF:24
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.31.104
PREFIX=24
GATEWAY=192.168.31.5
DNS1=192.168.31.5
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=ens36
UUID=aeb150e8-4249-337f-9380-a2894cd1753c
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
编辑创建网桥配置:
root@centos79-kvm-ovs-11 network-scripts# vim /etc/sysconfig/network-scripts/ifcfg-br-lan4
root@centos79-kvm-ovs-11 network-scripts# cat /etc/sysconfig/network-scripts/ifcfg-br-lan4
TYPE=Bridge # 指定网络接口类型为桥接
BOOTPROTO=static # 设置为手动配置静态IP 地址
DEVICE=br-lan4
IPADDR=192.168.31.103 # 绑定物理网卡ens36 的IP 地址
NETMASK=255.255.255.0 # 或者 PREFIX=24
ONBOOT=yes
root@centos79-kvm-ovs-11 network-scripts# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fd:df:1a brd ff:ff:ff:ff:ff:ff
inet 192.168.11.104/24 brd 192.168.11.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::2495:987c:4066:b7bd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fd:df:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.104/24 brd 192.168.31.255 scope global noprefixroute ens36
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefd:df24/64 scope link
valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:5b:2e:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:5b:2e:d4 brd ff:ff:ff:ff:ff:ff
- 修改绑定网络设备配置
创建桥接网络配置后,绑定的网卡设备配置也要同步进行修改,注意修改前先进行备份。
# 备份绑定网卡设备
cp /etc/sysconfig/network-scripts/ifcfg-enp2s0 /etc/sysconfig/network-scripts/ifcfg-enp2s0.bak
# 绑定网卡设备修改后示例
root@donkey \~# more /etc/sysconfig/network-scripts/ifcfg-enp2s0
TYPE=Ethernet
BOOTPROTO=none # 设置为none或直接移除,确保不分配IP地址
NAME=enp2s0
DEVICE=enp2s0
BRIDGE=br0 # 表示将网卡桥接到br0网桥上
ONBOOT=yes
测试配置:修改绑定网卡的配置(先备份配置)(以31.104为例)
root@centos79-kvm-ovs-11 network-scripts# cp ifcfg-ens36 ifcfg-ens36.bak # 备份原ens36配置
root@centos79-kvm-ovs-11 network-scripts# vim ifcfg-ens36 # 编辑为绑定网卡的配置信息
root@centos79-kvm-ovs-11 network-scripts# cat ifcfg-ens36
HWADDR=00:0C:29:FD:DF:24 #注销
TYPE=Ethernet
PROXY_METHOD=none #注销
#BROWSER_ONLY=no #注销
BOOTPROTO=none #注销
IPADDR=192.168.31.104 #注销
PREFIX=24 #注销
GATEWAY=192.168.31.5 #注销
DNS1=192.168.31.5 #注销
DEFROUTE=yes #注销
IPV4_FAILURE_FATAL=no #注销
IPV6INIT=no #注销
NAME=ens36
DEVICE=ens36 #添加
UUID=aeb150e8-4249-337f-9380-a2894cd1753c
BRIDGE=br-lan4 #添加
ONBOOT=yes #没变
AUTOCONNECT_PRIORITY=-999 #没变
其他补充说明:
NetworkManager 通过 autoconnect-priority 参数控制优先级,默认规则:
数值范围:-9999 至 9999(数值越高,优先级越高)。
设备类型默认优先级:以太网(wired)> Wi-Fi(wireless)> 蓝牙(bluetooth)> 移动网络(gsm)。
同一设备类型的多个连接,需手动设置 autoconnect-priority 区分优先级。
- 重启网络服务
systemctl restart NetworkManager
【注意】如果重启网络服务时提示 Device unmanaged or not available for activatio 错误,说明修改的网络设备非 NetworkManager 所纳管,可能是 network 所纳管的,所以要重启 network 服务。如不起作用需重启系统
- 检查配置效果
使用 ifconfig 检查
正确配置情况下, 在 ifconfig 输出中只有 br0 有IP, enp1s0 这个网口是没有IP的。
root@donkey \~# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.112 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::8e1c:daff:fe46:1102 prefixlen 64 scopeid 0x20<link>
ether 8c:1c:da:46:11:02 txqueuelen 1000 (Ethernet)
RX packets 89 bytes 8868 (8.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19 bytes 2120 (2.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 8c:1c:da:46:11:02 txqueuelen 1000 (Ethernet)
RX packets 797673429 bytes 1149242532871 (1.0 TiB)
RX errors 0 dropped 43 overruns 1656 frame 0
TX packets 559644770 bytes 719560422108 (670.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xd0800000-d081ffff
...
测试配置:检查配置是否有问题

使用 brctl 检查
在没有创建虚拟机时,会显示只绑定 enp2s0,运行虚机如果有指定bridge=br0, 就会多一个vnet0网卡。
root@donkey \~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.8c1cda461102 yes enp2s0
vnet0
测试配置:
root@centos79-kvm-ovs-11 \~# brctl show
bridge name bridge id STP enabled interfaces
br-lan4 8000.000c29fddf24 no ens36
virbr0 8000.5254005b2ed4 yes virbr0-nic
root@centos79-kvm-ovs-11 \~# brctl stp br-lan4 on #开起STP
root@centos79-kvm-ovs-11 \~# brctl show
bridge name bridge id STP enabled interfaces
br-lan4 8000.000c29fddf24 yes ens36
virbr0 8000.5254005b2ed4 yes virbr0-nic
- 安装虚拟机
KVM安装虚拟机有两种方式,如果宿主机安装有GUI界面,可以通过图形界面部署及管理虚拟机(可视化),但是步骤较多;命令行方式,熟悉后可非常快捷创建,及批量创建。
- 图形界面安装虚拟机
- 执行virt-manager打开管理界面
点击new,创建一个新的虚拟机

- 选择导入镜像(测试举例)

选择镜像。镜像可以提前拷贝到宿主机的/var/lib/libvirt/images文件夹下面,这是 KVM 默认查找镜像文件的地方。cirros 是一个很小的 linux 镜像,非常适合测试用,大家可以到 http://download.cirros-cloud.net/ 下载。

- 为虚拟机分配CPU和内存

- 设置虚拟机名称

- 点击完成,弹出的控制台有报错

- 解决如下:Display Spice-Spice Server-Type 由 Spice server 改为 VNC server

- 关闭后,重新启动

- 通过virsh list命令,可以查看运行的虚拟机
-

-
命令行界面安装虚拟机
- 存储池创建
命令行界面安装虚拟机,建议规划相关的目录/子目录放置虚拟机磁盘文件,ISO的文件,便于后期管理。
当然默认虚拟机磁盘目录为"/var/lib/libvirt/images/",可以自己规划
本次测试目录为:
Images 虚拟机存放目录(每个虚拟机一个虚拟机名称的目录,放磁盘文件)
ISO 为安装ISO 存放区
-
创建目录
root@centos79-kvm-ovs-11 /# mkdir /kvm/vms/images -p
root@centos79-kvm-ovs-11 /# mkdir /kvm/vms/ISO -p
-
创建永久目录存储池
root@centos79-kvm-ovs-11 /# virsh pool-define-as keep_dpool --type dir --target /kvm/vms
Pool keep_dpool defined # 说明;创建永久目录存储池
-
构建池
root@centos79-kvm-ovs-11 /# virsh pool-build keep_dpool
Pool keep_dpool built
-
查看目录池状态
root@centos79-kvm-ovs-11 /# virsh pool-list --persistent --all
Name State Autostart
keep_dpool inactive no
-
查看目录池状态
root@centos79-kvm-ovs-11 /# tree /etc/libvirt/storage/
/etc/libvirt/storage/
└── keep_dpool.xml
0 directories, 1 file
pool-define-as 创建的存储池没有启动,在存储目录中有定义文件
-
激活池
virsh pool-start keep_dpool
-
设置自动启动 配置存储池在系统启动时自动激活:
virsh pool-autostart keep_dpool
- #验证配置 查看存储池状态以确认是否成功创建:
virsh pool-list --all

- 注意事项与最佳实践
权限管理:确保目标目录具有正确的权限,避免虚拟机无法访问。可使用以下命令调整权限:
chmod -R 755 /kvm/images
chown -R libvirt-qemu:kvm /kvm/images
持久化与临时性:永久存储池适用于长期使用,而临时存储池适合测试或短期需求。
验证路径:通过以下命令检查配置文件路径是否正确:
virsh pool-dumpxml my_pool | grep -i path
通过以上步骤,您可以轻松在KVM环境中设置和管理存储池,为虚拟机提供高效的存储支持。
- 创建虚拟机
- 创建虚拟机磁盘
例:
root@kvm kvmtest# qemu-img create -f qcow2 /kvmtest/centos-6.5.qcow2 10G
测试配置
创建qcow2 格式的50G 磁盘,名称为"win2016-c.qcow2 "
qemu-img create -f qcow2 /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
检查创建磁盘的信息
qemu-img info /kvm/vms/images/win2016-test/win2016-c.qcow2
root@centos79-kvm-ovs-11 ISO# qemu-img create -f qcow2 /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
Formatting '/kvm/vms/images/win2016-test/win2016-c.qcow2', fmt=qcow2 size=53687091200 encryption=off cluster_size=65536 lazy_refcounts=off
root@centos79-kvm-ovs-11 ISO# qemu-img info /kvm/vms/images/win2016-test/win2016-c.qcow2
image: /kvm/vms/images/win2016-test/win2016-c.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
补充说明:
正确命令格式:
qemu-img create -f qcow2 /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
参数说明:
• -f qcow2:指定镜像格式为 qcow2
• /kvm/vms/images/win2016-test/win2016-c.qcow2:镜像文件路径
• 50G:镜像大小(50GB)
可选操作:
- 如果目录不存在,先创建:
mkdir -p /kvm/vms/images/win2016-test/
- 创建镜像:
qemu-img create -f qcow2 /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
- 验证创建结果:
qemu-img info /kvm/vms/images/win2016-test/win2016-c.qcow2
其他常见格式选项:
• -f raw:原始格式
• -f vmdk:VMware 格式
• -f vdi:VirtualBox 格式
• -f vpc:Hyper-V 格式
高级选项示例(预分配空间):
预分配所有空间(性能更好,但立即占用磁盘空间)
qemu-img create -f qcow2 -o preallocation=full /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
预分配元数据(折中方案)
qemu-img create -f qcow2 -o preallocation=metadata /kvm/vms/images/win2016-test/win2016-c.qcow2 50G
- 上传系统镜像
使用winscp或者其他SFTP工具上传系统安装盘至/kvm/vms/ISO目录下:

- 创建虚拟机(命令行)
root@cagetest-inner1:~# virt-install \
--name windows2016 \
--os-type=windows \
--ram=2048 --vcpus=2 \
--disk /data/kvm/win2016.qcow2,bus=virtio,size=50 \
--disk /data/iso/virtio-win-0.1.141_amd64.vfd,device=floppy \
--cdrom=/data/iso/cn_windows_server_2016_vl_x64_dvd_11636695.iso \
--network bridge=br0,model=virtio \
--graphic vnc,listen=0.0.0.0,port=5905 \
--virt-type kvm
测试配置
root@centos79-kvm-ovs-11 ISO# virt-install \
> --name win2016-test \
> --os-variant win2k16 \
> --ram=4096 \
> --vcpus=2 \
> --cpu host \
> --disk path=/kvm/vms/images/win2016-test/win2016-c.qcow2,bus=virtio,size=50,format=qcow2 \
> --disk /kvm/vms/ISO/virtio-win-0.1.160.iso,device=cdrom \
> --disk /kvm/vms/ISO/cn_windows_server_2016_x64_dvd_9718765.iso,device=cdrom \
> --network bridge=br-lan4,model=virtio \
> --graphics vnc,listen=0.0.0.0,port=5902 \
> --video qxl \
> --channel spicevmc \
> --noautoconsole \
> --virt-type kvm
修复:
DISK=$(ls /kvm/vms/images/win2016-test/*win2016*.qcow2 2>/dev/null | head -1)
-z "$DISK" && DISK="/kvm/vms/images/win2016-test/win2016-c.qcow2"
virt-install \
--name win2016-test \
--os-variant win2k16 \
--ram 4096 \
--vcpus 2 \
--cpu host \
--disk $DISK \
--network bridge=br-lan4,model=virtio
--graphics vnc,listen=0.0.0.0,port=5902 \
--video qxl \
--noautoconsole \
--channel spicevmc \
--import
通过virt-manager 调整boot选项,完成后重新启动系统,上面方法直接加了驱动光盘,所以系统启动需要调整下磁盘

- 虚拟机安装系统(win2016)




根据系统版本选择




系统安装完成后,更新其他驱动

常用开关机命令:
root@centos79-kvm-ovs-11 \~# virsh shutdown win2016-test
Domain win2016-test is being shutdown
root@centos79-kvm-ovs-11 \~# virsh list --all
Id Name State
- win2016-test shut off
root@centos79-kvm-ovs-11 \~# virsh start win2016-test
Domain win2016-test started
root@centos79-kvm-ovs-11 \~# virsh list
Id Name State
1 win2016-test running
- KVM虚拟机优化
- 内存调整:
KVM Windows 动态内存配置
在 KVM 中为 Windows 虚拟机启用动态内存,需要结合 virtio-balloon 驱动 与 virsh 命令实现在线调整。以下步骤可帮助你完成配置与使用。
- 准备工作
确保 Windows 虚拟机已安装 virtio-win 驱动包,并在设备管理器中正确安装 Virtio Balloon Driver。
在虚拟机 XML 配置中添加 balloon 设备:
<devices>
<memballoon model='virtio'>
<stats period='10'/>
</memballoon>
</devices>
这样可每 10 秒采集一次内存使用数据。
- 方法一:使用 virsh 在线调整
步骤:
查看当前内存信息
virsh dommemstat <虚拟机名称>
动态调整内存(无需重启)
virsh setmem <虚拟机名称> 2G --live
测试设置:
先查看现有配置为4G,且系统为windows,采用动态调整方式

过程: 关闭虚拟机修改配置文件。启动虚拟机即可
如果支持动态调整不会报"error"


设置最大内存(一次性配置)
virsh setmaxmem <虚拟机名称> 4G --config
此方法适合需要快速调整的场景。
- 方法二:修改 XML 配置文件
步骤:
导出配置:
virsh dumpxml <虚拟机名称> > vm.xml
修改 <memory> 与 <currentMemory> 值(单位 KiB)。
导入新配置:
virsh define vm.xml
重启虚拟机使更改生效。
验证与监控
使用 virsh dommemstat 查看实时内存占用。
在 Windows 任务管理器中确认内存变化。
注意 Windows 会显示最大可用内存值,可能与实际使用不同。
最佳实践:
对运行中的 Windows 虚拟机,推荐优先使用 virsh setmem --live 实现无中断调整。
在生产环境中,建议先设置合理的最大内存上限,再进行动态分配,以避免资源争用。
安装 virtio-balloon 驱动是实现动态内存的前提,否则调整不会生效。
- KVM虚拟机磁盘扩容
在KVM虚拟化环境中,磁盘空间不足可能会影响系统运行。以下是为KVM虚拟机扩展磁盘容量的详细步骤。
- 步骤 1:关闭虚拟机并备份数据
关闭虚拟机:
virsh shutdown <虚拟机名称>
检查快照(如有快照需删除):
virsh snapshot-list <虚拟机名称>
virsh snapshot-delete <虚拟机名称> <快照名称>
备份磁盘文件:
cp /path/to/disk.qcow2 /path/to/disk_backup.qcow2
- 步骤 2:调整磁盘大小
使用 qemu-img 命令扩展磁盘文件:
qemu-img resize /path/to/disk.qcow2 +10G
验证调整结果:
qemu-img info /path/to/disk.qcow2
-
windowns分区调整后,开机进入磁盘管理扩容相关磁盘即可
-
步骤 3:调整分区-linux
登录虚拟机并使用 fdisk 工具调整分区: fdisk /dev/vda 删除旧分区(仅删除分区表,不影响数据)。 创建新分区,起始扇区需与原分区一致。 保存并退出。
刷新分区表:
partprobe
- 步骤 4:扩展文件系统
根据文件系统类型执行以下命令:
ext4 文件系统:
resize2fs /dev/vda1
XFS 文件系统(CentOS默认):
xfs_growfs /
- 步骤 5:验证扩容结果
检查磁盘空间:
df -hT /
查看分区信息:
lsblk
注意事项:
确保操作前备份重要数据。
删除分区时,起始扇区必须与原分区一致。
根据实际文件系统选择正确的扩展命令。
通过以上步骤,您可以安全高效地为KVM虚拟机扩展磁盘容量。
- 虚拟机的删除常用命令
要删除KVM虚拟机,可以按照以下步骤操作:
- 临时删除:
使用命令 virsh destroy 虚拟机名称 来临时停止虚拟机。
Virsh destroy 虚拟机名称
- 彻底删除:
使用命令 virsh undefine 虚拟机名称 来从虚拟机安装信息中删除虚拟机配置。
Virsh undefine 虚拟机名称
- 删除磁盘文件:如果需要同时删除虚拟机的磁盘文件,
可以使用 virsh undefine 虚拟机名称 --remove-all-storage 命令。
virsh undefine 虚拟机名称 --remove-all-storage
- 使用图形界面:可以通过图形界面工具如
Virt-Manager 来删除虚拟机。
这些步骤可以帮助您有效地删除不再需要的KVM虚拟机。
- 虚拟机修改名字
KVM虚拟机改名
在KVM中,可以通过以下几种方法重命名虚拟机:使用virsh命令、修改XML配置文件或使用virt-manager图形界面。以下是具体步骤:
- 方法一:使用 virsh 命令
这是最简单的方法,适合熟悉命令行的用户。
步骤:
- 关闭虚拟机 确保虚拟机已停止运行:
virsh shutdown <旧名称>
- 重命名虚拟机 使用domrename命令更改名称:
virsh domrename <旧名称> <新名称>
- 启动虚拟机 重命名完成后,重新启动虚拟机:
virsh start <新名称>
- 方法二:修改 XML 配置文件
此方法更灵活,适合需要手动调整配置的场景。
步骤:
- 导出配置文件 将虚拟机的配置导出到XML文件:
virsh dumpxml <旧名称> > /tmp/vm.xml
- 编辑配置文件 使用文本编辑器打开XML文件,修改<name>标签中的名称:
<name>新名称</name>
- 删除旧虚拟机定义 删除旧的虚拟机定义:
virsh undefine <旧名称>
- 导入新的配置文件 使用修改后的XML文件定义新的虚拟机:
virsh define /tmp/vm.xml
- 启动虚拟机 启动新的虚拟机:
virsh start <新名称>
- 方法三:使用 virt-manager 图形界面
适合不熟悉命令行的用户。
步骤:
- 打开virt-manager并选择目标虚拟机。
- 右键点击虚拟机,选择"关闭"以停止运行。
- 再次右键点击,选择"重命名",输入新名称并保存。
- 启动虚拟机以完成操作。
注意事项
修改前确保虚拟机已停止运行。
如果有快照,需先删除快照。
建议备份原始配置文件以防意外。
通过以上方法,可以轻松完成KVM虚拟机的重命名操作。
- KVM虚拟网络增强(虚拟交换机/vxlan)
- openvSwitch 部署
- 安装openvSwitch
apt update -y
apt install -y openvswitch-switch
- 创建KVM网络
默认KVM已经基于Linux Bridge 创建了一个名为default的NAT网络。
root@node1:~# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400f7e041 yes
root@node1:~#
root@node1:~# virsh net-list
Name State Autostart Persistent
default active yes yes
由于创建虚拟机时可以自由选择使用哪个网络,这里我们为KVM创建一个新的网络即可,原来的网络可以保持不变,或者配置后删除。
- 创建ovs网桥
在定义基于 OVS 的 libvirt 网络之前,您需要在 OVS 中创建虚拟交换机。
root@node1:~# ovs-vsctl add-br ovsbr0
然后验证它是否正确创建:
root@node1:~# ovs-vsctl show
654f0d05-ff5e-4979-a3ac-5b82b5f237a2
Bridge ovsbr0
Port ovsbr0
Interface ovsbr0
type: internal
ovs_version: "2.17.0"
现在你可以开始使用 libvirt 了。
- 定义 libvirt 网络
由于 libvirt 默认使用 Linux bridge,任何创建新网络的 virsh 子命令都会基于它创建一个网络,因此您需要创建一个包含基于 OVS 的网络定义的 XML 文件,并将其导入到库虚拟机。
- 生成一个随机UUID
root@node1:~# uuidgen
c654bba4-224b-46a6-b9fb-99c71087cd05
- 创建ovs网络定义文件
cat >ovs-network.xml<<EOF
<network>
<name>ovs</name>
<uuid>c654bba4-224b-46a6-b9fb-99c71087cd05</uuid>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
</network>
EOF
注意:可以使用 uuidgen 为网络生成新的通用唯一标识符 (UUID)。
- 然后在libvirt中导入网络:
virsh net-define ovs-network.xml
仅在 libvirt 中定义网络不足以使网络可用。您必须启动网络并启用开机自动启动:
virsh net-start ovs
virsh net-autostart ovs
- 查看新创建的网络
virsh net-list
Name State Autostart Persistent
default active yes yes
ovs active yes yes
- 虚拟机桥接至OVS
- OVS 内虚拟机连接配置
在创建虚拟机或者修改虚拟机配置相关文件如下图:

关机修改配置,重新开机,即接入虚拟交换机中;()

虚拟机连接到同一个openvSwitch 虚拟交换机,两台虚拟机能够直接在二层相互通信,
- 虚拟机通过OVS连接外网
虚拟机连接到同一个openvSwitch 虚拟交换机,两台虚拟机能够直接在二层相互通信,下面介绍将物理网卡添加到ovs网桥,实现ovs网桥下的虚拟机访问外网。
- 查看主机网卡默认配置
root@node1:~# cat /etc/netplan/00-installer-config.yaml
This is the network config written by 'subiquity'
network:
version: 2
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.72.41/24
nameservers:
addresses:
-
223.5.5.5
-
223.6.6.6
routes:
- to: default
via: 192.168.72.8
root@node1:~#
- 修改主机网卡配置,将ens33主网卡IP迁移到网桥端口,并且将ens33网卡加入ovs网桥中
root@node1:~# cat /etc/netplan/00-installer-config.yaml
This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: false
dhcp6: false
bridges:
ovsbr0:
openvswitch: {}
interfaces: ens33
dhcp4: false
dhcp6: false
addresses: 192.168.72.41/24
routes:
- to: default
via: 192.168.72.8
nameservers:
addresses: "223.5.5.5","223.6.6.6"
parameters:
stp: false
forward-delay: 4
version: 2
- 验证配置文件,并应用配置使配置生效(谨慎操作,可能有SSH连接中断风险)
root@node1:~# netplan try
root@node1:~# netplan apply
- 查看OVS网桥,ens33网口成功添加到ovs网桥
root@node1:~# ovs-vsctl show
e2084c87-149e-428e-a7bd-89c644a0a9ce
Bridge ovsbr0
fail_mode: standalone
Port ens33
Interface ens33
Port ovsbr0
Interface ovsbr0
type: internal
Port vnet1
Interface vnet1
Port vnet0
Interface vnet0
ovs_version: "2.17.9"
- 查看主机IP,已经配置到OVS网桥接口ovsbr0
root@node1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000
link/ether 00:50:56:aa:61:b5 brd ff:ff:ff:ff:ff:ff
altname enp2s1
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether da:1e:a6:0a:ff:8e brd ff:ff:ff:ff:ff:ff
4: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 00:50:56:aa:61:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.72.41/24 brd 192.168.72.255 scope global ovsbr0
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:feaa:61b5/64 scope link
valid_lft forever preferred_lft forever
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:f7:e0:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 1000
link/ether fe:54:00:81:1d:ee brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe81:1dee/64 scope link
valid_lft forever preferred_lft forever
7: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 1000
link/ether 0e:a2:61:58:2c:1a brd ff:ff:ff:ff:ff:ff
inet6 fe80::ca2:61ff:fe58:2c1a/64 scope link
valid_lft forever preferred_lft forever
root@node1:~#
- 连接到虚拟机,查看虚拟机已经自动获取到外网IP地址(物理网络有提供DHCP服务,否则需要手动配置IP),并且能够正常与外网通信。
root@node1:~# virsh console cirros01
Connected to domain 'cirros01'
Escape character is ^] (Ctrl + ])
$
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 52:54:00:c7:81:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.72.149/24 brd 192.168.72.255 scope global dynamic noprefixroute eth0
valid_lft 42878sec preferred_lft 37478sec
inet6 fe80::5054:ff:fec7:81b6/64 scope link
valid_lft forever preferred_lft forever
$
$ ping www.baidu.com -c 4
PING 183.2.172.185 (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=53 time=7.58 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=53 time=8.47 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=3 ttl=53 time=8.24 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=4 ttl=53 time=8.13 ms
--- 183.2.172.185 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 7.576/8.104/8.472/0.329 ms
- KVM虚拟机的导出/导入/及备份
- 导出KVM虚拟机
导出KVM虚拟机涉及导出虚拟机的磁盘和配置文件,以便在同一台或不同的机器上进行恢复。
导出域名信息并复制磁盘
获取磁盘路径和域信息,导出虚拟机的域信息并将磁盘映像复制到其他位置。
要导出域信息,您可以运行以下"virsh dumpxml"并将输出存储在 XML 文件中。
virsh dumpxml vm-name > /path/to/xm_file.xml
virsh dumpxml ubuntu20.04-clone > ~/Documents/ubuntu.xml
现在将磁盘映像复制到其他位置以供以后使用。
sudo cp /var/lib/libvirt/images/ubuntu20.04-clone.qcow2 ~/Documents/
注意 : 您应该使用 sudo 或使用 root 用户复制磁盘,因为该磁盘归 root 用户所有。
导出过程完成。
导出步骤如下:
- 获取虚拟机配置信息(配置文件保存)
使用virsh dumpxml命令获取虚拟机的配置信息,并将其保存为XML文件。
$ virsh dumpxml vm-name > /path/to/xml_file.xml
-
- 复制磁盘映像(磁盘文件保存)
找到虚拟机的磁盘映像路径,并将其复制到备份位置。
$ sudo cp /var/lib/libvirt/images/vm-name.qcow2 /path/to/backup/
-
- 导出Bash脚本
可以使用Bash脚本自动化导出过程。
#!/usr/bin/env bash
function export_vm() {
read -p "Provide the directory path where disk and config files to be exported: " EXPORT_LOCATION
\[ -d ${EXPORT_LOCATION} ] || mkdir -p ${EXPORT_LOCATION}
VM_NAMES=((virsh list --all \| awk '(NR\>2)' \| awk '{ print 2 }'))
for VM in ${VM_NAMES@}; do
virsh dumpxml {VM} \> {EXPORT_LOCATION}/${VM}.xml
done
sudo rsync -avxp --progress /var/lib/libvirt/images ${EXPORT_LOCATION}
}
case $1 in
export ) export_vm ;;
* ) echo "USAGE: script.sh export"; exit 1 ;;
esac
- 运行脚本:
$ sudo bash script.sh export
注意事项
权限:确保使用sudo或以root用户身份运行命令,因为磁盘文件通常归root所有。
路径:在指定路径时,不要在路径后面添加斜杠('/')。
通过上述步骤,您可以成功导出KVM虚拟机。
- 导入KVM虚拟机
要导入 KVM 虚拟机,您必须通过运行以下命令从导出的 XML 文件定义域。
virsh define --file <path-to-xml-file>
virsh define -file ~/Documents/ubuntu.xml
现在您可以检查 Virt-manager 或运行 virsh 命令,域应该已成功创建。您必须将磁盘映像复制到 XML 文件中定义的目录路径。就我而言,它是默认位置 /var/lib/libvirt/images/。
sudo cp ~/Documents/ubuntu20.04-clone.qcow2 /var/lib/libvirt/images/
导入过程完成。现在您可以启动虚拟机了。
- 用于导出和导入 KVM 虚拟机的 Bash 脚本
创建了一个 bash 脚本,它将负责导出所有配置和磁盘映像。如果您有兴趣,可以在KARTHICK S的 GitHub 存储库 中查看此脚本。选自KARTHICK S的GitHUB库,非常感谢作者。
#!/usr/bin/env bash
AUTHOR : KARTHICK S
PURPOSE : THIS SCRIPT WILL EXPORT/IMPORT THE CONFIG AND VM DISK.
#
usage:
export function will take care of exporting the necessary for all VM. Run as "<scriptname.sh> export"
import function will take care of importing the necessary for all VM. Run as "<scriptname.sh> import"
#
NOTE: Do not add trailing / for the directory when giving export and import path.
#------------------------------------------------------------------------------------------------------
Trigger the script with root user or exit.
if [[ ${UID} -ne 0 ]]; then
echo -e "EXIT - Run the script as root user or with sudo privilege..."
exit
fi
function export_vm(){
# Get the export location.
read -p "Provide the directory path where disk and config files to be exported: " EXPORT_LOCATION
# Create the destination directory if not exists.
[[ -d {EXPORT_LOCATION} ]] || mkdir -p` `{EXPORT_LOCATION}
# Exporting the config using virsh dumpxml command.
VM_NAMES=((virsh list --all| awk '(NR\>2)' | awk '{ print 2 }'))
for VM in ${VM_NAMES[@]}; do
virsh dumpxml {VM} > {EXPORT_LOCATION}/${VM}.xml
done
# Using rsync copy the entire directory from default location.
echo -e "\n Copying disk images \n" && sudo rsync -avxp --progress /var/lib/libvirt/images ${EXPORT_LOCATION}
echo -e "\n Exported Files \n" && ls -lR ${EXPORT_LOCATION}
}
function import_vm(){
# Get the source location.
read -p "Provide the directory path where disk and config files are stored: " SOURCE_LOCATION
# Throws error if directory is not available and exit.
[[ -d ${SOURCE_LOCATION} ]] || { echo "Directory not available"; exit 1 ; }
# Copy all the files to default disk location.
echo -e " Copying disk images \n" && sudo rsync -avxp --progress ${SOURCE_LOCATION}/images /var/lib/libvirt/
if [[ $? -eq 0 ]]; then
# Define VM
echo -e "\n Defining VM \n"
for XML_FILE in ${SOURCE_LOCATION}/*.xml; do
virsh define --file ${XML_FILE}
done
echo -e "\n Imported VM List \n" && virsh list --all
fi
}
case $1 in
export ) export_vm ;;
import ) import_vm ;;
*) echo -e "USAGE :
kvm_export_import.sh export - Export config and disk
kvm_export_import.sh import - Define VM and copy the disk"; exit
esac
该脚本的用法如下。
您可以运行以下命令从 GitHub 克隆要点。
git clone https://gist.github.com/d6c671597592fe5634a39b7974bc8029.git
该脚本执行备份(即导出)和恢复(即恢复)。
让我们使用如下脚本导出 KVM 虚拟机。
sudo bash kvm_export_import.sh export
您必须提供要复制/导出 XML 文件和磁盘映像的目录路径。 指定导出目录时,请勿添加尾部 **/**斜杠 。它将首先复制磁盘映像(.qcow2)并运行"virsh dumpxml"命令导出所有配置。
下图显示了导出的工作原理。

使用 Bash 脚本导出 KVM 虚拟机
当您传递"import"作为参数时,它会首先将磁盘映像复制到默认位置/var/lib/libvirt/并运行"virsh针对所有导出 XML 文件定义"命令。
sudo bash kvm_export_import.sh import

使用 Bash 脚本导入 KVM 虚拟机
- 其他辅助使用配置
- VNC配置
CentOS 7 KVM环境下的VNC配置全攻略:轻松实现远程桌面管理
在KVM虚拟化环境中,VNC(Virtual Network Computing)是一个常用的远程桌面管理工具。它允许用户通过图形界面远程访问和控制虚拟机。本文将详细介绍在CentOS 7上配置KVM环境下的VNC服务,帮助您轻松实现远程桌面管理。
- 准备工作
在开始之前,请确保您的系统满足以下条件:
系统已安装KVM和虚拟机。
系统已安装VNC服务器软件。
- 安装VNC服务器
首先,您需要安装VNC服务器软件。以下是安装命令:
sudo yum install tigervnc-server tigervnc-server-module
-
- 创建VNC用户
为了安全起见,建议为VNC服务创建一个新的用户。以下是创建用户并设置密码的命令:
sudo useradd -m -s /bin/false vncuser
sudo passwd vncuser
-
- 配置VNC服务器
接下来,您需要配置VNC服务器。以下是配置步骤:
修改VNC服务器配置文件:
sudo nano /etc/systemd/system/vncserver@:1.service
修改配置文件内容,将User设置为之前创建的VNC用户:
Unit
Description=Remote Desktop Service (VNC)
After=syslog.target network.target
Service
Type=forking
User=vncuser
Group=vncuser
WorkingDirectory=/home/vncuser
PIDFile=/home/vncuser/.vnc/%H%i.pid
ExecStart=/usr/bin/vncserver :1
ExecStop=/usr/bin/vncserver -kill :1
Install
WantedBy=multi-user.target
保存并关闭文件。
-
- 启动VNC服务
现在,您可以使用以下命令启动VNC服务:
sudo systemctl start vncserver@:1
-
- 测试VNC连接
在另一台计算机上,下载并安装VNC客户端软件。
使用VNC客户端连接到以下地址:
vnc://<虚拟机IP地址>:1
输入VNC用户密码即可登录远程桌面。
常见报错:
1、下图错误,只需系统内关闭virt-manager

2、若连接的目标是 Windows,可能会出现如下报错:Protocol error: invalid message type ...

说明:正常来说,RFB 协议会根据网络质量自动调整画面质量。但如果 KVM 服务器的 VNC 服务不能提供该功能或者无法根据网络质量适配画面质量,就会出现以上错误提示。
此时需要修改设置中的 Picture quality 为 High 或 Medium 即可

-
- 配置自动启动
为了方便管理,您可以将VNC服务设置为开机自动启动:
sudo systemctl enable vncserver@:1
- 使用VNC连接服务器
-
vnc 连接server
-

-
使用windows 远程桌面管理

- kvm 控制linux虚拟机
- KVM如何进入虚拟机?
KVM(Kernel-based Virtual Machine)是一个用于Linux的开源虚拟化技术,通过KVM,用户可以创建和管理虚拟机(VM)。要进入KVM虚拟机,可以通过以下几种方法:使用virsh console、使用图形化工具如Virt-Manager、使用SSH连接。 本文将详细介绍这三种方法,并探讨每种方法的优缺点和适用场景。
- 使用virsh console
virsh是一个强大的命令行工具,它提供了对KVM虚拟机的全面控制。使用virsh console进入虚拟机是最直接的方法之一。
- 安装和配置
首先,需要确保安装了libvirt和virsh。可以通过以下命令安装:
sudo apt-get install libvirt-bin qemu-kvm
sudo apt-get install virt-manager
- 安装完成后,需要启动并启用libvirtd服务:
sudo systemctl start libvirtd
sudo systemctl enable libvirtd
- 2、使用virsh console连接虚拟机
找到虚拟机的名称或UUID,可以使用以下命令列出所有虚拟机:
virsh list --all
然后,使用以下命令连接到虚拟机的控制台:
virsh console <vm-name-or-uuid>
- 3、优缺点
优点:
直接、快速,可以通过SSH远程管理。
无需图形界面,适合服务器环境。
缺点:
需要命令行操作,对新手可能不够友好。
不能提供图形化界面。