kvm教程

虚拟化的定义

虚拟化技术最早出现在60年代的IBM大型机系统,这些机器通过Hypervisor(又称虚拟机监控器)的程序在一台物理的服务器上可以跑多台虚拟机(VirtualMachine,VM),虚拟机共享物理机的CPU、内存、10 等硬件资源,但逻辑上虚拟机之间是相互隔离的。

常见的Hypervisor类型

类型1-裸机型: 直接运行在硬件设备上的,这种架构搭建的虚拟化环境称为裸机虚拟化环境,例如:VMware ESXl
类型I1-主机托管型: 运行在具有虚拟化功能的操作系统上的,这种架构构建的是主机虚拟化环境,例
: VMware Workstation.VirtualBox、KVM、xen等。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_2121384e9f54523bd1280ade709ccda4.png

虚拟化的类型

服务器虚拟化: 可在一台物理机上运行多个虚拟机,各虚拟机之间相互隔离互不影响,虚拟机的完整状态保存到文件中,移动和复制虚拟机就像移动和复制文件一样轻松,可将任意虚拟机调配或迁移到其他理服务器上。

容器虚技术: 典型的就是docker、Linux Container(LXC)等

网络虚拟化: 通过软件定义网络,即网络的创建不再依赖于物理设备,如公有云厂商允许用户自己创建新的网络,在kubernetes、openstack中都会使用到网络虚拟化。

虚拟化技术分类

全虚拟化: Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行,Hypervisor 实现方式一般是一个特殊定制的 Linux 系统,例如: Xen和VMWare ESXi 都属于这个类型。(适用于企业私有)**

硬件辅助虚拟化: KVM是硬件辅助的虚拟化技术,主要负责比较繁琐的CPU内存虚拟化,而Qemu则负责I/0虚拟化。(适用于公有云)

虚拟化模拟器: Qemu 模拟器在生产环境中,大多数的做法都是配合KVM来完成虚拟化工作,KVM完成复杂及要求比较高的CPU和内存的虚拟化,而Qemu完成像硬盘、鼠标、键盘等设备的虚拟化。(适用于公有云)

KVM虚拟化介绍

KVM 是Kernel-based Virtual Machine(基于内核的虚拟机)的简称,是一个开源的Linux系统内核虚拟化模块,自Linux2.6之后集成在Linux的各个主要发行版本中,KVM目前已成为学术界主流的hypervisor。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_ab78ebf3ee7974ceac39b802b6d3b861.png

虚拟机常用的管理工具

libvirt: 是调用KVM创建虚拟机的工具,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。

virsh: 是一个常用的管理KVM虚拟化的命令行工具。

virt-manager: virt-manager是一个虚拟化管理图形软件,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。(很少使用不安装)

openstack: openstack是一个开源的虚拟化集群统一管理的平台,常用于构建大规模的虚拟化环境,用于管理成千上万虚拟机的创建、启动、删除等整个生命周期

生产环境中 创建虚拟机一律使用此命令(下方两参数根据宿主机cpu mem实际合理范围更改)

  • maxmemory=2048 最大支持的内存核心数
  • maxvcpus=4 最大支持的CPU核心数
1
2
3
4
5
6
7
8
# 创建虚拟机
virt-install --virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name web04 \
--memory 1024,maxmemory=2048 \
--vcpus 1,maxvcpus=4 --disk /kvm/web04-vda.qcow2,format=qcow2,size=10 \
--cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

二. 安装kvm虚拟化管理工具(本教程环境workstdtion)

主机名称IP地址系统环境硬件环境
kvm0110.0.0.10centos7.94C8G50G

虚拟机CPU开启虚拟化功能

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_17270590f1aeca75a8028b0714cd4f21.png

开机后检测CPU是否支持嵌套虚拟化

1
2
3
[root@localhost ~]# egrep -o 'vmx|svm' /proc/cpuinfo
vmx
vmx 显示已载入的系统模块

安装KVM相关软件包

准备工作 本文执行初始化脚本本项目不执行(可选)

1
2
3
4
5
6
7
8
9
10
rm /etc/yum.repos.d
mount /dev/cdrom /mnt
vim /etc/fstab
/dev/cdrom /mnt iso9660 default 0  0
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0

libvirt: 用于创建虚拟机

virt-install:虚拟机的安装工具和克隆工具(非常重要的功能)

qemu-kvm: 管理虚拟机的磁盘

1
2
3
4
5
6
# 检测源
yum repolist
# 安装软件
yum insta1l libvirt virt-install qemu-kvm -y
# 启动服务
systemctl start libvirtd && systemctl enable libvirtd && systemctl status libvirtd

创建KVM虚拟机(选择轻量镜像方便实验上传下载)

提前将centos镜像上传到系统内用于给kvm虚拟机安装系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 提前将centos7镜像传到系统内用于给KVM虚拟机安装系统
mv CentOS-7-x86_64-Minimal-2009.iso /opt
# 创建KVM虛拟机
virt-install --virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name web01 \
--memory 1024 \
--vcpus 1 --disk /opt/web01-vda.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso \
--network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

# 参数解释:
--virt-type kvm  # 虚拟化的类型
--os-type=linux  # 系统类型
--os-variant     # rhel7系统版本
--name webO1     # 虚拟机的名字
--memory 1024    # 虚拟机的内存
--vcpus 1        # 虚拟cpu的核数
--disk /opt/web0l-vda.raw,format=raw,size=10  # 磁盘位置及名称,磁盘格式,空间大小(G)
--cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso # 系统镜像位置及名称
--network network=default     # 使用默认网络(默认NAT)
--graphics vnc,listen=0.0.0.0 # 开启VNC
--noautoconsole               # 服务器端支持console登录

翻译:安装完成后需要去控制台完成安装 电脑安装一个或者使用mobaxterm连接完成安装

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_94db20daccc7489e24ae4fbc9e524935.png

虚拟机vnc暴露端口5900

1
2
3
[root@kvm opt]# ss -ntulp
Netid State     Recv-Q Send-Q   Local Address:Port     Peer Address:Port              
tcp   LISTEN     0      1     *:5900   users:(("qemu-kvm",pid=3551,fd=19))

连接过来之后便在此安装页面

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_d271ac8899700a02171525adff77649f.png

此时按照正常安装流程即可 安装完成后点击重启此时不会重启 需要我们手动打开(通过 ss -ntulp 查看 qemo-kvm 端口 通过 vnc 连接虚拟机查看虚拟机 IP 地址)其实此时我们 可以通过宿主机 使用此虚拟机 IP:192.168.122.39 连上虚拟机 并且由于此此虚拟机网络是 NAT 模式 是可以借助宿主机去访问 外网 的。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_5387c7f9aad4ae74127c22f44a330630.png

三. kvm常用命令使用

此前创建windows类型虚拟机见链接

一. virsh常用命令概览

练习命令之前安装 yum install -y bash-*用于命令补全

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
# 查看刚通过镜像启动的虚拟机虚拟机 / 查看--os-variant支持的类型
virsh list             # 列出正在运行的虚拟机
osinfo-query os        # 查看支持的类型
# virt-install常用命令
virsh list --all       # 列出所有虚机
virsh start web01     # 启动指定虚机
virsh reboot web01     # 重启指定虚机(关闭状态无法重启)
virsh console name     # 连接虚拟机
virsh destroy name     # 拔掉电源(很少用)

virsh undefine web01   # 删除虚机文件即删除虚拟机(不会删除磁盘文件)


virsh domblklist web01             # 查看虚拟机磁盘信息
virsh dominfo   web01             # 查看虚拟机配置信息
virsh domiflist web01             # 查看虚拟网卡信息
virsh dumpxml   web01             # 以 xml格式查看虚拟机
virsh define     file-name        # 导入虚拟机
virsh edit       name             # 编辑虚拟机配置(一般是在刚定义完虚拟机之后)自带语法检测
virsh domrename old-name new-name   # 虚拟机重命名
virsh vncdisplay web01                # 查看vnc端口
virsh autostart name                 # 虚拟机随机重启
virsh autostart --disable name        # 取消虚拟机随机重启

# 图形界面:
通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚拟机,还可以直接控制虚拟机的桌面。
# 命令行:
virsh list                              # 显示本地活动虚拟机
virsh list –all                         # 显示本地所有的虚拟机(活动的+不活动的)
virsh define ubuntu.xml                 # 通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh start ubuntu                      # 启动名字为ubuntu的非活动虚拟机
virsh create ubuntu.xml                 # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend ubuntu                    # 暂停虚拟机
virsh resume ubuntu                     # 启动暂停的虚拟机
virsh shutdown web01          # 正常关闭虚拟机
virsh destroy ubuntu          # 强制拔掉电源关闭虚拟机(很少使用)

virsh domname 2                         # 显示id号为2的虚拟机名                                
virsh domid ubuntu                      # 显示虚拟机id号                              
virsh domuuid ubuntu                    # 显示虚拟机的uuid          
virsh domstate ubuntu                   # 显示虚拟机的当前状态          
virsh dumpxml ubuntu                    # 显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给# 虚拟机分配id号、uuid、vnc端口号等等)          
virsh setmem ubuntu 512000               # 给不活动虚拟机设置内存大小  
virsh setvcpus ubuntu 4                  # 给不活动虚拟机设置cpu个数          

二. 备份恢复虚拟机

备份虚拟机

1
2
3
# 导出虚拟机配置文件
virsh dumpxml web01 > web01_bak.xml
# 此时我们模拟一下恢复虚拟机先删除虚拟机

删除虚拟机(先关机再删除) 此时磁盘文件仍然是被保留的

备注:此步骤为模拟恢复虚拟机执行

1
2
3
virsh shutdown web01
virsh undefine web01
virsh list --all

恢复虚拟机(以刚才的备份文件导入虚拟机)

1
2
3
4
5
6
7
8
# 从备份文件导入虚拟机
virsh define web01_bak.xml
# 此时再看刚才的虚拟机又回来了
virsh list --all

Id   Name                           State
-----------------------------------------
-   web01                         shut off

为什么又回来了呢 因为我们使用virsh undefine 删除的是 /etc/libvirt/qemu 路径下对应的虚拟机配置文件

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_cbceb58948ef431e9a1f63b2c22da55b.png

三. 虚拟机磁盘文件迁移

备注:我们创建虚拟机时会 生成了一个raw格式的磁盘文件 web01-vda.raw

创建kvm路径,将虚拟机磁盘文件移动到该目录

1
2
# 创建kvm路径,将虚拟机磁盘文件移动到该目录
mkdir /kvm && mv /opt/web01-vda.raw /kvm && cd /kvm && ls

编辑虚拟机配置(自带语法检测)

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
# 备份虚拟机配置(编辑前先备份)
virsh dumpxml web01 > web01_bak.xml
# 编辑虚拟机配置
virsh edit web01

# 修改路径 /opt/web01-vda.raw >> /kvm/web01-vda.raw(修改前)
<devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='file' device='disk'>
    <driver name='qemu' type='raw'/>
    <source file='/opt/web01-vda.raw'/>   # 此路径
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
  </disk>
  <disk type='file' device='cdrom'>
    <driver name='qemu' type='raw'/>

# 修改后
  <devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='file' device='disk'>
    <driver name='qemu' type='raw'/>
    <source file='/kvm/web01-vda.raw'/>    # 此路径
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
  </disk>
# 此时启动虚拟机
virsh start web01

[root@kvm kvm]# virsh start web01
Domain web01 started

[root@kvm kvm]# virsh list --all
Id   Name                           State
----------------------------------------------------
5     web01                         running

四. 虚拟机重命名(只能在关机状态改名)

1
2
3
4
# 关机
virsh shutdown web01
# 改名
virsh domrename web01 centos-web01

五. 查看虚拟机 vnc 端口(虚拟机太多之后 VNC 端口就会不一样)只有启动状态才会有 VNC 端口

1
2
3
4
5
6
# 启动
virsh start web01
# 查看vnc端口
virsh vncdisplay web01
// 返回
:0

**备注:单台虚拟机时返回 其实此 **0 代表默认端口 5900 多台时便会网上增加 如两台时 显示 1 即 从 5900 往上加 15901

六. 虚拟机随机自启( 为了宿主机重启后虚拟机也会重启 )否则宿主机重启 虚拟机不会自启动

1
2
3
4
5
6
7
# 设置与宿主机一起随机自启
virsh autostart web01
# 查看那些虚拟机设置了随机自启(一个都没有设置的话此目录不会生成与虚拟机相同名字的文件)
cd /etc/libvirt/qemu/autostart && ls
web01.xml
# 取消随机自启(此时此/etc/libvirt/qemu/autostart目录对应文件已消失)
virsh autostart web01 --disable

七. 通过console登录kvm

1
2
3
4
5
# 通过console登录虚拟机控制台
virsh console web01
// 返回
Connected to domain web01
Escape character is ^]  # ctrl + ] 退出,默认无法登录

虚拟机配置允许console登录

进入 KVM 虚拟机修改内核参数允许 console 登录,先通过 VNC 查看虚拟机 IP 地址,在通过宿主机 ssh 方式登录到 KVM 内部增加该配置项: grubby-update-kernel=ALL-args=”console=ttyS0,115200n8”

1
2
3
4
5
6
# 进入kvm虚拟机
ssh -p22 root@192.168.122.39
# 修改内核参数
grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
# 重启虚拟机生效
reboot

验证 console 登录

1
2
3
4
5
6
7
8
9
10
# console 登录虚拟机
virsh console web01
// 返回
Connected to domain web01
Escape character is ^]   # 回车

CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64

localhost login:         # 此时出现登录选项

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_ee9df9423348cd4db4a62b05f970e4a5.png

四. KVM磁盘管理

kvm磁盘格式介绍

raw: 老牌格式,用一个字来说就是裸,也就是赤裸裸,指定多大空间就创建多大空间,直接占用指定大小的空间分 50G 占用 50G ,性能上来说的话还是不错的,不支持快照功能。

cow: 曾经 qemu 的写时拷贝的镜像格式(用户在修改数据时,系统会拷贝一份源文件副本到内存中让其修改,等到数据真正被修改时才分配空间)目前由于历史遗留原因不支持窗口模式。从某种意义上来说是个弃婴,还没等它成熟就死在腹中,后来被 qcow 格式所取代。 qcow: 一代的 qemu 的 cow 格式,刚刚出现的时候有比较好的特性,但其性能和 raw 格式对比还是有很大的差距,目前已经被新版本的qcow2 取代。

qcow2: 是 openstack 默认也是比较推荐的格式,文件比较小而且做快照也比较小,空间是动态增长(用多少占多少 但不会超过定义的容量),是目前比较主流的一种虚拟化镜像格式,经过一代的优化,目前 qcow2 的性能上接近 raw 裸格式的性能。

我们创建时就是使用 raw 格式创建的

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_6aadb90398f3b87f7888616461239e9d.png

查看虚拟机磁盘

1
2
3
4
5
6
7
# 查看虚拟机磁盘
virsh domblklist web01
// 返回
Target     Source
------------------------------------------------
vda         /kvm/web01-vda.raw
hda         -

查看磁盘详细信息

1
2
3
4
5
6
7
# 查看磁盘详细信息
qemu-img info /kvm/web01-vda.raw
// 返回
image: /kvm/web01-vda.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.7G

1. 创建 qcow2 格式磁盘的虚拟机

1
2
3
4
5
6
7
8
# 创建 qcow2 格式磁盘的虚拟机
virt-install --virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name web02 \
--memory 1024 \
--vcpus 1 --disk /kvm/web02-vda.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso \
--network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

查看 VNC 端口 可见端口是 5901

1
2
[root@kvm kvm]# virsh vncdisplay web02
:1

VNC 连接

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_7185c32c48a56a379db496bfe893fee4.png

2. qcow2格式磁盘虚拟机使用

查看磁盘格式

1
2
3
4
5
6
7
8
9
10
11
# 查看磁盘格式
qemu-img info web02-vda.qcow2
//返回
image: web02-vda.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.5G         # 用多少占多少
cluster_size: 65536
Format specific information:
  compat: 1.1
  lazy refcounts: true

操作

  • 开机虚拟机宿主机重启虚拟机自启动virsh autostart web01
  • 登录:ssh -p22 root@192.168.122.46
  • 虚拟机配置允许 console 登录:grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
  • 生效(virsh shutdown web02 && virsh start web02
  • 通过console登录:virsh console web02

五. kvm磁盘虚拟机快照管理

raw 磁盘格式虚拟机****不支持做快照,qcow2 支持快照,并且快照就保存在 qcow2 的磁盘文件中。

1.创建快照

格式: virsh snapshot-create-as –name 快照名称 虚拟机名称

解释:

virsh snapshot-create-as 创建快照 –name 快照名称 web02 虚拟机名称

web02 虚拟机创建快照(开关机都可以做快照)

1
2
3
4
5
6
7
8
9
10
# 为 web02 虚拟机创建快照
virsh snapshot-create-as --name kuaizhao_web2_env_ok web2
//返回
Domain snapshot kuaizhao_web2_env_ok created
# 创建成功后查看快照
virsh snapshot-list web02
//返回
Name                 Creation Time             State
------------------------------------------------------------
kuaizhao_web2_env_ok 2024-04-21 16:30:45 +0800 running

验证快照

1
2
3
4
# 登录虚拟机
virsh console web02
# 创建快照测试文件
touch kuaizhao-test.txt

2. 还原快照

格式: virsh snapshot-revert 虚拟机名称 –snapshotname 快照名称

1
2
# 执行恢复快照
virsh snapshot-revert web02 --snapshotname kuaizhao_web2_env_ok

备注:查看创建的文件还存在不 (不存在 此时验证成功)

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_d7d30c0888f72a011b3c3eafe594c960.png

提示:别删除虚拟机,删除虚拟机后没有虚拟机配置文件无法还原

3. 删除快照

格式: virsh snapshot-delete 虚拟机名称 –snapshotname 快照名称

1
2
3
4
5
6
7
# 删除快照
virsh snapshot-delete web02 --snapshotname kuaizhao_web2_env_ok
# 查看是否删除成功
virsh snapshot-list web02
//返回
Name                 Creation Time             State
------------------------------------------------------------

六. kvm虚拟机克隆

虚拟机的克隆方式分为完整克隆与链接克隆,下图是VMware虚拟机对完整克隆与链接克隆的解释

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_197336118a437919c95a1c428c7843e3.png

1. KVM完整克隆(虚拟机必须为关闭状态)

格式: virt-clone –auto-c1one -o 虚拟机名称 -n 克隆名称

1
2
virt-clone --auto-clone -o  web01 -n  web01-clone
virsh list --all

virt-clone 这个命令是基于全克隆的,也就是拷贝虚拟磁盘文件和虚拟配置文件来实现的完整克隆,速度慢,占用空间多,克隆后磁盘文件位于虚拟机磁盘文件存放处 克隆后虚拟机配置文件位于 /etc/libvirt/qemu 。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_fba87f13fbf52ded0499e19cf7ba2d85.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_ff39c0b60324fd6b2061dee1d709a4fc.png

验证克隆后的虚拟机 (成功)

1
2
3
4
# 启动克隆后的虚拟机 
virsh start web01-clone
# 克隆后的虚拟机和虚拟机是一样的所以可以通过console登录
virsh console web01-clone

此时可以看到IP地址是不一样的 克隆以后我们不需要去手动更改别的例如IP等配置

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_d5eebd88967b1ae72a00a4a5dc1dbf82.png

1. KVM链接克隆(虚拟机必须为关闭状态)

kvm并没有提供链接克隆的命令或工具,只能手动实现,实现方式是通过创建一个磁盘链接文件来实现的链接克隆。格式: qemu-img create -f qcow2 -b 源磁盘文件 链接磁盘文件 (磁盘格式需要保持一致)

  • -f 指定磁盘文件格式
  • -b 指定基于源磁盘文件创建一个链接磁盘文件
1
2
3
4
# 创建链接克隆(此时光有磁盘文件我们无法基于这个磁盘文件去创建虚拟机 还得修改磁盘文件配置)
qemu-img create -f qcow2 -b /kvm/web02-vda.qcow2 /kvm/web02-1ink-clone-1.qcow2
# 查看链接磁盘文件信息
qemu-img info /kvm/web02-1ink-clone-1.qcow2

backing file: /kvm/web02-vda.qcow2 (源磁盘文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 导出原始机的配置文件,并修改磁盘文件路径
virsh dumpxml web02 > web02-link-clone-1.xml
# 需要修改的内容如下
vim web02-link-clone-1.xml
...
# 修改虚拟机名称(修改为克隆后的机器的名称)
由 <name>web02</name> 改 <name>web02-link-clone</name>
# 删除uuid(删掉以后启动是会自动生成的)
<uuid>0fb934c1-5232-410f-b290-97604f22307e</uuid>
# 修改磁盘文件路径及名称
由 <source file='/kvm/web02-vda.qcow2'/> 改 <source file='/kvm/web02-1ink-clone-1.qcow2'/>
# 删除mac地址(删掉以后启动是会自动生成的)
<mac address='52:54:00:fb:cb:a4'/>
...
保存!
# 导入虚拟机
virsh define web02-link-clone-1.xml
virsh list
# 开启虚拟机
virsh start web02-link-clone

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_523d5dd801e9c7ce92e49bc0d6fb1264.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_906abec6cee86807f80f23a43c6ad276.png

七. KVM虚拟机网络配置

kvm虚拟机网络介绍

libvirt 服务安装后,默认会安装一块 virbr0 的虚拟网卡,libvirt 在创建 KVM 虚拟机后,默认使用了一个名为default的nat网络,地址段为 192.168.122.0/24,这个网络默认使用virbr0(虚拟交换机)作为桥接接口,为虚拟机提供网络转发服务,默认网段 192.168.122.0/24,使用dnsmasq 来为使用 nat 网络的虚拟机提供 dns 及 dhcp 服务。

virbr0网卡 默认占用.1这个地址虚拟机地址从 .2 开始配置

1
2
3
4
virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  link/ether 52:54:00:28:9c:13 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

dhcp分配到虚拟机的ip列表在以下文件查看: /var/lib/libvirt/dnsmasq/default.conf (IP地址段可以使用,默认的也可以自行修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# dhcp分配到虚拟机的ip列表
cat /var/lib/libvirt/dnsmasq/default.conf
...
##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
##   virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
pid-file=/var/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0                          # kvm虚拟机使用的网卡
dhcp-range=192.168.122.2,192.168.122.254  # dhcp分配的地址段
dhcp-no-override
dhcp-authoritative
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
...

1.kvm虚拟机nat网络配置

修改virbr0地址段

可以修改网段,也可以用默认网段,如需修改通过如下方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 修改地址段 (mac地址不更改 修改如下两段即可)
virsh net-edit default

...
<ip address='192.168.122.1' netmask='255.255.255.0'>
  <dhcp>
    <range start='192.168.122.2' end='192.168.122.254'/>
...
修改为10地址段
...
<ip address='192.168.10.1' netmask='255.255.255.0'>
  <dhcp>
    <range start='192.168.10.2' end='192.168.10.254'/>
...
# 保存

重新定义网络,default网络的配置文件: /etc/libvirt/qemu/networks/default.xml

1
2
3
4
5
6
7
8
9
10
11
# 使用此命令重新定义配置文件 (刷新)
virsh net-define /etc/libvirt/qemu/networks/default.xml
//返回
Network default defined from /etc/libvirt/qemu/networks/default.xml
# 查看是否生效
cat /etc/libvirt/qemu/networks/default.xml
...
<ip address='192.168.10.1' netmask='255.255.255.0'>
  <dhcp>
    <range start='192.168.10.2' end='192.168.10.254'/>
...

删除网络(关闭运行的虚拟机)

1
2
3
4
# 停止网卡(关闭运行的虚拟机)
virsh net-destroy default
# 关闭正在运行的虚拟机(可不关)
virsh shutdown web02

启动网卡

1
2
# 启动网卡
virsh net-start default

重启libvirtd

1
2
# 重启libvirtd
systemctl restart libvirtd

验证

1
2
3
4
5
6
7
8
9
10
11
# 宿主机执行
ip a s
# 验证虚拟机网络 此时虚拟机网络已变成了10段
virsh console web01
# 获取IP
dhclient
// 返回
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  link/ether 52:54:00:00:75:bf brd ff:ff:ff:ff:ff:ff
  inet 192.168.10.39/24 brd 192.168.10.255 scope global dynamic eth0
      valid_lft 3599sec preferred_lft 3599sec

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_257b8884805c43a286817995dfdf648e.png

从现在开始使用的 default 网络就是 10 段了

2.kvm 虚拟机配置固定 IP

启动一个KVM并登录并配置固定IP地址

1
2
3
virsh start web02
virsh console web02
ip a s

kvm 配置固定 IP 地址(与传统物理机一样修改网卡配置文件就可以了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none    # 将默认的dhcp修改为none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=0d71e612-7fca-4663-914e-9c9f356d0d82
DEVICE=eth0
ONBOOT=yes       # 修改为yes
# 新增
IPADDR="192.168.10.10"                                              
GATEWAY="192.168.10.1"                                        
NETMASK="255.255.255.0"                                  
DNS1="223.5.5.5"

修改后重启网卡生效:systemctl restart network

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_8ff6fe32b5abd9443531f7335d7b120f.png

**提示: **KVM 虚拟机访问外部网络记住 iptables SNAT 模式进行了源地址转换,如果外部网络需要访问到 KVM 虚拟机中,需要在宿主机通过 iptables 添加端口映射来实现,如果不希望通过端口映射来实现,可以使用 KVM的桥接网络 更加方便。

九. kvm 创建桥接网络

在KVM虚拟机中,Bridge(桥接)模式可以让 KVM 虚拟机和宿主机共享一个物理网络设备来连接网络,这样 KVM 虚拟机可以访问外部网络,而外部网络也可以直接访问 KVM 虚拟机,Bridge桥接模式使用非常方便,应用也非常广泛。

创建桥接网卡(执行创建后需要重启系统才能看到) 将宿主机工作的网卡绑定到 br0 桥接网卡上 (br0现在不存在)

  • 格式: virsh iface-bridge ens32 br0
  • ens33 为宿主机网卡
  • br0 为桥接网卡

1.创建桥接网卡

实现形式其实在博主另一篇文章中已有提及 | > 链接

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
# 将宿主机工作的网卡绑定到 br0 桥接网卡
virsh iface-bridge ens33 br0
//返回
使用附加设备 br0 生成桥接 ens32 失败
# 重启系统后登录查看网卡
ip a s
...
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
  link/ether 00:0c:29:23:67:1e brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  link/ether 00:0c:29:23:67:1e brd ff:ff:ff:ff:ff:ff
  inet 10.0.0.10/8 brd 10.255.255.255 scope global br0
...
# 此时ping不通百度
ping www.baidu.com
# 解决网卡添加DNS即可
vim /etc/sysconfig/network-scripts/ifcfg-br0
...
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="10.0.0.10"
GATEWAY="10.0.0.220"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
DNS1="223.5.5.5"  # 添加此
....
# 生效
systemctl restart network

备注:此时宿主机 ens33 网卡没有自己的 IP 地址,网卡寄生在它身上,网桥与物理网口 MAC 地址相同

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_9376b88c60933a7b09a87ec71a768aff.png

十. 创建 kvm 虚拟机使用桥接网络

创建 kvm 虚拟机使用桥接网卡(安装完成系统)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建 kvm 虚拟机使用桥接网卡
virt-install --virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name web03 \
--memory 1024 \
--vcpus 1 --disk /kvm/web03-vda.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso \
--network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
# 查看列表
virsh list
# 查看vnc端口(5902)
virsh vncdisplay web03
:2

配置静态地址 地址为与宿主机同一个网段 且没有被占用的网段

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_288e666dc41e472b5b532cc4fd38d635.png

验证

1
2
3
4
5
6
# 等待相当一段时间
virsh start web03
# 查看状态
virsh list
# 远程连接测试(可连通外网正常ping通百度)
ssh -p22 root@10.0.0.185

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_ccce45df3c03202f8b55bc31adb1b817.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_52de4dfd8d24e6c18177342d745e60f6.png

十一. 修改kvm虚拟机使用桥接模式

1
2
# 查看状态
virsh list

查看虚拟机网卡信息 格式: virsh domiflist 虚拟机名称

1
2
3
4
5
6
# 查看虚拟机web03网卡
virsh domiflist web03
//返回
Interface Type       Source     Model       MAC
-------------------------------------------------------
vnet0     bridge     br0       virtio      52:54:00:68:3e:8d

关机状态下 修改网络模式为 bridge

1
2
3
4
5
6
7
8
9
10
# 修改虚拟机配置
virsh edit web02

原 <interface type='network'> 改 <interface type='bridge'>  # 修改类型
原 <source network='default'/> 改 <source bridge='br0'/>     # 网卡名称

# 启动虚拟机验证
virsh start web02
# 通过vnc/console登录配置静态IP
virsh vncdisplay web02 或 virsh console web02

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_4f21ccb77b8d5dd6719b7488e808320c.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_0e88cdc4e62769bb5458975545f4269e.png

配置完成后 ssh 远程连接测试 >> 成功。

十二. kvm网络原理

每台 KVM 启动后,都会在 宿主机 创建一个以 vnet 开头的网卡(从 vnet0 开始),用于打通 虚拟机宿主机 之间的网络。

0.网络模式拖布图

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_502c79bc51c37605ad93625e7c73b987.png

1.宿主机网卡配置

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_7e62f395165b9a771a1f429a170a2cc0.png

通过 brctl show 可以看到 vnet 网卡使用的宿主机网卡

1
2
3
4
5
[root@kvm ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c2923671e       yes             ens33
                                                      vnet0
virbr0          8000.525400289c13       yes             virbr0-nic

十三. kvm虚拟机硬件热添加技术

1.热添加磁盘

案例: 为 web03 虚拟机添加一块新 qcow2 硬盘,并对硬盘空间进行扩容 (KVM虚拟机默认磁盘名称: vda、vdb、vdc依次类推,可进入KVM内部查看)

添加之前 (只有一块10G的硬盘)

1
2
3
4
5
6
7
8
[root@web03 ~]# lsblk
NAME                 MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0                    11:0    1 1024M  0 rom  
vda                   252:0    0   10G  0 disk
├─vda1                252:1    0   1G  0 part /boot
└─vda2                252:2    0   9G  0 part
├─centos_web03-root 253:0    0   8G  0 lvm /
└─centos_web03-swap 253:1    0   1G  0 lvm [SWAP]

在 kvm 目录创建一块 qcow2 格式的虚拟硬盘,容量为 10G

1
2
3
4
5
6
7
8
9
# 创建一块qcow2格式的虚拟硬盘,容量为10G
cd /kvm
qemu-img create -f qcow2 /kvm/web03-vdb.qcow2 10G
# 查看磁盘详情
qemu-img info /kvm/web03-vdb.qcow2
//返回
image: /kvm/web03-vdb.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)

永久添加磁盘

  • –live 在线添加
  • –config 永久保存配置 (不加临时生效 虚拟机一重启就没了)
1
2
3
4
# 永久添加磁盘(给web03 添加10G磁盘 指定添加后虚拟机磁盘名称为 vdb 格式为 qcow2 格式)
virsh attach-disk web03 /kvm/web03-vdb.qcow2 vdb --subdriver qcow2 --live --config
//返回
Disk attached successfully

web03虚拟机验证(成功添加一块10G vdb磁盘)

1
2
3
4
5
6
# 登录虚拟机
virsh console web03
# 查看磁盘详情
lsblk
# 格式化挂载验证使用(正常使用)
mkfs.xfs /dev/vdb /mnt

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_df1d528276047646321dc497bb964d7c.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_98ea2a719d22c44088b0687abc0ff47e.png

永久剥离 (需要提前卸载)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 虚拟机先卸载磁盘
umonut /dev/vdb
# 宿主机执行操作 永久剥离虚拟机磁盘
virsh detach-disk web03 vdb --live --config
# 虚拟机查看(成功)
lsblk
//返回
NAME                 MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0                    11:0    1 1024M  0 rom  
vda                   252:0    0   10G  0 disk
├─vda1                252:1    0   1G  0 part /boot
└─vda2                252:2    0   9G  0 part
├─centos_web03-root 253:0    0   8G  0 lvm /
└─centos_web03-swap 253:1    0   1G  0 lvm [SWAP]

2. 对刚才剥离的qcow2磁盘空间扩容 (无法在线扩容,必须先剥离)

1
2
3
4
5
6
7
8
# 给创建的磁盘扩容5G
qemu-img resize /kvm/web03-vdb.qcow2 +5G
# 查看扩容详情
qemu-img info /kvm/web03-vdb.qcow2
//返回
image: /kvm/web03-vdb.qcow2
file format: qcow2
virtual size: 15G (16106127360 bytes)

添加磁盘到虚拟机(宿主机执行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 永久添加磁盘(给web03 添加10G磁盘 指定添加后虚拟机磁盘名称为 vdb 格式为 qcow2 格式)
virsh attach-disk web03 /kvm/web03-vdb.qcow2 vdb --subdriver qcow2 --live --config
//返回
Disk attached successfully
# 挂载验证(先前已经格式化过磁盘 此时切记不能再格式化 否则会导致数据丢失)
[root@web03 ~]# mount /dev/vdb /mnt
[root@web03 ~]# cd /mnt
[root@web03 mnt]# ls
1.ttx
[root@web03 mnt]#
# 刷新到df -Th
xfs_growfs /mnt
//返回
meta-data=/dev/vdb               isize=512    agcount=4, agsize=655360 blks
        =                       sectsz=512   attr=2, projid32bit=1
        =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
        =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

先前已经格式化过磁盘 此时切记不能再格式化 否则会导致数据丢失。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_05199bb86394af821c0bc709165683a0.png

十四. 热添加网卡

1.热添加网卡

案例: 为KVM虚拟机 web03 添加一块网卡

格式: virsh attach-interface 虚拟机名称 –type bridge–source 网桥名 –model virtio

  • –type 用于指定网卡类型
  • –source 宿主机网桥名
  • –model virtio 驱动模式(用于指定网卡类型以eth开头)
  • –live 在线添加
  • –config 永久保存配置(不加临时生效)
1
2
3
4
# 给 web03 热添加一块bridge类型网卡
virsh attach-interface web03 --type bridge  --source br0 --model virtio --live --config
# 给 web03 热添加一块nat类型网卡 (只有一块网卡模式时 --source需要是ens33)
virsh attach-interface web03 --type default --source br0 --model virtio --live --config

虚拟机验证: ip a s 成功添加了一块 eth1 网卡 并且网卡自动获取为10.0.0.186

若要 配置成固定地址时需要新建一个网卡配置文件 配置 IP 或者使用 nmtui 设置网卡

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_d11dedc5313b8c669b47717ebb3752a8.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_bb39dccafdd291a95d611dfe61554255.png

网卡不想要了怎么办呢 热删除即可。

2.热删除虚拟机网卡(宿主机执行)

  • –mac +通过mac地址删除 (指定网卡mac地址删除)
  • 虚拟机使用 ip a / ifconfig 查看,mac地址
1
2
# 热删除虚拟机 web03 网卡 (成功剥离)
virsh detach-interface web03 --type bridge --mac 52:54:00:c8:3e:2a --live --config

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_1e84857802829a410b17411183904d57.png

十五. 热添加内存

1.创建时指定cpu 内存最大数量

热添加内存与CPU 前提是创建KVM虚拟机时设置maxmemory与maxvcpus参数 也可创建完成后通过命令定义

  • maxmemory 定义虚机最大可以分配内存的大小
  • maxvcpus 定义虚拟机最大可以使用的CPU核数

创建KVM虚拟机,并设置maxmemory与maxvcpus的值

1
2
3
4
5
6
7
8
# 创建虚拟机
virt-install --virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name web04 \
--memory 1024,maxmemory=2048 \
--vcpus 1,maxvcpus=4 --disk /kvm/web04-vda.qcow2,format=qcow2,size=10 \
--cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

2.创建后通过命令指定 cpu 内存最大数量

命令创建时没有指定最大内存 则需要先设置一下最大内存 否则无法添加

1
2
3
4
5
6
7
8
# 设置最大内存,需要关机
virsh shutdown web03
virsh setmaxmem web03 6144M --config  
// 默认无回显
# 临时添加内存,缩减内存同样,需要注意的是不要缩减内存 会导致机器出现问题
virsh setmem web03 4096M
# 永久添加内存
virsh setmem web03 4096M --config  

验证(添加成功)

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_e5eb9315664b827df6013961c3b6b4d2.png

十六. 热添加cpu

1. 创建虚拟机时指定 CPU 最大数时 热添加CPU

1
2
3
4
# 临时热添加cpu核数
virsh setvcpus web03 4 --live
# 永久添加cpu核数
virsh setvcpus web03 4 --config

2. 创建完成后热添加虚拟机CPU(需要关机 且设置的 CPU 最大数不能超过宿主机 CPU 数)

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
# 查看虚拟机当前最大支持的核心数
virsh edit web03
...
//返回
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>1</vcpu>   # 1cpu
...
# 调整虚拟机支持CPU的最大值
virsh setvcpus web03 --maximum 6 --config
...
否则会报错
virsh setvcpus web03  4 --config
error: invalid argument: requested vcpus is greater than max allowable vcpus for the persistent domain: 4 > 1
...
# 使用命令调整后 查看文件是否改变 (文件成功改变)
virsh edit web03
...
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static' current='1'>6</vcpu>  # 6cpu
...
# 启动虚拟机查看配置
virsh start web03
# 临时热添加CPU核心数量
virsh setvcpus web03 4
# 永久添加CPU核心数量
virsh setvcpus web03 4 --config

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_229143f829ebe75863789362572c1acf.png

本文热添加内存及cpu部分参考如下链接

https://www.cnblogs.com/yinzhengjie/p/18127842 https://blog.csdn.net/m0_46180357/article/details/108935979