KVM虚拟化实记

⛺O、背景
近年来,虚拟化技术发展日新月异,市面上也涌现出很多虚拟化管理平台,如:PVE、ESXI、VMware Workstation、OpenStack、qemu、kvm、 Xen 等等;但是绝大多数还是以支持x86 芯片为主,对于 Arrch64 架构下虚拟化的支持程度仍然不高。本次公司项目需要在华为鲲鹏920(Arrch64)的机器上搭建虚拟化环境,调研发现PVE、ESXI、VMware Workstation 等成熟的虚拟化管理平台官方未支持 arm版本,即使能网上找到一些安装方式,也都是开发爱好者二次开发版,安装部署复杂且安全性也不敢保证。最终还是以原始的 KVM 虚拟化技术实现了本次需求,现将本次 调研、安装部署和踩坑的过程做个分享,希望能对也有 Arrch64 架构下 KVM 虚拟化搭建需求的你带来帮助
⛺一、KVM虚拟化简介
1.简介
在计算机技术中,虚拟化是一种资源管理技术,它将计算机的各种实体资源(处理器、内存、磁盘、网络适配器等)予以抽象、转换后呈现,并可分割、组合为一个或多个计算机配置环境。这种资源管理技术打破了实体结构不可分割的障碍,使这些资源在虚拟化后不受现有资源的架设方式、地域或物理配置限制,从而让用户可以更好地应用计算机硬件资源,提高资源利用率。
虚拟化使得一台物理服务器上可以运行多台虚拟机,虚拟机共享物理机的处理器、内存、I/O设备等资源,但逻辑上虚拟机之间是互相隔离的。在虚拟化技术中,通常将这个物理服务器称为宿主机,宿主机上运行的虚拟机也叫客户机,虚拟机内部运行的操作系统称为客户机操作系统。在宿主机和虚拟机之间存在一层叫虚拟化层的软件,用于实现虚拟硬件的模拟,通常这个虚拟化层被称为虚拟机监视器,如下图所示:
2.虚拟化架构
当前主流虚拟化技术按照VMM(Virtual Machine Monitor)实现结构不同分为两种:
(1)Hypervisor模型
在这种模型中,VMM被看做是一个完备的操作系统,同时还具备虚拟化功能,VMM直接管理所有的物理资源,包括处理器,内存和I/O设备等。
(2)宿主模型
这种模型中,物理资源是由宿主机操作系统管理,宿主机操作系统是传统的操作系统,如Linux,Windows等,宿主机操作系统不提供虚拟化能力,提供虚拟化能力的VMM作为系统的一个驱动或者软件运行在宿主操作系统上,VMM通过调用host OS的服务获得资源,实现处理器,内存和I/O设备的模拟,这种模型的虚拟化实现有KVM、Virtual Box等。
KVM(Kernel-based Virtual Machine)即基于内核的虚拟机,是Linux的一个内核模块,该内核模块使Linux成为一个hypervisor。KVM架构如下图所示。KVM本身未模拟任何硬件设备,它用于使能硬件提供的虚拟化能力,比如Intel VT-x, AMD-V, ARM virtualization extensions等。主板、内存及I/O等设备的模拟由用户态的QEMU完成。用户态QEMU配合内核KVM模块共同完成虚拟机的硬件模拟,客户机操作系统运行在QEMU和KVM模拟的硬件上。
3.虚拟机组件
本文以openEuler为例,openEuler软件包中提供的虚拟化相关组件如下:
- KVM:提供核心的虚拟化基础设施,使Linux系统成为一个hypervisor,支持多个虚拟机同时在该主机上运行。
- QEMU:模拟处理器并提供一组设备模型,配合KVM实现基于硬件的虚拟化模拟加速。
- Libvirt:为管理虚拟机提供工具集,主要包含统一、稳定、开放的应用程序接口(API)、守护进程 (Libvirtd)和一个默认命令行管理工具(virsh)。
- Open vSwitch:为虚拟机提供虚拟网络的工具集,支持编程扩展,以及标准的管理接口和协议(如NetFlow, sFlow,IPFIX, RSPAN, CLI, LACP, 802.1ag)。
4.虚拟化特点
业界普遍认可虚拟化有以下特点:
(1)分区
虚拟化可以对一台物理服务器进行软件逻辑分割,实现运行多台不同规格的虚拟机(虚拟服务器)。
(2)隔离
虚拟化能够模拟虚拟硬件,为虚拟机运行完整操作系统提供硬件条件,每个虚拟机内部操作系统都是独立的,互相隔离的。例如一台虚拟机的操作系统由于受到恶意破坏而崩溃,其他虚拟机内部的操作系统和应用不会受到任何影响。
(3)封装性
以虚拟机为粒度封装,优秀的封装性使得虚拟机比物理机更灵活,可以实现虚拟机的热迁移、快照、克隆等功能,实现数据中心的快速部署和自动化运维。
(4)硬件无关
经过虚拟化层的抽象后,虚拟机与底层的硬件没有直接的绑定关系,可以在其他服务器上不加修改地运行虚拟机。
🧸二、KVM虚拟化安装
本文将以 openEuler-22.03-SP2-aarch64 系统为例讲述如何完整安装KVM 虚拟化环境,方法大同小异,X86 架构下安装 KVM 虚拟化环境可自行尝试。
1.配置要求
在openEuler系统中安装KVM虚拟化环境,最低硬件要求:
- AArch64处理器架构:ARMv8以上并且支持虚拟化扩展
- x86_64处理器架构:支持VT-x
- 2核CPU
- 4GB的内存
- 16GB可用磁盘空间
2.虚拟化组件安装
(1)前提要求
- 已配置 yum 源
- 安装操作需要 root 权限
- 关闭 SELinux
1
2[root@sunshijiang-localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
[root@sunshijiang-localhost ~]# setenforce 0 #临时关闭
(2)安装步骤
安装 QEMU 组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[root@sunshijiang-localhost ~]# yum install -y qemu*
Last metadata expiration check: 0:01:01 ago on 2023年12月05日 星期二 11时05分48秒.
Dependencies resolved.
==================================================================
Package Architecture Version Repository Size
==================================================================
Installing:
qemu aarch64 10:6.2.0-83.oe2203sp2 update 6.5 M
Installing dependencies:
dtc aarch64 1.6.1-3.oe2203sp2 OS 92 k
multipath-tools aarch64 0.8.7-8.oe2203sp2 OS 294 k
qemu-block-curl aarch64 10:6.2.0-83.oe2203sp2 update 46 k
qemu-block-iscsi aarch64 10:6.2.0-83.oe2203sp2 update 52 k
qemu-hw-usb-host aarch64 10:6.2.0-83.oe2203sp2 update 54 k
...
......
Installed:
dtc-1.6.1-3.oe2203sp2.aarch64 multipath-tools-0.8.7-8.oe2203sp2.aarch64 qemu-10:6.2.0-83.oe2203sp2.aarch64
qemu-block-curl-10:6.2.0-83.oe2203sp2.aarch64 qemu-block-iscsi-10:6.2.0-83.oe2203sp2.aarch64 qemu-hw-usb-host-10:6.2.0-83.oe2203sp2.aarch64
virglrenderer-0.8.2-3.oe2203sp2.aarch64
Complete!
[root@sunshijiang-localhost ~]#安装 libvirt 组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@sunshijiang-localhost ~]# yum install -y libvirt
Last metadata expiration check: 0:08:21 ago on 2023年12月05日 星期二 11时18分51秒.
Dependencies resolved.
==================================================================
Package Architecture Version Repository Size
==================================================================
Installing:
libvirt aarch64 6.2.0-57.oe2203sp2 OS 71 k
Installing dependencies:
glusterfs aarch64 10.0-8.oe2203sp2 OS 494 k
...
......
Complete!
[root@sunshijiang-localhost ~]#启动 libvirtd服务
1
2[root@sunshijiang-localhost ~]# systemctl start libvirtd
[root@sunshijiang-localhost ~]#修改qemu权限配置
QEMU组件默认以用户qemu和用户组qemu运行,修改 qemu 权限配置以 root 用户运行,放开 user 和 group 的注释1
2
3
4
5
6
7
8
9
10
11[root@sunshijiang-localhost ~]# vi /etc/libvirt/qemu.conf
...
......
user = "root"
...
group = "root"
...
....../
重启libvirtd使qemu.conf 修改生效
[root@sunshijiang-localhost ~]# systemctl restart libvirtd
(3)安装验证
查看内核是否支持 KVM 虚拟化,,即查看/dev/kvm和/sys/module/kvm文件是否存在,如果文件存在则说明内核支持KVM虚拟化;若文件不存在,则说明系统内核编译时未开启KVM虚拟化,需要更换支持KVM虚拟化的Linux内核。命令和回显如下:
1
2
3
4
5[root@sunshijiang-localhost ~]# ls /dev/kvm
/dev/kvm
[root@sunshijiang-localhost ~]# ls /sys/module/kvm
parameters uevent
[root@sunshijiang-localhost ~]#验证 QEMU 是否安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31[root@sunshijiang-localhost ~]# rpm -qi qemu
Name : qemu
Epoch : 10
Version : 6.2.0
Release : 83.oe2203sp2
Architecture: aarch64
Install Date: 2023年12月05日 星期二 11时18分54秒
Group : Unspecified
Size : 26798835
License : GPLv2 and BSD and MIT and CC-BY-SA-4.0
Signature : RSA/SHA256, 2023年10月31日 星期二 19时29分31秒, Key ID 007fb747fb37bc6f
Source RPM : qemu-6.2.0-83.oe2203sp2.src.rpm
Build Date : 2023年10月31日 星期二 19时24分45秒
Build Host : dc-64g.compass-ci
Packager : http://openeuler.org
URL : http://www.qemu.org
Summary : QEMU is a generic and open source machine emulator and virtualizer
Description :
QEMU is a FAST! processor emulator using dynamic translation to achieve good emulation speed.
QEMU has two operating modes:
Full system emulation. In this mode, QEMU emulates a full system (for example a PC),
including one or several processors and various peripherals. It can be used to launch
different Operating Systems without rebooting the PC or to debug system code.
User mode emulation. In this mode, QEMU can launch processes compiled for one CPU on another CPU.
It can be used to launch the Wine Windows API emulator (https://www.winehq.org) or to ease
cross-compilation and cross-debugging.
You can refer to https://www.qemu.org for more infortmation.
[root@sunshijiang-localhost ~]#验证 libvirt是否安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[root@sunshijiang-localhost ~]# rpm -qi libvirt
Name : libvirt
Version : 6.2.0
Release : 57.oe2203sp2
Architecture: aarch64
Install Date: 2023年12月05日 星期二 11时27分20秒
Group : Unspecified
Size : 0
License : LGPLv2+
Signature : RSA/SHA256, 2023年06月28日 星期三 16时31分39秒, Key ID 007fb747fb37bc6f
Source RPM : libvirt-6.2.0-57.oe2203sp2.src.rpm
Build Date : 2023年06月28日 星期三 16时29分24秒
Build Host : dc-64g.compass-ci
Packager : http://openeuler.org
URL : https://libvirt.org/
Summary : Library providing a simple virtualization API
Description :
Libvirt is a C toolkit to interact with the virtualization capabilities
of recent versions of Linux (and other OSes). The main package includes
the libvirtd server exporting the virtualization support.
[root@sunshijiang-localhost ~]#验证 libvirt 服务是否启动成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@sunshijiang-localhost ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-12-04 16:25:27 CST; 19h ago
TriggeredBy: ● libvirtd.socket
● libvirtd-admin.socket
● libvirtd-ro.socket
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 3971 (libvirtd)
Tasks: 20 (limit: 32768)
Memory: 148.2M
CGroup: /system.slice/libvirtd.service
└─ 3971 /usr/sbin/libvirtd --timeout 120
......
[root@sunshijiang-localhost ~]#
3.虚拟机镜像制作
(1)概述
虚拟机镜像是一个文件,包含了已经完成安装并且可启动操作系统的虚拟磁盘。虚拟机镜像具有不同格式,常见的有raw格式和qcow2格式。qcow2格式镜像相比raw格式,具有占用更小的空间,支持快照、Copy-On-Write、AES加密、zlib压缩等特性,但性能略逊于raw格式镜像。镜像文件的制作借助于qemu-img工具,本文我以qcow2格式镜像文件为例,介绍虚拟机镜像制作过程。
(2)制作镜像
使用root 用户安装 qemu-img 软件包
1
2
3
4
5
6
7[root@sunshijiang-localhost ~]# yum install -y qemu-img
Last metadata expiration check: 0:18:42 ago on 2023年12月05日 星期二 11时18分51秒.
Package qemu-img-10:6.2.0-83.oe2203sp2.aarch64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@sunshijiang-localhost ~]#新建文件夹用于存放虚拟机配置 及 镜像文件
1
2
3[root@sunshijiang-localhost ~]# mkdir /home/kvm-machine/
[root@sunshijiang-localhost ~]# cd /home/kvm-machine/
[root@sunshijiang-localhost kvm]#使用qemu-img 工具创建镜像文件
1
[root@sunshijiang-localhost kvm]# qemu-img create -f <imgFormat> -o <fileOption> <fileName> <diskSize>
其中,各参数含义如下:
imgFormat:镜像格式,取值为raw, qcow2等。
fileOption:文件选项,用于设置镜像文件的特性,如指定后端镜像文件,压缩,加密等特性。
fileName:文件名称。
diskSize:磁盘大小,用于指定块磁盘设备的大小,支持的单位有K、M、G、T,分别代表KiB、MiB、GiB、TiB。
示例命令如下,创建一个磁盘设备大小为100GB、格式为qcow2的镜像文件,命令和回显如下:
1 | [root@sunshijiang-localhost kvm]# qemu-img create -f qcow2 openEuler-image-16core.qcow2 100G |
(3)修改镜像磁盘空间大小
当虚拟机需要更大的磁盘空间时,可以使用qemu-img工具,修改虚拟机镜像磁盘空间的大小,修改方法如下。
查询当前虚拟机镜像磁盘空间大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@sunshijiang-localhost kvm]# qemu-img info openEuler-image-16core.qcow2
image: openEuler-image-16core.qcow2
file format: qcow2
virtual size: 100 GiB (107374182400 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
[root@sunshijiang-localhost kvm]#修改镜像磁盘空间大小
1
[root@sunshijiang-localhost kvm]# qemu-img resize <imgFiLeName> [+|-]<size>
上述命令中,imgFiLeName为镜像名称,“+”和“-”分别表示需要增加或减小的镜像磁盘空间大小,单位为K、M、G、T,代表KiB、MiB、GiB、TiB。
示例命令如下,将上述openEuler-image-16core.qcow2镜像磁盘空间大小扩展到150GiB,即在原来100GiB基础上增加50GiB,命令和回显如下:
1 | [root@sunshijiang-localhost kvm]# qemu-img resize openEuler-image-16core.qcow2 +50G |
- 查询修改后的镜像磁盘空间大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@sunshijiang-localhost kvm]# qemu-img info openEuler-image-16core.qcow2
image: openEuler-image-16core.qcow2
file format: qcow2
virtual size: 150 GiB (161061273600 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
[root@sunshijiang-localhost kvm]#
4.虚拟机引导固件安装
(1)概述
针对不同的架构,引导的方式有所差异。x86支持UEFI(Unified Extensible Firmware Interface)和BIOS方式启动,AArch64仅支持UEFI方式启动。openEuler默认已安装BIOS启动对应的引导文件,不需要用户额外操作。所以这里仅介绍UEFI启动方式的安装方法。
统一的可扩展固件接口UEFI是一种全新类型的接口标准,用于开机自检、引导操作系统的启动,是传统BIOS的一种替代方案。EDK II是一套实现了UEFI标准的开源代码,在虚拟化场景中,通常利用EDK II工具集,通过UEFI的方式启动虚拟机。使用EDK II工具需要在虚拟机启动之前安装对应的软件包 ,本节介绍EDK II的安装方法。
(2)安装方法
如果使用UEFI方式引导,需要安装工具集EDK II,x86架构对应的安装包为edk2-ovmf,AArch64架构对应的安装包为edk2-aarch64。这里我以AArch64架构为例,给出具体的安装方法,x86架构仅需将edk2-aarch64替换为edk2-ovmf。
安装 edk 软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32[root@sunshijiang-localhost kvm]# yum install -y edk2-aarch64
Last metadata expiration check: 0:54:21 ago on 2023年12月05日 星期二 11时40分16秒.
Dependencies resolved.
==================================================================
Package Architecture Version Repository Size
==================================================================
Installing:
edk2-aarch64 noarch 202011-11.oe2203sp2 OS 2.2 M
Transaction Summary
==================================================================Install 1 Package
Total download size: 2.2 M
Installed size: 131 M
Downloading Packages:
edk2-aarch64-202011-11.oe2203sp2.noarch.rpm 4.9 MB/s | 2.2 MB 00:00
------------------------------------------------------------------
Total 3.4 MB/s | 2.2 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing: 1/1
Installing: edk2-aarch64-202011-11.oe2203sp2.noarch 1/1
Verifying: edk2-aarch64-202011-11.oe2203sp2.noarch 1/1
Installed:
edk2-aarch64-202011-11.oe2203sp2.noarch
Complete!
[root@sunshijiang-localhost kvm]#查询edk 软件是否安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19[root@sunshijiang-localhost kvm]# rpm -qi edk2-aarch64
Name : edk2-aarch64
Version : 202011
Release : 11.oe2203sp2
Architecture: noarch
Install Date: 2023年12月05日 星期二 12时34分39秒
Group : Unspecified
Size : 137111513
License : BSD-2-Clause-Patent
Signature : RSA/SHA256, 2023年06月28日 星期三 14时11分55秒, Key ID 007fb747fb37bc6f
Source RPM : edk2-202011-11.oe2203sp2.src.rpm
Build Date : 2023年06月28日 星期三 14时09分42秒
Build Host : dc-64g.compass-ci
Packager : http://openeuler.org
URL : https://github.com/tianocore/edk2
Summary : AARCH64 Virtual Machine Firmware
Description :
EFI Development Kit II AARCH64 UEFI Firmware
[root@sunshijiang-localhost kvm]#
5,虚拟机安装
(1)概述
Libvirt工具采用XML格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件,对虚拟机进行管理。接下来我介绍XML配置文件各个元素的含义,指导大家完成虚拟机配置。
(2)基本格式
虚拟机XML配置文件以domain为根元素,domain根元素中包含多个其他元。XML配置文件中的部分元素可以包含对应属性和属性值,用以详细地描述虚拟机信息,同一元素的不同属性使用空格分开。
XML配置文件的基本格式如下,其中label代表具体标签名,attribute代表属性,value代表属性值,需要根据实际情况修改。
1
2
3
4
5
6
7
8
9
10
11
12
13<domain type='kvm'>
<name>VMName</name> ---虚拟机名称
<memory attribute='value'>8</memory> ---内存数量
<vcpu>4</vcpu> ---cpu数量
<os>
<label attribute='value' attribute='value'> ---操作系统属性值
...
</label>
</os>
<label attribute='value' attribute='value'> ---操作系统属性值
...
</label>
</domain>
(3)配置文件示例
以下是我本次安装部署时已配置好的 XML 配置文件,可取之用之;如果有不一样的地方,可根据实际情况进行修改。
Aarch64 架构虚拟机配置文件内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55<domain type='kvm'>
<name>openEulerVM-16</name> ---虚拟机名称
<memory unit='GiB'>32</memory> ---虚拟机内存
<vcpu>16</vcpu> ---虚拟机CPU
<os>
<type arch='aarch64' machine='virt'>hvm</type> ---虚拟机架构类型
<loader readonly='yes' ---指定虚拟机加载固件(前提:前面edk2 已安装)type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
<nvram>/usr/share/edk2/aarch64/QEMU_EFI.fd</nvram>
</os>
<features> ---虚拟机电源管理接口:GICv3中断控制器
<acpi/>
<gic version='3'/>
</features>
<cpu mode='host-passthrough'> ---虚拟机CPU 处理器模式
<topology sockets='1' cores='16' threads='1'/>
</cpu>
<iothreads>1</iothreads> ---指定iothread数量,用于加速存储设备性能
<clock offset='utc'/> ---指定 时钟类型
<on_poweroff>destroy</on_poweroff> ---虚拟机关闭时采取的动作
<on_reboot>restart</on_reboot> ---虚拟机重启时采取的动作
<on_crash>restart</on_crash> ---虚拟机崩溃时采取的动作
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'> ---虚拟机存储设置:磁盘
<driver name='qemu' type='qcow2' iothread="1"/>
<source file='xxx/openeulerVM16.qcow2'/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
</disk>
<disk type='file' device='cdrom'> ---虚拟机存储设置:光盘
<driver name='qemu' type='raw'/>
<source file='xxx/openEuler-22.03-LTS-SP2-aarch64-dvd.iso'/> ---光盘镜像
<readonly/>
<target dev='sdb' bus='scsi'/>
<boot order='2'/>
</disk>
<interface type='bridge'> ---虚拟机网络设备:桥接
<source bridge='br0'/> ---指定了网桥 br0
<model type='virtio'/>
<mac address='random'/>
<virtualport type='openvswitch'/> --- 指定了网桥类型为OVS
<driver name='vhost' queues='4'/>
</interface>
<console type='pty'/>
<video>
<model type='virtio'/>
</video>
<controller type='scsi' index='0' model='virtio-scsi'/>
<controller type='usb' model='ehci'/> ---虚拟机总线设备
<input type='tablet' bus='usb'/> ---虚拟机输出设备
<input type='keyboard' bus='usb'/>
<graphics type='vnc' listen='0.0.0.0' port='5094' passwd='100%Security'/> ---图形设备
</devices>
<seclabel type='dynamic' model='dac' relabel='yes'/> --串口设备
</domain>根据实际情况需要替换内容:
虚拟机名称:openEulerVM-16
虚拟机内存:32
虚拟机CPU:16
处理器模式:
虚拟机磁盘设置:
虚拟机光盘设置:
虚拟机VNC设置:x86架构虚拟机配置文件内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69<domain type='kvm'>
<name>openEulerVM</name>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>8388608</currentMemory>
<vcpu placement='static'>4</vcpu>
<iothreads>1</iothreads>
<os>
<type arch='x86_64' machine='pc-i440fx-4.0'>hvm</type>
</os>
<features>
<acpi/>
</features>
<cpu mode='host-passthrough' check='none'>
<topology sockets='2' cores='2' threads='1'/>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread='1'/>
<source file='/mnt/openEuler-image.qcow2'/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
<controller type='scsi' index='0' model='virtio-scsi'>
</controller>
<controller type='virtio-serial' index='0'>
</controller>
<controller type='usb' index='0' model='ehci'>
</controller>
<controller type='sata' index='0'>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<interface type='bridge'>
<mac address='52:54:00:c1:c4:23'/>
<source bridge='virbr0'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='keyboard' bus='usb'>
<address type='usb' bus='0' port='2'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='vga' vram='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
</memballoon>
</devices>
</domain>
(4)相关文件准备
保存虚拟机配置文件,如上所示,将虚拟机配置文件保存在之前已经创建好的虚拟机配置文件目录中
1
2
3
4
5[root@sunshijiang-localhost kvm]# pwd
/home/kvm-machine/
[root@sunshijiang-localhost kvm]# ls
openEuler-image-16core.qcow2 openEulerVM-16.xml
[root@sunshijiang-localhost kvm]#传虚拟机操作系统镜像至之前已经创建好的虚拟机配置文件目录中
1
2
3
4
5
6[root@sunshijiang-localhost kvm]# pwd
/home/kvm-machine/
[root@sunshijiang-localhost kvm]# ls
openEuler-image-16core.qcow2 openEulerVM-16.xml
openEuler-22.03-LTS-SP2-aarch64-dvd.iso
[root@sunshijiang-localhost kvm]#
(5)虚拟机创建与启动
当安装了libvirt 后,我们可以使用virsh命令工具管理虚拟机生命周期:包括虚拟机的定义–启动–运行–暂停–保存–关闭等,从而指导大家更好地管理虚拟机。
管理虚拟机命令:virsh
●operate:管理虚拟机生命周期对应操作,例如创建、销毁、启动等。
●obj:命令操作对象,如指定需要操作的虚拟机。
●options:命令选项,该参数可选。
virsh define定义持久化虚拟机,定义完成后虚拟机处于关闭状态,虚拟机被看作为一个domian实例
virsh create创建一个临时性虚拟机,创建完成后虚拟机处于运行状态
virsh start启动虚拟机
virsh shutdown关闭虚拟机。启动虚拟机关机流程,若关机失败可使用强制关闭
virsh destroy强制关闭虚拟机
virsh reboot重启虚拟机
virsh save将虚拟机的运行状态转储到文件中
virsh restore从虚拟机状态转储文件恢复虚拟机
virsh suspend暂停虚拟机的运行,使虚拟机处于paused状态
virsh resume唤醒虚拟机,将处于paused状态的虚拟机恢复到运行状态virsh undefine 销毁持久性虚拟机,虚拟机生命周期完结,不能继续对该虚拟机继续操作
- 虚拟机创建与启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41定义持久化虚拟机
[root@sunshijiang-localhost kvm]# virsh define openEulerVM-16.xml
定义域 openEulerVM-16(从 open16.xml)
[root@sunshijiang-localhost kvm]#
启动虚拟机(前提需要通过步骤 7 完成网桥 br0 的创建)
[root@sunshijiang-localhost kvm]# virsh start openEulerVM-16
查看虚拟机运行状态
[root@sunshijiang-localhost kvm]# virsh list --all
ID 名称 状态
------------------------------------------------------------------
1 openEulerVM-16 运行中
[root@sunshijiang-localhost kvm]#
虚拟机创建好后,使用ifconfig可以看到有1个该虚拟机对应的虚拟网卡接口vNet0
[root@sunshijiang-localhost kvm]# ifconfig |grep vnet
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 1a:5c:7c:cb:3d:43 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@sunshijiang-localhost kvm]#
查询虚拟机基本信息
[root@sunshijiang-localhost kvm]# virsh dominfo openEulerVM-16
Id: 1
Name: openEulerVM-16
UUID: ab472210-db8c-4018-9b3e-fc5319a769f7
OS Type: hvm
State: running
CPU(s): 16
CPU time: 6.8s
Max memory: 33554432 KiB
Used memory: 33554432 KiB
Persistent: no
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0
[root@sunshijiang-localhost kvm]#
6,虚拟机网络配置
(1)概述
为了使虚拟机可以与外部进行网络通信,需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如下图所示,数据传输路径为“虚拟机 -> 虚拟网卡设备 -> Linux Bridge或Open vSwitch网桥 -> 物理网卡”。创建网桥,除为虚拟机配置虚拟网卡设备外,为主机创建网桥是连接虚拟化网络的关键。
虚拟交换机,就是使用软件实现的交换机,具备硬件交换机的功能,但与硬件交换机相比减少了采购成本,且软件层面更具灵活性。虚拟交换机主要使用在云环境中,在虚拟机之间、虚拟机和外部网络之间实现网络的连通。
常用的虚拟交换机有多种,这里以主流的两种作为范例。
Linux Bridge
Linux Bridge简称网桥,工作在数据链路层,将多个局域网(LAN)连起来,根据MAC地址(物理地址)来转发帧,与二层硬件交换机功能相似,通常用于联接数量不多、同一类型的网段。Linux Bridge使用brctl命令创建/删除网桥接口,使用ip或者ifconfig命令设置接口的MAC信息。Bridge设备网络接口可以和Linux上其他设备网络接口连接,从设备被虚拟化为端口port。Port的IP及MAC都不可用,且被设置为接受任何包,最终由Bridge设备来决定数据包的去向——接收到本机、转发、丢弃、广播。Open vSwitch
Open vSwitch(OVS)是一种具有产品级质量的多层虚拟交换机,利用软件的方式实现了硬件交换机的功能。跟硬件交换机相比,OVS具备众多优点:
a. 网络隔离:OVS原生支持VLAN功能本身就可以支持二层网络隔离,同时能够像配置物理交换机一样把同一台host上的众多VM分配到不同VLAN中去。
b.QoS(服务质量)配置:可以按需配置每台VM不同的网络速率和网络带宽,以保证核心业务VM的网络性能,通过OVS命令配置接口的QoS,可以实现物理交换机的traffic queuing和traffic shaping功能。
c.其他功能:支持多种tunnel协议,如vxlan、gre等;支持openflow协议、ovn,具备SDN数据处理能力;支持dpdk,ebpf等高级功能,可以优化数据处理能力。如果对Linux Bridge和OVS作比较,会发现两者之间优劣对比显而易见。Linux Bridge 作为内核实现的原生桥接功能具有转发逻辑简单、转发性能强、功能稳定和可靠等特点,但扩展性较一般;OVS是伴随着虚拟化平台一起成长的虚拟交换机,经过不断优化,在性能上和Linux Bridge相差不大, 但其强大的可配置性和可扩展性便于使其得到更好的应用。
(2)Linux Bridge网桥部署
Linux Bridge相比OVS有更大的便利和优势,因此我以 Linux Bridge网桥部署为例,使虚拟机连接到网络;如果对OVS网桥部署感兴趣的童鞋可以自行百度。后面我也补充了OVS网桥的部署方式,可参考之。
删除默认虚拟网络接口
1
2
3[root@sunshijiang-localhost kvm]# virsh net-destroy default
网络 default 被删除
[root@sunshijiang-localhost kvm]#安装 Linux Bridge 网桥管理工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@sunshijiang-localhost kvm]# yum install -y bridge-utils
Last metadata expiration check: 0:23:04 ago on 2023年12月06日 星期三 13时03分19秒.
Dependencies resolved.
==================================================================
Package Architecture Version Repository Size
==================================================================
Installing:
bridge-utils aarch64 1.7.1-2.oe2203sp2 OS 32 k
...
......
Installed:
bridge-utils-1.7.1-2.oe2203sp2.aarch64
Complete!
[root@sunshijiang-localhost kvm]#确认 bridge-utils安装是否成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[root@sunshijiang-localhost kvm]# rpm -qi bridge-utils
Name : bridge-utils
Version : 1.7.1
Release : 2.oe2203sp2
Architecture: aarch64
Install Date: 2023年12月06日 星期三 13时26分23秒
Group : Unspecified
Size : 92493
License : GPLv2+
Signature : RSA/SHA256, 2023年06月28日 星期三 23时02分42秒, Key ID 007fb747fb37bc6f
Source RPM : bridge-utils-1.7.1-2.oe2203sp2.src.rpm
Build Date : 2023年06月28日 星期三 23时02分38秒
Build Host : dc-64g.compass-ci
Packager : http://openeuler.org
URL : https://wiki.linuxfoundation.org/networking/bridge
Summary : Utilities for configuring the linux ethernet bridge
Description :
This package provides utilities for configuring the linux ethernet
bridge. The linux ethernet bridge can be used for connecting multiple
ethernet devices together.
[root@sunshijiang-localhost kvm]#创建网桥br0
1
2
3[root@sunshijiang-localhost kvm]# brctl addbr br0
如果想删除添加的网桥:brctl delbr br0
[root@sunshijiang-localhost kvm]#查看创建的网桥 br0
1
2
3
4
5[root@sunshijiang-localhost kvm]# brctl show
bridge name bridge id STP enabled interfaces
br-1539de9c7760 8000.02424194fac4 no vethc56d462
br0 8000.000000000000 no vnet0
docker0 8000.0242cba690a8 no [root@sunshijiang-localhost kvm]#将物理网卡enp125s0f0 绑定到网桥 br0
1
2
3[root@sunshijiang-localhost kvm]# brctl addif br0 ens33
如果想删除绑定的网桥网卡关系:brctl delif br0 ens33
[root@sunshijiang-localhost kvm]#注意:这里所有网络连接会断掉,如果你是使用Xshell连接的也会断掉。当网卡加入网桥之后,网卡就是交换机上的一个端口,交换机作为二层设备,其端口是不可能有IP地址的,所以本机的IP地址失效。所以ssh连接什么的都会失效。网桥创建成功后会默认带一个与网桥同名的port,并且这个port的类型是比较特殊的Internal。可以将原网卡IP 设置到此处。顺便可以添加一个默认路由,原默认路由失效了,会导致无法访问外网。
(3)Open vSwitch网桥部署
删除默认虚拟网络接口
注意:使用 ifconfig 命令可以看到有个 virbr0 的虚拟网络接口,这里需要把他删掉;粗浅的解释一下原因:
a.virbr0 是一种虚拟网络接口,这是由于安装和启用了 libvirt 服务后生成的,libvirt 在服务器(host)上生成一个 virtual network switch (virbr0),host 上所有的虚拟机(guests)通过这个 virbr0 连起来。默认情况下 virbr0 使用的是 NAT 模式(采用 IP Masquerade),所以这种情况下 guest 通过 host 才能访问外部。
b.virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。
c.virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。总之这里不需要,需要把他删除。1
2
3[root@sunshijiang-localhost kvm]# virsh net-destroy default
网络 default 被删除
[root@sunshijiang-localhost kvm]#安装Open vSwitch组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25[root@sunshijiang-localhost kvm]# yum install -y openvswitch
==================================================================
Package Architecture Version Repository Size
==================================================================
Installing:
openvswitch aarch64 2.12.4-4.oe2203sp2 update 1.9 M
Installing dependencies:
python3-unversioned-command aarch64 3.9.9-28.oe2203sp2 update6.7 k
Transaction Summary
==================================================================
Install 2 Packages
Total download size: 1.9 M
Installed size: 7.9 M
Downloading Packages:
(1/2): python3-unversioned-command-3.9.9-28.oe2203sp2.aarch64.rpm 49 kB/s | 6.7 kB 00:00
(2/2): openvswitch-2.12.4-4.oe2203sp2.aarch64.rpm 7.2 MB/s | 1.9 MB 00:00
------------------------------------------------------------------
...
......
Installed:
openvswitch-2.12.4-4.oe2203sp2.aarch64 python3-unversioned-command-3.9.9-28.oe2203sp2.aarch64
Complete!
[root@sunshijiang-localhost kvm]#启动Open vSwitch服务
1
2[root@sunshijiang-localhost kvm]# systemctl start openvswitch
[root@sunshijiang-localhost kvm]#设置Open vSwitch服务开机自启动
1
2
3[root@sunshijiang-localhost kvm]# systemctl enable openvswitch
reated symlink /etc/systemd/system/multi-user.target.wants/openvswitch.service → /usr/lib/systemd/system/openvswitch.service.
[root@sunshijiang-localhost kvm]#确认Open vSwitch组件是否安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[root@sunshijiang-localhost kvm]# rpm -qi openvswitch
Name : openvswitch
Version : 2.12.4
Release : 4.oe2203sp2
Architecture: aarch64
Install Date: 2023年12月05日 星期二 16时46分48秒
Group : Unspecified
Size : 8335545
License : ASL 2.0 and ISC
Signature : RSA/SHA256, 2023年10月10日 星期二 11时54分48秒, Key ID 007fb747fb37bc6f
Source RPM : openvswitch-2.12.4-4.oe2203sp2.src.rpm
Build Date : 2023年10月10日 星期二 11时53分13秒
Build Host : dc-64g.compass-ci
Packager : http://openeuler.org
URL : http://www.openvswitch.org/
Summary : Production Quality, Multilayer Open Virtual Switch
Description :
Open vSwitch is a production quality, multilayer virtual switch licensed under
the open source Apache 2.0 license.
[root@sunshijiang-localhost kvm]#查看Open vSwitch服务是否启动成功
1
2
3
4
5
6
7
8
9
10[root@sunshijiang-localhost kvm]# systemctl status openvswitch
● openvswitch.service - Open vSwitch
Loaded: loaded (/usr/lib/systemd/system/openvswitch.service; disabled; vendor preset: disabled)
Active: active (exited) since Tue 2023-12-05 16:49:30 CST; 14min ago
Process: 3741 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 3741 (code=exited, status=0/SUCCESS)
12月 05 16:49:30 localhost.localdomain systemd[1]: Starting Open vSwitch...
12月 05 16:49:30 localhost.localdomain systemd[1]: Finished Open vSwitch.
[root@sunshijiang-localhost kvm]#创建Open vSwitch网桥 br0
1
2
3[root@sunshijiang-localhost kvm]# ovs-vsctl add-br br0
[root@sunshijiang-localhost kvm]#
如果想删除添加的网桥:ovs-vsctl del br br0查看创建的网桥 br0
1
2
3
4
5
6
7
8
9
10[root@sunshijiang-localhost kvm]# ovs-vsctl show
93857551-fe5d-4544-96d9-7d7d84814c9d
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "vnet0"
Interface "vnet0"
ovs_version: "2.12.4"
[root@sunshijiang-localhost kvm]#将物理网卡enp125s0f0 绑定到网桥 br0
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@sunshijiang-localhost kvm]# ovs-vsctl add-port br0 enp125s0f0
[root@sunshijiang-localhost kvm]# ovs-vsctl show
93857551-fe5d-4544-96d9-7d7d84814c9d
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "vnet0"
Interface "vnet0"
Port "enp125s0f0"
Interface "enp125s0f0"
ovs_version: "2.12.4"
[root@sunshijiang-localhost kvm]#
如果想删除绑定的网桥网卡关系:ovs-vsctl del-port br0 enp125s0f0注意:这里所有网络连接会断掉,如果你是使用Xshell连接的也会断掉。当网卡加入网桥之后,网卡就是交换机上的一个端口,交换机作为二层设备,其端口是不可能有IP地址的,所以本机的IP地址失效。所以ssh连接什么的都会失效。网桥创建成功后会默认带一个与网桥同名的port,并且这个port的类型是比较特殊的Internal。可以将原网卡IP 设置到此处。顺便可以添加一个默认路由,原默认路由失效了,会导致无法访问外网。
(4)配置网桥IP
通过上述 Linux Bridge 或 OVS 创建好网桥后,我们需要对网桥进行 IP 设置,以保证后续虚拟机和宿主机均可正常对外进行网络通信。以下提供了 2 种方式可供参考:
临时生效(重启物理机或 重启 NetworkManager 服务后IP 设置会消失)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45enp125s0f0与网桥连接后,不再需要IP地址,将其IP设置为0.0.0.0
[root@sunshijiang-localhost kvm]# ifconfig enp125s0f0 0.0.0.0
[root@sunshijiang-localhost kvm]#
为OVS网桥br0分配IP 并设置默认网关路由
[root@sunshijiang-localhost kvm]# ifconfig br0 192.168.205.114/24
[root@sunshijiang-localhost kvm]# route add default gw 192.168.205.1 br0
[root@sunshijiang-localhost kvm]#
查看 IP 配置是否生效
[root@sunshijiang-localhost kvm]# ip add
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: enp125s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet6 fe80::40eb:1165:7034:a230/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.114/24 brd 192.168.205.255 scope global dynamic br0
valid_lft 7255sec preferred_lft 7255sec
inet6 fe80::20c:29ff:fe96:c9d7/64 scope link
valid_lft forever preferred_lft forever
[root@sunshijiang-localhost kvm]#
测试一下是否可以联网
[root@sunshijiang-localhost kvm]# ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=1 ttl=52 time=7.49 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=2 ttl=52 time=9.34 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=3 ttl=52 time=11.3 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=4 ttl=52 time=12.4 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 7.486/10.123/12.395/1.873 ms
[root@sunshijiang-localhost kvm]#持久生效
OpenvSwitch 方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57新增网卡配置文件 ifcg-br0 并配置 IP 信息
[root@sunshijiang-localhost kvm]# vi /etc/sysconfig/network-scripts/ifcg-br0
TYPE=OVSBridge
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
NAME=br0
DEVICE=br0
DEVICETYPE=ovs
BOOTPROTO=static
IPADDR=192.168.205.114
NETMASK=255.255.255.0
GATEWAY=192.168.205.1
DNS1=8.8.8.8
ONBOOT=yes
[root@sunshijiang-localhost kvm]#
修改宿主机网卡配置文件 ifcg-enp125s0f0
[root@sunshijiang-localhost kvm]# vi /etc/sysconfig/network-scripts/ifcg-enp125s0f0
TYPE=OVSPort
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
UUID=9ac866af-0e42-4b95-be19-055c8d40f5e3
NAME=enp125s0f0
DEVICE=enp125s0f0
DEVICETYPE=ovs
BOOTPROTO=none
OVS_BRIDGE=br0
ONBOOT=yes
[root@sunshijiang-localhost kvm]#
重启网卡配置信息或重启机器生效配置
[root@sunshijiang-localhost kvm]# systemctl restart NetworkManager
[root@sunshijiang-localhost kvm]# reboot
验证是否配置成功
[root@sunshijiang-localhost kvm]# ovs-vsctl show
93857551-fe5d-4544-96d9-7d7d84814c9d
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "vnet0"
Interface "vnet0"
Port "enp125s0f0"
Interface "enp125s0f0"
ovs_version: "2.12.4"
[root@sunshijiang-localhost kvm]#LinuxBridge 方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45新增网卡配置文件 ifcg-br0 并配置 IP 信息
[root@sunshijiang-localhost kvm]# vi /etc/sysconfig/network-scripts/ifcg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.205.114
NETMASK=255.255.255.0
GATEWAY=192.168.205.1
DNS1=8.8.8.8
PREFIX=24
[root@sunshijiang-localhost kvm]#
修改宿主机网卡配置文件 ifcg-enp125s0f0
[root@sunshijiang-localhost kvm]# vi /etc/sysconfig/network-scripts/ifcg-enp125s0f0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
UUID=9ac866af-0e42-4b95-be19-055c8d40f5e3
NAME=enp125s0f0
DEVICE=enp125s0f0
NM_CONIROLLED=no
BOOTPROTO=none
BRIDGE=br0
ONBOOT=yes
[root@sunshijiang-localhost kvm]#
重启网卡配置信息
[root@sunshijiang-localhost kvm]# systemctl restart NetworkManager
[root@sunshijiang-localhost kvm]#
验证是否配置成功
[root@sunshijiang-localhost kvm]# brctl show
bridge name bridge id STP enabled interfaces
br1 8000.02420c2d583b no enp125s0f0
docker0 8000.0242e2295cd4 no [root@sunshijiang-localhost kvm]#
7.使用VNC连接虚拟机
(1)概述
当完成上述操作之后,我们可以通过VNC协议使用网桥 br0 的 IP 地址 + 虚拟机监听的 VNC 端口来远程登录虚拟机,从而对虚拟机进行操作系统安装和管理操作。
(2)前提条件
虚拟机所在主机的IP地址(此时该 IP 已设置在网桥 br0 上)。
1
2
3
4
5
6
7
8[root@sunshijiang-localhost kvm]# ip add | grep br0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.114/24 brd 192.168.205.255 scope global dynamic br0
valid_lft 7255sec preferred_lft 7255sec
inet6 fe80::20c:29ff:fe96:c9d7/64 scope link
valid_lft forever preferred_lft forever
[root@sunshijiang-localhost kvm]#确保客户端所在环境可正常访问网络(完成步骤 6 后确认可以正常上网)。
1
2
3
4
5
6
7
8
9
10[root@sunshijiang-localhost kvm]# ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=1 ttl=52 time=7.49 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=2 ttl=52 time=9.34 ms
61.200.7 (182.61.200.7): icmp_seq=4 ttl=52 time=12.4 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 7.486/10.123/12.395/1.873 ms
[root@sunshijiang-localhost kvm]#虚拟机的VNC侦听端口,该端口一般在客户机启动时自动分配,一般为5900 + x(x为正整数,按照虚拟机启动的顺序递增,且5900对用户不可见)。
1
<graphics type='vnc' listen='0.0.0.0' port='5094' passwd='100%Security'/> ---图形设备
如果VNC设置了密码,还需要获取虚拟机的VNC密码。
1
<graphics type='vnc' listen='0.0.0.0' port='5094' passwd='100%Security'/> ---图形设备
如果开启了防火墙,需要允许 VNC 监听端口的连接。
1
2
3[root@sunshijiang-localhost kvm]#firewall-cmd --zone=public --add-port=5904/tcp
[root@sunshijiang-localhost kvm]#firewall-cmd --reload
[root@sunshijiang-localhost kvm]#
(3)VNC连接虚拟机
打开VncViewer软件,输入主机IP和端口号。格式为“主机IP:端口号”
输入 VNC 密码,登录到虚拟机进行下一步操作系统安装
(4)系统配置
安装目的地配置
选择“安装目的地”后可以根据实际需要选择“自动”存储或“自定义”新建分区并选中要安装系统所在的磁盘,点击“完成”即可完成安装目的地的配置
用户设置
选择“Root账户”或“创建用户”后,可根据实际需要配置 Root 账户密码或新建用户
(5)虚拟机IP配置
虚拟机 的IP既可在安装过程中配置,也可安装完成后修改配置文件进行配置:
安装过程中配置
安装界面选择“网络和主机名”后,可根据实际需要配置具体的 静态IP 信息,并打开网卡开关后点击“完成”即可完成网络配置
安装完成后配置
也可以跳过安装界面的“网络和主机名”配置,等待操作系统安装完成之后进入系统内部修改网络配置文件进行 IP 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[root@openEulerVM-16 ~]# vi /etc/sysconfig/network-scripts/ifcg-enp0s5
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 修改 dhcp 为 static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s5
UUID=c96a3811-a22d-49eb-bc90-082778954ecd
DEVICE=enp0s5
ONBOOT=yes
增加如下IP信息项:
IPADDR=192.168.205.115 # 给虚拟机设置新的独立 IP
NETMASK=255.255.255.0
GATEWAY=192.168.205.1
DNS1=8.8.8.8
[root@openEulerVM-16 ~]# systemctl restart NetworkManager
[root@openEulerVM-16 ~]#
(6)ssh远程连接
综上所述,我们已完成KVM 虚拟机的搭建,并且宿主机和 KVM 虚拟机都有各自独立的 IP ,我们可以使用各自的 IP 通过 ssh 来访问和使用它们
1 | # 宿主机 IP(配置在 br0) |
8.在线修改虚拟机配置
虚拟机创建之后我们可以在线修改虚拟机的配置信息。在线修改配置以后,新的虚拟机配置文件会被持久化,并在虚拟机关闭、重新启动后生效。
修改虚拟机配置命令格式如下:virsh edit <虚拟机:对应的domain>
1 | [root@sunshijiang-localhost kvm]# virsh edit openEulerVM-16 |
9.查询虚拟机信息
(1)概述
我们在管理虚拟机的过程中经常需要知道一些虚拟机信息,libvirt提供了一套命令行工具用于查询虚拟机的相关信息。以下我来介绍一下相关命令的使用方法,便于大家获取虚拟机的各种信息。
(2)查询命令
Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟机运行状态、设备信息或者调度属性等,使用方法请参见下表。
| 查询的信息内容 | 命令行 | 说明 |
|---|---|---|
| 基本信息 | virsh dominfo |
包括虚拟机ID、UUID,虚拟机规格等信息。 |
| 当前状态 | virsh domstate |
可以使用–reason选项查询虚拟机变为当前状态的原因。 |
| 调度信息 | virsh schedinfo |
包括vCPU份额等信息。 |
| vCPU 数目 | virsh vcpucount |
查询虚拟机vCPU的个数。 |
| 虚拟块设备状态 | virsh domblkstat |
查询块设备名称可以使用virsh domblklist命令。 |
| 虚拟网卡状态 | virsh domifstat |
查询网卡名称可以使用virsh domiflist命令。 |
| I/O 线程 | virsh iothreadinfo |
查询虚拟机I/O线程及其CPU亲和性信息。 |
上述命令可根据实际需要进行具体信息的查询,本次我以查询虚拟机基本信息进行举例:
1 | [root@sunshijiang-localhost kvm]# virsh dominfo openEulerVM-16 |
10.快速创建虚拟机
当已经创建好一台 kvm 虚拟机后,如果还想继续创建虚拟机,可以参考上述流程添加虚拟机XML配置文件–> 持久化定义虚拟机–>启动虚拟机–>VNC 连接虚拟机进行操作系统安装–>IP 网络配置等完成新的虚拟机搭建过程。
但是如果你不想每次创建虚拟机都怎么复杂,可以提供你快速创建虚拟机的办法:复制已经创建好的kvm虚拟机磁盘文件做模板,基于模板使用命令创建新虚拟机
1 | [root@sunshijiang-localhost kvm]# ls |















