目录

一、KVM 概述

二、KVM工作原理

三、KVM应用场景

四、安装KVM

4.1 部署准备

4.2 安装基础服务

4.3 安装web管理服务

五、web界面管理

5.1 KVM节点添加

5.2 存储管理

​编辑5.3 创建虚拟机

六、报错处理

报错1

报错2


一、KVM 概述


KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。

KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同时还支持许多常见的操作系统和应用程序。 KVM 使用了 QEMU (Quick Emulator) 作为其默认的虚拟机监控程序。

除此之外,KVM 还支持多种嵌入式和云计算场景,并且得到了广泛的应用。


二、KVM工作原理


KVM 的工作原理是使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。

KVM 在 Linux 内核之上构建一个虚拟化层,该虚拟化层允许多个虚拟机共享物理服务器上的计算资源(如 CPU、内存和 0 设备)。在此虚拟化层中,每个虚拟机都被视为单独的计算机,每个虚拟机可以运行不同的操作系统和应用程序。

KVM使用硬件虚拟化技术,即通过 intel VT-x 和 AMD-V 等 CPU 虚拟化指集的支持,将虚拟化性能提升到接近原生性能。

此外,KVM 还使用 QEMU 作为其虚拟机监控程序,QEMU为每个虚拟机提供了一个虚拟化的环境,在该环境中,虚拟机可以访问它需要的资源(如磁盘、网络和其他I/0 设备)。

同时,KVM 利用 Linux 内核的强大功能,如分时调度和内存管理,来确保多个虚拟机之间的隔离性和安全性。

综上所述,KVM 的工作原理是结合硬件虚拟化技术和 Linux 内核的虚拟化模块,创建出一个虚拟化层,将物理服务器划分为多个虚拟机,并为每个虚拟机提供一个虚拟化的环境,从而实现资源共享和隔离。


三、KVM应用场景


KVM 作为一种强大的硬件虚拟化技术,在许多场景下都具有广泛的应用,以下是几个主要的应用场景:

1.云计算: KVM 在云计算中表现优异,可用于构建虚拟私有云、虚拟机托管服务等。KVM可以帮助企业实现资源共享、高可用性和快速部署的目标,同时还可以提高数据安全性和隔离性。

2.Web 托管: KVM 可以用于 Web 服务器的虚拟化,通过将多个虚拟机分配在一个物理服务器上,可以极大地提高服务器的利用率和性能。同时,KVM 还提供了快速备份和恢复数据的功能,保证了服务器的高可靠性。

3.测试和开发KVM 可以帮助开发者创建多个虚拟机进行测试和开发,从而提高软件开发周期的效率和速度。开发者可以在虚拟机中运行不同的操作系统和应用程序,隔离他们的开发环境,同时可以在开发过程中随时备份和还原虚拟机。

4.HPC(高性能计算): KVM 可以用于构建 HPC 集群系统。通过虚拟化技术,HPC 集群系统可以实现资源共享和高效管理,同时保证计算资源的隔离性和安全性。

5.VDI(虚拟桌面基础设施): KVM 可以用于构建VDI 系统,将多个桌面虚拟机部署在一个物理服务器上,实现桌面虚拟化。VDI 系统可以提供远程访问、资源共享和快速部署的功能,同时可以保证数据隔离和安全性。


四、安装KVM


4.1 部署准备


系统版本

IP地址

最低资源配置

部署角色

CentOS7.6

192.168.2.117

CPU:8核
内存:20G
磁盘:100G

KVM

WebVirtMgr

WMware ESXi

7.0版本

确保CPU虚拟化功能已开启。若使用的是虚拟机,则要关机设置CPU虚拟化;若使用的是物理机,则要在BIOS里开启CPU虚拟化。

如下我使用了虚拟机 硬件虚拟化3个框我们都选中。

关闭防火墙和selinux。

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0


//安装基本工具包。
yum -y install  vim wget net-tools unzip zip gcc gcc-c++ epel-release
yum install nginx -y 
systemctl enable nginx supervisor

检测机器的CPU是否支持KVM。若显示结果由vmx(Intel)或svm(AMD)字样,就说明支持。

egrep -o 'vmx|svm' /proc/cpuinfo

lsmod | grep kvm

  • vmx: 当前cpu支持Intel虚拟化技术
  • svm: 当前cpu支持amd虚拟化技术

4.2 安装基础服务


安装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

// 根据实际安装情况,若有报错,可以参考安装以下依赖包。
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/qemu-kvm-tools-1.5.3-175.el7_9.1.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 qemu-kvm-tools-1.5.3-175.el7_9.1.x86_64.rpm
yum -y localinstall bridge-utils-1.5-9.el7.x86_64.rpm 
yum -y localinstall libvirt-python-4.5.0-1.el7.x86_64.rpm 

安装包说明:

KVM安装包

含义

qemu-kvm

主要KVM程序包

python-virtinst

创建虚拟机所需要的命令行工具和程序

virt-manager

GUI虚拟机管理工具

virt-top

虚拟机统计命令

virt-viewer

GUI连接程序,连接到已经配置好的虚拟机

libvirt

C语言工具包,提供libvirt服务

libvirt-client

为虚拟机客户提供的C语言工具包9,

virt-install

基于libvirt服务的虚拟机创建命令

qemu-kvm-tools

KVM调试工具

qemu-img

QEMU磁盘映像实用程序

bridge-utils

创建和管理桥接设备的工具

设置KVM服务器网卡为桥接模式。让KVM的虚拟机就可以通过该桥接网卡和公司内部其他服务器处于同一网段。

cp /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-br0

# 配置虚拟网卡br0。
cat > /etc/sysconfig/network-scripts/ifcfg-br0 << EOF
TYPE=Bridge
DEVICE=br0
NM_CONTROLLED=no
BOOTPROTO=static
NAME=br0
ONBOOT=yes
IPADDR=192.168.2.117
NETMASK=255.255.255.0
GATEWAY=192.168.2.254
DNS1=114.114.114.114
DNS2=8.8.8.8
EOF


cat > /etc/sysconfig/network-scripts/ifcfg-ens192 << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens192
DEVICE=ens192
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
EOF

查看网桥信息

 brctl show

启动kvm,验证安装结果。


# 开启 libvirtd KVM服务,以开启相关支持
systemctl enable --now libvirtd

# 验证
lsmod|grep kvm

virsh --version
virt-install --version

查看 libvirt版本信息

4.3 安装web管理服务


安装依赖包

yum -y install git python-pip libvirt-python libxml2-python python-websockify 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
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python-websockify-0.6.0-2.el7.noarch.rpm
yum -y install python2-devel python2-pip git libvirt-python supervisor nginx 
rpm -ivh --nodeps libxml2-python-2.9.1-6.el7.5.x86_64.rpm
rpm -ivh --nodeps python-websockify-0.6.0-2.el7.noarch.rpm

下载安装webvirtmgr服务

cd /usr/local/src/
wget https://github.com/retspen/webvirtmgr/archive/refs/heads/master.zip

//解压,安装依赖包,只能使用pip或pip2来装。
unzip master.zip 
cd webvirtmgr-master/
pip install -r requirements.txt

导入sqlite3模块。这里使用python2导入的。

python
>>> import sqlite3    //存在则不会报错,若不存在需要安装。

同步数据库,设置web页面登录帐号密码。

设置web页面前端文件,拷贝web网页文件到指定目录,也就是部署web站点。

mkdir /var/www
cp -r /usr/local/src/webvirtmgr-master /var/www/webvirtmgr
chown -R nginx.nginx /var/www/webvirtmgr/

对kvm服务器做免密

# webvirtmgr服务器生成密钥。
ssh-keygen -t rsa

# 由于我把webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,那么这个是它的ip。
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.117

nginx配置

cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        server_name  localhost;

        include /etc/nginx/default.d/*.conf;

        location / {
            root html;
            index index.html index.htm;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}
EOF

// 以下的变量需保持一样,无须修改。
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

修改webvirtmgr程序文件,绑定为所有主机可以访问8000端口。

vim /var/www/webvirtmgr/conf/gunicorn.conf.py

 

检查nginx配置文件和进程

重启nginx

systemctl restart nginx

修改supervisor程序配置文件追加内容,并设置开机自启(supervisor服务不存在需要安装)。

cat >> /etc/supervisord.conf <<EOF
[program:webvirtmgr]
command=/usr/bin/python /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/python /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

# 启动supervisor并设置开机自启
systemctl enable --now supervisord

配置nginx用户

# 临时切换用户。
su - nginx -s /bin/bash

# 做免密登录
ssh-keygen -t rsa
ssh-copy-id root@192.168.161.129

# 设置nginx用户ssh该主机时,不验证也不记录。
touch ~/.ssh/config
echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config

可以在 webvirtmgr 安装 libvirt-client 进行测试:

virsh --connect qemu+ssh://root@192.168.2.117/system list --all

配置访问web页面时的验证用户为root。

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

# 修改属主属组。
chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla

重启服务,IP访问网页。

systemctl restart nginx
systemctl restart libvirtd

地址和账号 :http://192.168.2.117/login/ ,admin/admin

登录成功。到此,webvirtmgr控制台安装完毕。


五、web界面管理


5.1 KVM节点添加


yum install libvirt qemu-kvm virt-viewer -y
ln -vs /usr/libexec/qemu-kvm /usr/bin/
mv /etc/libvirt/qemu/networks/default.xml /tmp
systemctl start libvirtd
systemctl status  libvirtd

切换到 nginx 用户,生成密钥对,然后将公钥拷贝到 kvm主机节点,实现免密码登录,因为命令是通过nginx用户发送到kvm主机执行的。我们这里只有一台测试机。

libvirt-client测试

virsh --connect qemu+ssh://root@192.168.2.117/system list --all


添加node节点

填写IP和用户名

这里是直接使用 root用户,建议使用普通用户,但是要注意权限,点击添加


点进来如果没有任何报错,那么基本上已经添加主机成功了。

5.2 存储管理


kvm服务器创建镜像存放目录。

mkdir /home/kvm_iso

网页创建指定该目录

将本地镜像上传到该目录

镜像上传到路径:/home/kvm_iso

webVirMgr就可以看到成功上传的镜像

5.3 创建虚拟机


创建虚拟磁盘文件


创建虚拟机

填写虚拟机名, 选择磁盘镜像和网络池

进入创建的虚拟机选择设置 镜像连接

开启虚拟机,就可以为虚拟机安装操作系统了

已进入系统安装界面

Centos 安装中


六、报错处理


报错1


[root@kvm ~]# virt-manager
[root@kvm ~]# libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast

解决如下:

yum install -y mesa-libGLES-devel mesa-dri-drivers dejavu-lgc-sans-fonts

报错2


乱码

解决如下:

命令行里执行

如果乱码执行:LANG=C,然后重新执行virt-manager

并配置如下:

使用的系统语言环境为中文,virt-manager显示乱码。

    导致原因:语言不兼容,字符集不匹配

    解决方法:将系统由中文调整为英文

      调整方法1:

vim /etc/profile                     #打开配置文件
export LANG="en_US.UTF-8"            #添加上这一行
 
source /etc/profile                  #新加载文件配置

如下可以看到乱码问题解决


【Linux】配置网络yum源,本地yum源以及本地光盘yum源_1.将之前的源进行备份,将media复制出来-CSDN博客

Linux基础服务10——虚拟化kvm_linux kvm-CSDN博客

Centos7 安装KVM_centos kvm-CSDN博客

pip 命令不存在解决:【已解决】 linux下提示:pip未找到命令(bash pip command not found_bash pip command not found_-bash: pip: 未找到命令-CSDN博客

Logo

更多推荐