KVM虚拟化

发布时间 2023-10-10 09:56:46作者: 普里莫

KVM 虚拟化

环境准备

image-20230906202708021

支持虚拟化的条件

Inter 的 cpu:VMX

AMD 的 cpu:SVM

# 在cpuinfo中可以查看具体的支持虚拟化信息
[root@lb01 ~]# grep -E "svm|vmx" /proc/cpuinfo
 
# 如果没有支持可在虚拟机设置中开启虚拟化

image-20230906174206904

KVM 安装实践(简易版)

安装 kvm

# 安装管理工具
[root@lb01 ~]# yum install -y qemu-kvm libvirt
# 安装virt命令
[root@lb01 ~]# yum install -y virt-install

Kvm:linux 内核的一个模块,模块不需要安装,只需要加载

Qemu:虚拟化软件,可以虚拟不同的 cpu,支持异构(x86 架构可虚拟化出不是 x86 的架构)

Qemu-kvm:用户态管理 kvm,网卡,声卡,PCI 设备等都是 qemu 来管理的

创建虚拟磁盘

# 创建qcow2磁盘
[root@lb01 ~]# qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G
[root@lb01 ~]# qemu-img create -f qcow2 /opt/CentOS-7-x86_64.qcow2 10G
 
# 转换磁盘格式
[root@lb01 ~]# qemu-img convert -c -f raw -O qcow2 /opt/CentOS-7-x86_64.raw /opt/CentOS-7-x86_64.qcow2
 
# 创建虚拟磁盘:
-f指定格式
路径:/opt/CentOS-7-x86_64.raw 大小为10G
格式:1.raw    创建多大占用多大磁盘空间
     2.qcow2  占用磁盘大小根据使用量来决定

显示内核中 kvm 状态

[root@lb01 ~]# lsmod |grep kvm
kvm_intel             183621  0 
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

启动服务

#开机自启
[root@lb01 opt]# systemctl enable libvirtd
#启动libvirt
[root@lb01 opt]# systemctl start libvirtd

上传镜像

法一:

#下载镜像到/opt目录下
[root@lb01 opt]# wget http://mirrors.aliyun.com/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso   

法二:

# 利用CRT的SFTP上传
CRT ==> File ==> Connect SFTP Session  (英文版CRT)
CRT ==> 文件 ==> 连接到SFTP              (中文版CRT)
sftp> cd /opt
sftp> put D:/ISO/CentOS-7-x86_64-DVD-1511.iso 

法三:

#进入opt目录
[root@linux-node1 ~]# cd /opt/
#将镜像从cdrom挂载到opt下
[root@linux-node1 opt]# dd if=/dev/cdrom of=/opt/CentOS-7.1-x86_64.iso

创建虚拟机

Virt-install 重要命令介绍:

virt-install –help
-n(Name):   指定虚拟机的名称
–memory(–raw):   指定内存大小
–cpu:     指定 cpu 的核数(默认为 1)
–cdrom:    指定镜像
–disk:     指定磁盘路径(即上文创建的虚拟磁盘)
–virt-type:     指定虚拟机类型(kvm,qemu,xen)
–network:    指定网络类型

[root@lb01 opt]# virt-install \
--virt-type kvm \
--name CentOS-7-x86_64 \
--ram 1024 \
--cdrom=/opt/CentOS-7.1-x86_64.iso \
--disk path=/opt/CentOS-7-x86_64.raw \
--disk /opt/CentOS-7-x86_64.qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
 
注解:
虚拟机类型:kvm
虚拟机名字:CentOS-7-x86_64
虚拟机内存:1024M
虚拟机镜像路径:/tmp/CentOS-7-x86_64-DVD-1511.iso
虚拟机磁盘格式:raw
虚拟机磁盘格式:qcow2
虚拟机网络类型:默认
指定控制台:VNC
指定不自动试图连接到客户机控制台

使用 VNC 连接 kvm

https://www.realvnc.com/en/connect/download/viewer/

Ctrl+N
打开新连接窗口

image-20230906193757215

经过安装虚拟机的过程后需要重新开启虚拟机

image-20230906194053817

此时还不能连接外网

更改虚拟机网桥连接设置

默认情况下是 NAT,但是在生产环境,使用的更多的是桥接模式,更改虚拟机为网桥模式

网桥的基本原理就是创建一个桥接接口 br0,在屋里网卡和虚拟网络接口之间传递数据。

#添加网桥br0
[root@lb01 opt]# brctl addbr br0
#桥接br0和eth0
[root@lb01 opt]# brctl addif br0 eth0
注:此时会断网如果是远程操作服务器不在身边,建议写成脚本来执行
#删除eth0的IP
[root@lb01 opt]# ip addr del dev eth0 10.0.0.5/24
#给br0设置IP
[root@lb01 opt]# ifconfig br0 10.0.0.5/24 up
#给br0设置网关
[root@lb01 opt]# route add default gw 10.0.0.2

脚本如下(br0里的IP要和eth0一样xshell就不会段连了,和虚拟IP无关)

#!/bin/bash
brctl addbr br0
brctl addif br0 eth0
ip addr del dev eth0 10.0.0.5/24
ifconfig br0 10.0.0.5/24 up
route add default gw 10.0.0.2

修改虚拟机配置

[root@lb01 ~]# virsh edit CentOS-7-x86_64
将:
    <interface type='network'>
      <mac address='52:54:00:6f:fd:f9'/>
      <source network='default'/>
修改为:
    <interface type='bridge'>
      <mac address='52:54:00:6f:fd:f9'/>
      <source bridge='br0'/>
 
#关闭虚拟机
[root@lb01 ~]# virsh shutdown CentOS-7-x86_64
#启动虚拟机
[root@lb01 ~]# virsh start CentOS-7-x86_64

image-20230906202426803

可以连上了

image-20230906202438057

虚拟机基本操作

生成kvm虚拟机:            virt-install
 
查看再运行的虚拟机:          virsh list
 
查看kvm虚拟机配置文件:        virsh dumpxml name
 
启动kvm虚拟机:            virsh start name
 
正常关机:               virsh shutdown name
 
非正常关机:              virsh destroy name
 
删除:                 virsh undefine name (彻底删除,无法找回,除非备份xml文件)
 
根据配置文件定义虚拟机:        virsh define file-name.xml
 
挂起,终止:              virsh suspend name
 
回复挂起状态:             virsh resumed name

拓展

热添加 CPU

#虚拟机xml路径
[root@lb01 opt]# cd /etc/libvirt/qemu/
#查看虚拟机xml文件
[root@lb01 qemu]# ll
total 8
-rw------- 1 root root 4508 Sep  6 17:49 CentOS-7-x86_64.xml
drwx------ 3 root root   42 Sep  6 17:46 networks
注:修改虚拟机xml文件不直接修改上文所述文件,要在用virsh管理命令修改
#控制台内修改
[root@lb01 qemu]# virsh
virsh # edit CentOS-7-x86_64
#控制台外修改
[root@lb01 qemu]# virsh edit CentOS-7-x86_64
注:热添加的CPU数不能超过最大值
 
#编辑配置文件
[root@lb01 qemu]# virsh edit CentOS-7-x86_64
#当前为1 自动扩容 最大为4
##将这个删除
<vcpu placement='static'>1</vcpu>
##修改为这个
<vcpu placement='auto' current="1" >4</vcpu>
 
#关闭虚拟机
[root@lb01 qemu]# virsh shutdown CentOS-7-x86_64
 
#开启虚拟机
[root@lb01 qemu]# virsh start CentOS-7-x86_64
##没有热添加cpu之前先查看cpu的个数:
[root@lb01 qemu]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 154
model name      : 12th Gen Intel(R) Core(TM) i7-12700H
stepping        : 3
microcode       : 0x423
cpu MHz         : 2687.991
cache size      : 24576 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 32
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 arat umip pku ospke gfni vaes vpclmulqdq spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 5375.98
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:
 
processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 154
model name      : 12th Gen Intel(R) Core(TM) i7-12700H
stepping        : 3
microcode       : 0x423
cpu MHz         : 2687.991
cache size      : 24576 KB
physical id     : 2
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 32
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 arat umip pku ospke gfni vaes vpclmulqdq spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 5375.98
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:
 
#热添加CPU
[root@lb01 qemu]# virsh setvcpus CentOS-7-x86_64 2 --live
##添加完cpu后,查看cpu个数:
[root@lb01 qemu]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 154
model name      : 12th Gen Intel(R) Core(TM) i7-12700H
stepping        : 3
microcode       : 0x423
cpu MHz         : 2687.991
cache size      : 24576 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 32
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 arat umip pku ospke gfni vaes vpclmulqdq spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 5375.98
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:
 
processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 154
model name      : 12th Gen Intel(R) Core(TM) i7-12700H
stepping        : 3
microcode       : 0x423
cpu MHz         : 2687.991
cache size      : 24576 KB
physical id     : 2
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 32
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 arat umip pku ospke gfni vaes vpclmulqdq spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 5375.98
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:

激活 CPU (高版本的 kvm 不需要这样做,直接可以激活)

[root@lb01 qemu]# echo "1" > /sys/devices/system/cpu/cpu1/online
 
[root@lb01 qemu]# cat /sys/devices/system/cpu/cpu0/online 
1
[root@lb01 qemu]# cat /sys/devices/system/cpu/cpu1/online 
1 

第二种添加 cpu 的方法:安装时指定

[root@lb01 qemu]# virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus sockets=2,cores=4,thread=2