KVM虚拟化技术

发布时间 2023-05-31 07:46:11作者: 风潇潇2019

KVM虚拟化技术

虚拟化介绍

虚拟化:在一台计算机上虚拟出多个逻辑的计算机,而且每个逻辑计算机
它可以是不同操作系统

虚拟化技术:可以扩大硬件容量,单个cpu模拟出多个cpu并行,
允许一个平台上同时运行多个操作系统,应用程序都可以在相互独立
的空间内运行,而且互不影响。

虚拟化技术的优点

1、节约成本
2、提高效率,物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

主要是通过一个 Hypervisor 的程序实现的。

Hypervisor:一种运行在物理服务器硬件与操作系统之间的中间软件层,可允许多个操作系统和应用来共享硬件资源

完全虚拟化:直接在物理机上部署虚拟化,且不需要修改操作系统内核
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型

半虚拟化:需要修改操作系统内核,使其支持虚拟化驱动来实现虚拟化技术
半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
完全虚拟化:

在这里插入图片描述

半虚拟化:

在这里插入图片描述

kvm介绍

kVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。
那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。
Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。
正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰.

作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

Libvirt 就是 KVM 的管理工具。管理虚拟机和虚拟化功能的软件
其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
1、libvirtd是服务程序,接收和处理 API 请求;
2、API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
3、virsh 是我们经常要用的 KVM 命令行工具


kvm功能列表:
1)支持 CPU 和 memory 超分(Overcommit)
2)支持半虚拟化 I/O (virtio)
3)支持热插拔 (cpu,块设备、网络设备等)
4)支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
5)支持实时迁移(Live Migration)
6)支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
7)支持 内核同页合并 (KSM )
8)支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

virsh命令

virsh --help                                     #查看命令帮忙

virsh list                                       #显示正在运行的虚拟机

virsh list --all                                 #显示所有的虚拟机

virsh start vm-node1                             #启动vm-node1虚拟机

virsh shutdown vm-node1                          #关闭vm-node1虚拟机

virsh destroy vm-node1                           #虚拟机vm-node1强制断电

virsh suspend vm-node1                           #挂起vm-node1虚拟机

virsh resume vm-node1                            #恢复挂起的虚拟机

virsh undefine vm-node1                          #删除虚拟机

virsh dominfo vm-node1                           #查看虚拟机的配置信息

virsh domiflist                                  #查看网卡配置信息

virsh domblklist vm-node1                        #查看该虚拟机的磁盘位置

virsh edit vm-node1                              #修改vm-node1的xml配置文件

virsh dumpxml vm-node1                           #查看KVM虚拟机当前配置

virsh dumpxml vm-node1 > vm-node1.bak.xml        #备份vm-node1虚拟机的xml文件,原文件默认路径/etc/libvirt/qemu/vm-node1.xml

virsh autostart vm-node1                         #KVM物理机开机自启动虚拟机,配置后会在此目录生成配置文件/etc/libvirt/qemu/autostart/vm-node1.xml

virsh autostart --disable vm-node1               #取消开机自启动

 

创建KVM虚拟机的步骤

1.创建一台虚拟机

image-20230529174455703

2.关闭防火墙和selinux
systemctl disable --now firewalld 
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
3.磁盘分区
[root@kvm ~]# lsblk 
NAME           MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda               8:0    0   50G  0 disk
├─sda1            8:1    0   1G  0 part /boot
└─sda2            8:2    0   49G  0 part
├─centos-root 253:0    0   44G  0 lvm /
└─centos-swap 253:1    0   5G  0 lvm [SWAP]
sdb               8:16   0 100G  0 disk
sr0              11:0    1 1024M  0 rom  
[root@kvm ~]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel
新的磁盘标签类型? msdos                                                  
(parted) unit                                                            
Unit? [compact]? MiB                                                    
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system 标志

(parted) mkpart                                                          
分区类型? primary/主分区/extended/扩展分区? primary                    
文件系统类型? [ext2]? xfs                                              
起始点? 10MiB                                                            
结束点? 102390MiB                                                        
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start   End       Size       Type     File system 标志
1      10.0MiB 102390MiB 102380MiB primary

(parted) q                                                                
信息: You may need to update /etc/fstab.
4.格式化
udevadm settle
mkfs.xfs /dev/sdb1
blkid /dev/sdb1  # 执行此命令会生成uuid,下面会用到
5.挂载
mkdir /kvmdata
# 将之前生成的uuid替换进去
echo UUID="9b323515-3c68-448c-8f40-4447a2227566" /kvmdata xfs defaults 0 0 >> /etc/fstab
mount -a
df -Th

image-20230529184824592

6.安装软件包
yum -y install  epel-release
yum -y install  vim  wget  net-tools  unzip  zip  gcc  gcc-c++
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/qemu-kvm-tools-1.5.3-175.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libvirt-python-4.5.0-1.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/bridge-utils-1.5-9.el7.x86_64.rpm
rpm -ivh --nodeps libvirt-python-4.5.0-1.el7.x86_64.rpm
rpm -ivh --nodeps qemu-kvm-tools-1.5.3-175.el7.x86_64.rpm
rpm -ivh --nodeps bridge-utils-1.5-9.el7.x86_64.rpm

image-20230529185031208

7.验证cpu是否支持kvm
egrep -o 'vmx|svm' /proc/cpuinfo
# vmx是intel的  svm是AMD的

image-20230529210802652

8.安装kvm
yum -y install qemu-kvm \
 qemu-kvm-tools \
 qemu-img \
 virt-manager \
 libvirt \
 libvirt-python \
 libvirt-client \
 virt-install \
 virt-viewer \
 bridge-utils \
 libguestfs-tools
9.配置网络
  1. 因为虚拟机中的网络,我们一般是都和公司服务器处在同一网段的,所以我们需要把kvm的网卡配置成桥接模式

  2. 真实的网卡只有ens33,我们把ens33指向桥接br0,然后再写一个br0的配置文件配置好IP就行

cd /etc/sysconfig/network-scripts/

cat >ifcfg-br0<<'EoF' 
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.131
PREFIX=24
GATEWAY=10.0.0.2
DNS1=8.8.8.8
EOF

cat >ifcfg-ens33<<'EOF' 
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
EOF

image-20230529215430598

10.重启网卡服务
systemctl restart network
systemctl restart NetworkManager
ifdown ens33
ifup ens33
11.重启libvirtd服务
systemctl restart libvirtd
systemctl enable libvirtd
12.查看kvm模块是否加载
lsmod | grep kvm

image-20230529215933631

13.验证安装结果
virsh -c qemu:///system list
virsh --version
virt-install --version

image-20230529220147418

14.软链接
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
ll /usr/bin/qemu-kvm

image-20230529220232409

15.查看网桥信息
brctl show

image-20230530074742384

16.KVM管理界面安装
Kvm的web界面是由webvirtmgr程序提供的
1. 安装依赖包
yum -y install git python2-pip supervisor nginx python2-devel
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm
 
2. 下载webvirtmgr
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python-websockify-0.6.0-5.el7.noarch.rpm
rpm -ivh --nodeps libxml2-python-2.9.1-6.el7.5.x86_64.rpm
rpm -ivh --nodeps python-websockify-0.6.0-5.el7.noarch.rpm
 
3. 升级pip
pip2 install --upgrade pip
pip -V
 
4. 从github上下载webvirtmgr代码
cd /usr/local/src/
git clone http://github.com/retspen/webvirtmgr.git

[root@kvm src]# ls
webvirtmgr

 
5. 安装webvirtmgr
cd webvirtmgr
pip install -r requirements.txt
 
6. 检查sqlite3是否安装
[root@kvm webvirtmgr]# python
Python 2.7.5 (default, Jun 28 2022, 15:30:04) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> exit()
 
7. 初始化账号信息
cd /usr/local/src/webvirtmgr/
python2 manage.py syncdb
WARNING:root:No local_settings file found.
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table servers_compute
Creating table instance_instance
Creating table create_flavor
 
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes   # 是否创建超级管理员账号
Username (leave blank to use 'root'):             # 指定超级管理员账号用户名,默认留空
Email address: 2279236475@qq.com                  # 设置超级管理员邮箱
Password:                                         # 设置超级管理员密码
Password (again):                                 # 再次输入确认超级管理员密码
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)
 
8. 拷贝web网页到指定目录
mkdir /var/www
cp -r /usr/local/src/webvirtmgr/ /var/www/
chown -R nginx.nginx /var/www/webvirtmgr/
 
9. 生成一对公钥与私钥,由于这里webvirtmgr和kvm服务部署在同一台主机中,所以这里本地信任。如果kvm部署在其他机器上的时候,那么就需要把公钥发送到kvm主机中
[root@kvm webvirtmgr]# ssh-keygen
[root@kvm webvirtmgr]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.131

10. 配置端口转发
[root@kvm webvirtmgr]# ssh 10.0.0.131 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60

11. 配置nginx
[root@kvm ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
[root@kvm ~]# vim /etc/nginx/nginx.conf
12. 在server参数中进行修改
删除listen       [::]:80;行
参数server_name行改成server_name  localhost;
删除root         /usr/share/nginx/html;行
在include /etc/nginx/default.d/*.conf;行下添加
location / {
       root    html;
       index   index.html index.htm;
      }

13. 配置nginx虚拟主机
cat >/etc/nginx/conf.d/webvirtmgr.conf<<'EOF'
server {
    listen 80 default_server;
    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log;
    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr;
        expires max;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $remote_addr;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M;
    }
}
EOF

14. 确保bind绑定本机的8000端口
[root@kvm ~]# egrep '^bind|^backlog'  /var/www/webvirtmgr/conf/gunicorn.conf.py
bind = '127.0.0.1:8000'  //确保此处绑定的是本机的8000端口,这个在nginx配置中定义了,被代理的端口
backlog = 2048

15. 重启nginx服务,查看80端口是否开启
[root@kvm ~]# systemctl restart nginx.service 
[root@kvm ~]# ss -lntul

16 .设置supervisor
# 在文件最后添加如下信息
cat >>/etc/supervisord.conf<<'EOF'
[program:webvirtmgr]
command=/usr/bin/python2 /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx
 
[program:webvirtmgr-console]
command=/usr/bin/python2 /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx
EOF

systemctl restart supervisord.service
systemctl enable supervisord.service

17. 配置nginx用户
[root@kvm ~]# su - nginx -s /bin/bash
# 切换用户后操作
[nginx@kvm ~]$ ssh-keygen
[nginx@kvm ~]$ touch ~/.ssh/config
[nginx@kvm ~]$ echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
[nginx@kvm ~]$ chmod 0600 ~/.ssh/config
[nginx@kvm ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.131

18. 验证基于密钥认证是否成功
[nginx@kvm ~]$ ssh root@10.0.0.131

[root@kvm ~]# cat >/etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla<<'EOF'
[Remote libvirt SSH access]
Identity=unix-user:root
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF
[root@kvm ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla 
[root@kvm ~]# systemctl restart nginx.service 
[root@kvm ~]# systemctl restart libvirtd
[root@kvm ~]# ss -anlt
17.访问网站

image-20230529224802305

image-20230529224848143

image-20230529224933809

image-20230529225003837

18.新建存储

image-20230529225114676

image-20230530070837257

image-20230530070908289

19.上传镜像
使用xftp或者xshell,再或者其他工具,将镜像文件上传到服务器的/kvmdata目录下存放,上传完成刷新一下,就可以看到镜像 

image-20230530071144894

image-20230530071218724

20.添加镜像

image-20230530071401355

21.添加网络

image-20230530071522641

image-20230530071716941

22.实例管理

image-20230530071822400

image-20230530071855141image-20230530072108490

image-20230530072228334

image-20230530072323186

image-20230530072511020

image-20230530072532495

image-20230530072813086

image-20230530074133798

到现在为止,虚拟机已经创建出来了。

虚拟机的使用

一、克隆虚拟机

1.将正在运行的虚拟机关机
virsh shutdown dr

2.克隆指定虚拟机并指定名字和文件位置
virt-clone --original dr --name dr01 --file /kvmdata/dr01.img 

3.启动新创建的虚拟机dr01
virsh start dr01

4.进入指定的虚拟机
virsh console dr01

image-20230530080057904

二、快照管理

1.创建快照
virsh snapshot-create dr

2.查看文件快照信息
qemu-img info /kvmdata/Centos7_1.img 

3.查看所有快照
virsh snapshot-list test

4.快照目录
ll /var/lib/libvirt/qemu/snapshot/dr/

5.恢复快照
virsh snapshot-revert dr 1685408829

6.删除快照
virsh snapshot-delete dr 1685408829

image-20230530090820373

image-20230530091021147

image-20230530090922223

image-20230530091214818

三、磁盘管理

0.磁盘格式
raw:裸格式,占用空间比较大,不适合远程传输,不支持快照功能,性能较好
qcow2:cow(copy on write)占用空间小,适合传输,支持快照,性能比raw差一点
1.创建磁盘
qemu-img create -f raw /kvmdata/dr_1.img 2G
# -f参数指定磁盘类型,默认是raw
2.查看磁盘信息
qemu-img info /kvm_data/dr_1.img

image-20230530091837670

3.转换磁盘格式
qemu-img convert -O qcow2 /kvmdata/dr_1.img /kvmdata/dr_1.qcow2

raw 指定多少空间占用多少
qcow2 用多少占多少空间,占用空间小

image-20230530092327131

4.扩容磁盘
qemu-img resize /kvmdata/dr_1.img +2G 

image-20230530092620641

四、CPU、内存、网卡

1.调整cpu
查看配置
virsh dominfo dr

修改配置
virsh edit dr

<memory unit='KiB'>1048576</memory>  
<currentMemory unit='KiB'>524288 </currentMemory>
<vcpu placement='static' current='1'>2</vcpu>


动态调整cpu数量
virsh setvcpus dr 2 

image-20230530093258915

在这里插入图片描述

2.把配置写入文件
virsh dumpxml dr > /etc/libvirt/qemu/dr.xml
3.新增网卡
virsh attach-interface dr --type bridge  --source virbr0

设置为nat网络模式(virbr0类似vmware的vmnet8),这里如果写–source br0,则网络模式为桥接
4.写入配置文件
virsh dumpxml dr > /etc/libvirt/qemu/dr.xml

5.查询网卡信息

virsh domiflist  dr

image-20230530094131161

五、迁移虚拟机

虚拟机保持关机状态

1.写入配置文件
virsh dumpxml dr > /etc/libvirt/qemu/dr.xml
2.查看虚拟机磁盘目录
virsh domblklist dr

image-20230530094445035

3.拷贝磁盘文件到迁移虚拟机的磁盘文件
rsync -av /kvmdata/Centos7_1.img /kvmdata/dr.img

image-20230530095048086

4.配置磁盘文件
vim /etc/libvirt/qemu/dr.xml

1.修改name
2.修改uuid(随便修改,位数必须相同
3.修改磁盘路径

image-20230530095529609

image-20230530095503679

5.定义

新的虚拟机

virsh define /etc/libvirt/qemu/dr.xml

image-20230530100015724

六、虚拟机console登录

配置
在centos7的kvm虚拟机中执行:
# 进入创建的虚拟机后执行
grubby --update-kernel=ALL --args="console=ttyS0,115200n8"

重启生效
# 进入创建的虚拟机后执行
reboot

登录
# 在宿主机执行
virsh console dr
回车
用户名 密码

ctrl + d  #登录后退出
ctrl + ]  #未登录退出

image-20230530102754727

七、KVM虚拟机日常管理

1.列表,开机,关机,重启
列表
virsh list:显示处于运行状态的虚拟机
virsh list --all:显示所有的虚拟机

开机
virsh start centos7(虚拟机名称)

重启
virsh reboot centos7

关机(正常关机)
virsh shutdown centos7

关机(拔电源)
virsh destroy centos7
2.导出虚拟机配置,删除虚拟机,恢复虚拟机,修改虚拟机配置,重命名
导出虚拟机配置
virsh dumpxml centos7 >centos7.xml  (只要磁盘文件没有被破坏,就能恢复虚拟机)

删除虚拟机
virsh undefine centos7

恢复虚拟机
virsh define centos7.xml

修改虚拟机配置
1)直接修改配置文件/etc/libvirt/qemu/centos7.xml
2)使用virsh edit centos7,这种方法有报错提醒

重命名虚拟机
virsh domrename centos7 centos8,这个命令低版本不适用
3.挂起,恢复,开机启动,查看vnc端口号
挂起
virsh suspend centos7

恢复
virsh resume centos7

让虚拟机开机启动
首先必须得让libvirtd服务开机自启动
然后virsh sutostart centos7

查看vnc端口号
virsh vncdisplay centos7

八、KVM虚拟机热迁移

virsh migrate –live –verbose kvm02 qemu+ssh://10.0.0.130/system –unsafe
#参数
virsh migrate –live      热迁移
verbose kvm02          热迁移的主机     
qemu+ssh://10.0.0.130/system  使用qemu加ssh协议,迁移到130的主机上,system固定格式
–unsafe           使用不安全规范

最后virsh list –all 查看迁移的主机是否运行