KVM 环境部署调试、网络增强、虚拟机安装、故障解决手册

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 源
  1. 在配置YUM源库之前,首先要确保KVM虚拟机已经安装了YUM工具。如果没有,可以通过以下命令进行安装:

sudo yum install yum -y

  1. 备份原有YUM源配置文件

在修改YUM源配置文件之前,建议先备份原有的配置文件,以防配置失败时可以恢复:

sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

  1. 更换yum源

http://mirrors.aliyun.com/

  1. 选择centos、epel镜像

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

  1. 修改默认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 1. 清除yum缓存 \[root@kvm yum.repos.d\]# yum clean all 1. 生成缓存 \[root@kvm yum.repos.d\]# yum makecache ![](https://i-blog.csdnimg.cn/direct/1174ec4366ed46a18637dcfa6a3ee41b.png) 1. 更新YUM源 在新的YUM源配置完成并清理缓存后,可以更新YUM源: sudo yum update -y 1. 安装基础软件包 安装一些常用的软件包,例如wget、curl、vim等: sudo yum install wget curl vim -y 1. **检查防火墙/selinux(测试环境打开,生产环境需注意)** 1. 关闭防火墙 如果不关闭防火墙可能会出现之后安装虚拟机的过程中vnc无法连接的情况。 firewall-cmd --state systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service ![](https://i-blog.csdnimg.cn/direct/7111f53c61364e3da9d6b28fe8b9fa23.png) 1. 关闭SELinux 将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=disabled ![](https://i-blog.csdnimg.cn/direct/9fd2ffc1243b491a82ec847b91db4419.png) * **部署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 ![](https://i-blog.csdnimg.cn/direct/e7a08e763c2d481fbbe0cf5b96912831.png) 注意检查"libvirtd"服务状态(保持持续运行状态) systemctl status libvirtd chkconfig libvirtd on ![](https://i-blog.csdnimg.cn/direct/31602f4447a44ce28815066bd50b5966.png) * **安装虚机镜像文件编辑工具** 用于访问和修改虚拟机的磁盘镜像,libguestfs-tools 允许在宿主机上直接读写虚拟机的磁盘映像文件,无需启动虚拟机,这在某些维护、故障排查场景下非常有用。 yum install libguestfs-tools -y * **内核模块中是否含有kvm** lsmod \| grep kvm ![](https://i-blog.csdnimg.cn/direct/34f1a2a50de6494b8dbf0e5d1fbb5eed.png) * **验证kvm环境可用性** 1. 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 ... ![](https://i-blog.csdnimg.cn/direct/0cad2b2b6c1442baaa9c2dd7ab29894a.png) 1. # 如果验证需修复:IOMMU 警告问题 修复方法:IOMMU 警告问题解决 IOMMU 警告问题解决 Typically by default, IOMMU is not enabled in Linux. I'll show how to enable that virtualization feature on Fedora Linux! 1. 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) ... *** ** * ** *** 2. 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=" * **创建虚拟网络与物理网络的桥接(简单网络)** 1. **配置桥接网络** KVM虚拟机实际是支持多种网络模式,如 桥接、NAT、Host-Only 等,默认是使用桥接网络模式,该模式下,虚拟机可以像物理机一样直接连接到网络上,拥有独立的IP地址,适用于需要让虚拟机对外提供服务,如Web服务或FTP服务等。 在centos7系统上,网络服务管理既可以使用network,也可以使用NetworkManager,因为本篇为较新的7.9版本,所以采用NetworkManager进行管理,如果是7较早的版本,则推荐采用network来进行桥接网络的创建(因为7早期版本NetworkManager对网桥功能支持并不好)。 1. 确定要绑定的网口设备 这里使用 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. 创建桥接网络 对应步骤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 [ <bridge> ] show a list of bridges

showmacs <bridge> show a list of mac addrs

showstp <bridge> show bridge stp info

stp <bridge> {on|off} turn stp on/off

  1. 创建网桥配置

对应确定的网口 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: \ 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: \ 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: \ 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: \ 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: \ 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 1. 修改绑定网络设备配置 创建桥接网络配置后,绑定的网卡设备配置也要同步进行修改,注意修改前先进行备份。 *#* *备份绑定网卡设备* 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** 区分优先级。 1. 重启网络服务 # systemctl restart NetworkManager 【注意】如果重启网络服务时提示 Device unmanaged or not available for activatio 错误,说明修改的网络设备非 NetworkManager 所纳管,可能是 network 所纳管的,所以要重启 network 服务。如不起作用需重启系统 1. 检查配置效果 使用 ifconfig 检查 正确配置情况下, 在 ifconfig 输出中只有 br0 有IP, enp1s0 这个网口是没有IP的。 \[root@donkey \~\]*# ifconfig* br0: flags=4163\ 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\ 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\ 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 ... 测试配置:检查配置是否有问题 ![](https://i-blog.csdnimg.cn/direct/3214179367a842fd9c1e01e2e16c6218.png) 使用 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界面,可以通过图形界面部署及管理虚拟机(可视化),但是步骤较多;命令行方式,熟悉后可非常快捷创建,及批量创建。 * **图形界面安装虚拟机** 1. 执行virt-manager打开管理界面 点击new,创建一个新的虚拟机 ![](https://i-blog.csdnimg.cn/direct/065a44c6d6bc46e59aa25bd1806ef5a0.png) 1. 选择导入镜像(测试举例)![](https://i-blog.csdnimg.cn/direct/098eff1991234403914af15179737562.png) 选择镜像。镜像可以提前拷贝到宿主机的/var/lib/libvirt/images文件夹下面,这是 KVM 默认查找镜像文件的地方。cirros 是一个很小的 linux 镜像,非常适合测试用,大家可以到 http://download.cirros-cloud.net/ 下载。 ![](https://i-blog.csdnimg.cn/direct/ae43e8f44abd4803a8a854c5a7b35399.png) 1. 为虚拟机分配CPU和内存 ![](https://i-blog.csdnimg.cn/direct/8917d0170d2047559e9a960f4dd27d57.png) 1. 设置虚拟机名称 ![](https://i-blog.csdnimg.cn/direct/283cf5a13dfd46b0b2c854af9c5c2d71.png) 1. 点击完成,弹出的控制台有报错 ![](https://i-blog.csdnimg.cn/direct/3cd0487faae94115b0d37f4a5efbcb0f.png) 1. 解决如下:Display Spice-Spice Server-Type 由 Spice server 改为 VNC server ![](https://i-blog.csdnimg.cn/direct/17fa6a69ca054cec8c506382e52602d4.png) 1. 关闭后,重新启动 ![](https://i-blog.csdnimg.cn/direct/f51061b0bfc3475d8ee3ee7086be72fc.png) 1. 通过virsh list命令,可以查看运行的虚拟机 * ![](https://i-blog.csdnimg.cn/direct/d73e6faa7ba14220858c8e4f33976ea9.png) * **命令行界面安装虚拟机** 1. **存储池创建** 命令行界面安装虚拟机,建议规划相关的目录/子目录放置虚拟机磁盘文件,ISO的文件,便于后期管理。 当然默认虚拟机磁盘目录为"/var/lib/libvirt/images/",可以自己规划 本次测试目录为: **Images** **虚拟机存放目录(每个虚拟机一个虚拟机名称的目录,放磁盘文件)** **ISO** **为安装ISO** **存放区** 1. # 创建目录 \[root@centos79-kvm-ovs-11 /\]# mkdir /kvm/vms/images -p \[root@centos79-kvm-ovs-11 /\]# mkdir /kvm/vms/ISO -p 1. # 创建永久目录存储池 \[root@centos79-kvm-ovs-11 /\]# virsh pool-define-as keep_dpool --type dir --target /kvm/vms Pool keep_dpool defined # 说明;创建永久目录存储池 1. # 构建池 \[root@centos79-kvm-ovs-11 /\]# virsh pool-build keep_dpool Pool keep_dpool built 1. # 查看目录池状态 \[root@centos79-kvm-ovs-11 /\]# virsh pool-list --persistent --all Name State Autostart ------------------------------------------- keep_dpool inactive no 1. # 查看目录池状态 \[root@centos79-kvm-ovs-11 /\]# tree /etc/libvirt/storage/ /etc/libvirt/storage/ └── keep_dpool.xml 0 directories, 1 file # pool-define-as 创建的存储池没有启动,在存储目录中有定义文件 1. # 激活池 virsh pool-start keep_dpool 1. # 设置自动启动 配置存储池在系统启动时自动激活: virsh pool-autostart keep_dpool 1. #验证配置 查看存储池状态以确认是否成功创建: virsh pool-list --all ![](https://i-blog.csdnimg.cn/direct/1c2f2f4657454f46981c14863618c64a.png) 1. *注意事项与最佳实践* 权限管理:确保目标目录具有正确的权限,避免虚拟机无法访问。可使用以下命令调整权限: chmod -R 755 /kvm/images chown -R libvirt-qemu:kvm /kvm/images 持久化与临时性:永久存储池适用于长期使用,而临时存储池适合测试或短期需求。 验证路径:通过以下命令检查配置文件路径是否正确: virsh pool-dumpxml my_pool \| grep -i path 通过以上步骤,您可以轻松在KVM环境中设置和管理存储池,为虚拟机提供高效的存储支持。 1. **创建虚拟机** 1. 创建虚拟机磁盘 例: \[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) 可选操作: 1. 如果目录不存在,先创建: mkdir -p /kvm/vms/images/win2016-test/ 2. 创建镜像: qemu-img create -f qcow2 /kvm/vms/images/win2016-test/win2016-c.qcow2 50G 3. 验证创建结果: 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 1. 上传系统镜像 使用winscp或者其他SFTP工具上传系统安装盘至/kvm/vms/ISO目录下: ![](https://i-blog.csdnimg.cn/direct/22a52ba1df164f35acc489d0c10c2a3e.png) 1. 创建虚拟机(命令行) 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选项,完成后重新启动系统,上面方法直接加了驱动光盘,所以系统启动需要调整下磁盘 ![](https://i-blog.csdnimg.cn/direct/940af57178d14f1e88da5d2144f4ec95.png) 1. 虚拟机安装系统(win2016) ![](https://i-blog.csdnimg.cn/direct/644663e1ee6441a88d6403de303ed53b.png) ![](https://i-blog.csdnimg.cn/direct/6706f8e238d84fd6bcdd29290db03608.png) ![](https://i-blog.csdnimg.cn/direct/62479862a50247f888135a35005cf9c8.png) ![](https://i-blog.csdnimg.cn/direct/4e9eff0a8b9241d181e73329b430b6a7.png) 根据系统版本选择 ![](https://i-blog.csdnimg.cn/direct/ded62fae444d4df0a70fd7f6547762f0.png) ![](https://i-blog.csdnimg.cn/direct/d2a260b8094346ba9dc1c38e1d2f2d97.png) ![](https://i-blog.csdnimg.cn/direct/3b1d0c40bc6e403fbcca00801f64e41a.png) ![](https://i-blog.csdnimg.cn/direct/5a8dca45a83347b585a95c47d17dc4e6.png) 系统安装完成后,更新其他驱动 ![](https://i-blog.csdnimg.cn/direct/77b9ddac87df4e8abd9ad1be5c76bd50.png) 常用开关机命令: \[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虚拟机优化** 1. **内存调整:** KVM Windows 动态内存配置 在 KVM 中为 Windows 虚拟机启用动态内存,需要结合 virtio-balloon 驱动 与 virsh 命令实现在线调整。以下步骤可帮助你完成配置与使用。 1. 准备工作 确保 Windows 虚拟机已安装 virtio-win 驱动包,并在设备管理器中正确安装 Virtio Balloon Driver。 在虚拟机 XML 配置中添加 balloon 设备: \ \ \ \ \ 这样可每 10 秒采集一次内存使用数据。 1. 方法一:使用 virsh 在线调整 步骤: 查看当前内存信息 virsh dommemstat \<虚拟机名称\> 动态调整内存(无需重启) virsh setmem \<虚拟机名称\> 2G --live 测试设置: 先查看现有配置为4G,且系统为windows,采用动态调整方式 ![](https://i-blog.csdnimg.cn/direct/8f1d2e398e2f422d9842789183f85f33.png) 过程: 关闭虚拟机修改配置文件。启动虚拟机即可 如果支持动态调整不会报"error" ![](https://i-blog.csdnimg.cn/direct/749a1135ab6d4197a42114c59061a8f0.png) ![](https://i-blog.csdnimg.cn/direct/e03e5c908f344c00b223eebd1797ae71.png) 设置最大内存(一次性配置) virsh setmaxmem \<虚拟机名称\> 4G --config 此方法适合需要快速调整的场景。 1. 方法二:修改 XML 配置文件 步骤: 导出配置: virsh dumpxml \<虚拟机名称\> \> vm.xml 修改 \ 与 \ 值(单位 KiB)。 导入新配置: virsh define vm.xml 重启虚拟机使更改生效。 验证与监控 使用 virsh dommemstat 查看实时内存占用。 在 Windows 任务管理器中确认内存变化。 注意 Windows 会显示最大可用内存值,可能与实际使用不同。 最佳实践: 对运行中的 Windows 虚拟机,推荐优先使用 virsh setmem --live 实现无中断调整。 在生产环境中,建议先设置合理的最大内存上限,再进行动态分配,以避免资源争用。 安装 virtio-balloon 驱动是实现动态内存的前提,否则调整不会生效。 1. **KVM虚拟机磁盘扩容** 在KVM虚拟化环境中,磁盘空间不足可能会影响系统运行。以下是为KVM虚拟机扩展磁盘容量的详细步骤。 1. 步骤 1:关闭虚拟机并备份数据 关闭虚拟机: virsh shutdown \<虚拟机名称\> 检查快照(如有快照需删除): virsh snapshot-list \<虚拟机名称\> virsh snapshot-delete \<虚拟机名称\> \<快照名称\> 备份磁盘文件: cp /path/to/disk.qcow2 /path/to/disk_backup.qcow2 1. 步骤 2:调整磁盘大小 使用 qemu-img 命令扩展磁盘文件: qemu-img resize /path/to/disk.qcow2 +10G 验证调整结果: qemu-img info /path/to/disk.qcow2 1. windowns分区调整后,开机进入磁盘管理扩容相关磁盘即可 1. 步骤 3:调整分区-linux 登录虚拟机并使用 fdisk 工具调整分区: fdisk /dev/vda 删除旧分区(仅删除分区表,不影响数据)。 创建新分区,起始扇区需与原分区一致。 保存并退出。 刷新分区表: partprobe 1. 步骤 4:扩展文件系统 根据文件系统类型执行以下命令: ext4 文件系统: resize2fs /dev/vda1 XFS 文件系统(CentOS默认): xfs_growfs / 1. 步骤 5:验证扩容结果 检查磁盘空间: df -hT / 查看分区信息: lsblk 注意事项: 确保操作前备份重要数据。 删除分区时,起始扇区必须与原分区一致。 根据实际文件系统选择正确的扩展命令。 通过以上步骤,您可以安全高效地为KVM虚拟机扩展磁盘容量。 1. **虚拟机的删除常用命令** 要删除KVM虚拟机,可以按照以下步骤操作: 1. 临时删除: 使用命令 virsh destroy 虚拟机名称 来临时停止虚拟机。  Virsh destroy 虚拟机名称 1. 彻底删除: 使用命令 virsh undefine 虚拟机名称 来从虚拟机安装信息中删除虚拟机配置。 Virsh undefine 虚拟机名称 1. 删除磁盘文件:如果需要同时删除虚拟机的磁盘文件, 可以使用 virsh undefine 虚拟机名称 --remove-all-storage 命令。  virsh undefine 虚拟机名称 --remove-all-storage 1. 使用图形界面:可以通过图形界面工具如  Virt-Manager 来删除虚拟机。  这些步骤可以帮助您有效地删除不再需要的KVM虚拟机。 1. **虚拟机修改名字** KVM虚拟机改名 在KVM中,可以通过以下几种方法重命名虚拟机:使用virsh命令、修改XML配置文件或使用virt-manager图形界面。以下是具体步骤: 1. 方法一:使用 virsh 命令 这是最简单的方法,适合熟悉命令行的用户。 步骤: 1. 关闭虚拟机 确保虚拟机已停止运行: virsh shutdown \<旧名称\> 1. 重命名虚拟机 使用domrename命令更改名称: virsh domrename \<旧名称\> \<新名称\> 1. 启动虚拟机 重命名完成后,重新启动虚拟机: virsh start \<新名称\> 1. 方法二:修改 XML 配置文件 此方法更灵活,适合需要手动调整配置的场景。 步骤: 1. 导出配置文件 将虚拟机的配置导出到XML文件: virsh dumpxml \<旧名称\> \> /tmp/vm.xml 1. 编辑配置文件 使用文本编辑器打开XML文件,修改\标签中的名称: \新名称\ 1. 删除旧虚拟机定义 删除旧的虚拟机定义: virsh undefine \<旧名称\> 1. 导入新的配置文件 使用修改后的XML文件定义新的虚拟机: virsh define /tmp/vm.xml 1. 启动虚拟机 启动新的虚拟机: virsh start \<新名称\> 1. 方法三:使用 virt-manager 图形界面 适合不熟悉命令行的用户。 步骤: 1. 打开virt-manager并选择目标虚拟机。 2. 右键点击虚拟机,选择"关闭"以停止运行。 3. 再次右键点击,选择"重命名",输入新名称并保存。 4. 启动虚拟机以完成操作。 ***注意事项*** 修改前确保虚拟机已停止运行。 如果有快照,需先删除快照。 建议备份原始配置文件以防意外。 通过以上方法,可以轻松完成KVM虚拟机的重命名操作。 * **KVM虚拟网络增强(虚拟交换机/vxlan)** * **openvSwitch 部署** 1. **安装openvSwitch** apt update -y apt install -y openvswitch-switch 1. **创建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创建一个新的网络即可,原来的网络可以保持不变,或者配置后删除。 1. **创建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 了。 1. **定义 libvirt 网络** 由于 libvirt 默认使用 Linux bridge,任何创建新网络的 virsh 子命令都会基于它创建一个网络,因此您需要创建一个包含基于 OVS 的网络定义的 XML 文件,并将其导入到库虚拟机。 1. 生成一个随机UUID root@node1:\~# uuidgen c654bba4-224b-46a6-b9fb-99c71087cd05 1. 创建ovs网络定义文件 cat \>ovs-network.xml\<\ \ovs\ \c654bba4-224b-46a6-b9fb-99c71087cd05\ \ \ \ \ EOF 注意:可以使用 uuidgen 为网络生成新的通用唯一标识符 (UUID)。 1. 然后在libvirt中导入网络: virsh net-define ovs-network.xml 仅在 libvirt 中定义网络不足以使网络可用。您必须启动网络并启用开机自动启动: virsh net-start ovs virsh net-autostart ovs 1. **查看新创建的网络** # virsh net-list Name State Autostart Persistent -------------------------------------------- default active yes yes ovs active yes yes * **虚拟机桥接至OVS** 1. **OVS 内虚拟机连接配置** 在创建虚拟机或者修改虚拟机配置相关文件如下图: ![](https://i-blog.csdnimg.cn/direct/6aa9e4960f154e4380c63859592c1f9f.png) 关机修改配置,重新开机,即接入虚拟交换机中;() ![](https://i-blog.csdnimg.cn/direct/58139210cacb4b1c99f4be47753a1ae9.png) 虚拟机连接到同一个openvSwitch 虚拟交换机,两台虚拟机能够直接在二层相互通信, 1. **虚拟机通过OVS连接外网** 虚拟机连接到同一个openvSwitch 虚拟交换机,两台虚拟机能够直接在二层相互通信,下面介绍将物理网卡添加到ovs网桥,实现ovs网桥下的虚拟机访问外网。 1. 查看主机网卡默认配置 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:\~# 1. 修改主机网卡配置,将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

  1. 验证配置文件,并应用配置使配置生效(谨慎操作,可能有SSH连接中断风险)

root@node1:~# netplan try

root@node1:~# netplan apply

  1. 查看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"

  1. 查看主机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:~#

  1. 连接到虚拟机,查看虚拟机已经自动获取到外网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 用户所有。

导出过程完成。

导出步骤如下:

  1. 获取虚拟机配置信息(配置文件保存)

使用virsh dumpxml命令获取虚拟机的配置信息,并将其保存为XML文件。
$ virsh dumpxml vm-name > /path/to/xml_file.xml

    1. 复制磁盘映像(磁盘文件保存)

找到虚拟机的磁盘映像路径,并将其复制到备份位置。
$ sudo cp /var/lib/libvirt/images/vm-name.qcow2 /path/to/backup/

    1. 导出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 1. 运行脚本: $ sudo bash script.sh export ***注意事项*** 权限:确保使用sudo或以root用户身份运行命令,因为磁盘文件通常归root所有。 路径:在指定路径时,不要在路径后面添加斜杠('/')。 通过上述步骤,您可以成功导出KVM虚拟机。 * **导入KVM虚拟机** 要导入 KVM 虚拟机,您必须通过运行以下命令从导出的 XML 文件定义域。 virsh define --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 "\ export" import function will take care of importing the necessary for all VM. Run as "\ 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"命令导出所有配置。 下图显示了导出的工作原理。 ![](https://i-blog.csdnimg.cn/direct/b6c99bf284b64a8eb31cdef29f7377e0.png) 使用 Bash 脚本导出 KVM 虚拟机 当您传递"import"作为参数时,它会首先将磁盘映像复制到默认位置/var/lib/libvirt/并运行"virsh针对所有导出 XML 文件定义"命令。 sudo bash kvm_export_import.sh import ![](https://i-blog.csdnimg.cn/direct/cfa4d20069db4a6a9b79a75b627955fb.png) 使用 Bash 脚本导入 KVM 虚拟机 * **其他辅助使用配置** 1. **VNC配置** CentOS 7 KVM环境下的VNC配置全攻略:轻松实现远程桌面管理 在KVM虚拟化环境中,VNC(Virtual Network Computing)是一个常用的远程桌面管理工具。它允许用户通过图形界面远程访问和控制虚拟机。本文将详细介绍在CentOS 7上配置KVM环境下的VNC服务,帮助您轻松实现远程桌面管理。 1. 准备工作 在开始之前,请确保您的系统满足以下条件: 系统已安装KVM和虚拟机。 系统已安装VNC服务器软件。 1. 安装VNC服务器 首先,您需要安装VNC服务器软件。以下是安装命令: sudo yum install tigervnc-server tigervnc-server-module 1. 3. 创建VNC用户 为了安全起见,建议为VNC服务创建一个新的用户。以下是创建用户并设置密码的命令: sudo useradd -m -s /bin/false vncuser sudo passwd vncuser 1. 4. 配置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

保存并关闭文件。

    1. 启动VNC服务

现在,您可以使用以下命令启动VNC服务:

sudo systemctl start vncserver@:1

    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 即可

    1. 配置自动启动

为了方便管理,您可以将VNC服务设置为开机自动启动:

sudo systemctl enable vncserver@:1

  1. 使用VNC连接服务器
  1. vnc 连接server

  2. 使用windows 远程桌面管理

  1. kvm 控制linux虚拟机
  1. KVM如何进入虚拟机?

KVM(Kernel-based Virtual Machine)是一个用于Linux的开源虚拟化技术,通过KVM,用户可以创建和管理虚拟机(VM)。要进入KVM虚拟机,可以通过以下几种方法:使用virsh console、使用图形化工具如Virt-Manager、使用SSH连接。 本文将详细介绍这三种方法,并探讨每种方法的优缺点和适用场景。

  1. 使用virsh console

virsh是一个强大的命令行工具,它提供了对KVM虚拟机的全面控制。使用virsh console进入虚拟机是最直接的方法之一。

  1. 安装和配置

首先,需要确保安装了libvirt和virsh。可以通过以下命令安装:

sudo apt-get install libvirt-bin qemu-kvm

sudo apt-get install virt-manager

  1. 安装完成后,需要启动并启用libvirtd服务:

sudo systemctl start libvirtd

sudo systemctl enable libvirtd

  1. 2、使用virsh console连接虚拟机

找到虚拟机的名称或UUID,可以使用以下命令列出所有虚拟机:
virsh list --all

然后,使用以下命令连接到虚拟机的控制台:
virsh console <vm-name-or-uuid>

  1. 3、优缺点

优点:

直接、快速,可以通过SSH远程管理。

无需图形界面,适合服务器环境。

缺点:

需要命令行操作,对新手可能不够友好。

不能提供图形化界面。