KVM虚拟化

KVM虚拟化

一、虚拟化介绍

**虚拟化:**在一台计算机上虚拟出多个逻辑的计算机,而且每个逻辑计算机

它可以是不同操作系统

**虚拟化技术:**可以扩大硬件容量,单个cpu模拟出多个cpu并行,

允许一个平台上同时运行多个操作系统,应用程序都可以在相互独立

的空间内运行,而且互不影响。

企业使用虚拟化技术:

  1. 节约成本

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

**Hypervisor:**一种运行在物理服务器硬件与操作系统之间的中间软件层

可允许多个操作系统和应用来共享硬件资源。

根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:

  • 完全虚拟化:直接在物理机上部署虚拟化,且不需要修改操作系统内核

  • 半虚拟化:需要修改操作系统内核,使其支持虚拟化驱动来实现虚拟化技术

二、KVM简介

KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。

Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。

作为一个 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部署(基于CentOS7)

环境说明:

系统:CentOS7

IP:192.168.100.70

配置前准备:

  1. 虚拟机要关机设置CPU虚拟化

  2. 物理机要在BIOS里开启CPU虚拟化

  3. 内存:8G 磁盘:200G 虚拟化功能:开启

  4. 配置分区,将硬盘所有大小都给这个分区

  5. 关闭防火墙与selinux

  6. 配置yum源:阿里源与epel源

1、安装所需软件包

复制代码
 [root@ldh7 ~]# yum -y install  vim wget net-tools unzip zip gcc gcc-c++
 # 验证cpu是否支持kvm,vmx是intel的  svm是AMD的
 [root@ldh7 ~]# egrep -o 'vmx|svm' /proc/cpuinfo 

2、安装KVM

复制代码
 [root@ldh7 ~]# 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 

3、配置网络

因为虚拟机中的网络,我们一般是都和公司服务器处在同一网段的,所以我们需要把kvm的网卡配置成桥接模式。

复制代码
 [root@ldh7 ~]# cd /etc/sysconfig/network-scripts/
 [root@ldh7 network-scripts]# cp ifcfg-ens33 ifcfg-br0
复制代码
 [root@ldh7 network-scripts]# vim ifcfg-br0 
复制代码
 [root@ldh7 network-scripts]# vim ifcfg-ens33
复制代码
 # 重启网卡服务
 [root@ldh7 network-scripts]# systemctl restart NetworkManager
 [root@ldh7 network-scripts]# systemctl restart network
 [root@ldh7 network-scripts]# ifdown ens33
 [root@ldh7 network-scripts]# ifup ens33

4、重启libvirtd服务,并设置下次启动生效

复制代码
 [root@ldh7 ~]# systemctl restart libvirtd
 [root@ldh7 ~]# systemctl enable libvirtd
 # 查看kvm模块是否加载
 [root@ldh7 ~]# lsmod | grep kvm
复制代码
 # 验证安装结果
 [root@ldh7 ~]# virsh -c qemu:///system list
 [root@ldh7 ~]# virsh --version
 [root@ldh7 ~]#  virt-install --version

5、将qemu-kvm这个命令做一个软链接到/usr/bin/qemu-kvm

复制代码
[root@ldh7 ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

6、KVM管理界面安装

Kvm的web界面是由webvirtmgr程序提供的

复制代码
# 安装依赖包
[root@ldh7 ~]# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel

# 从github上下载webvirtmgr代码,最好开启加速,因为访问的是外网
[root@ldh7 ~]# cd /usr/local/src/
[root@ldh7 src]# git clone https://github.com/retspen/webvirtmgr.git

# 安装webvirtmgr
[root@ldh7 src]# cd webvirtmgr/
[root@ldh7 webvirtmgr]# pip --trusted-host pypi.python.org install -r requirements.txt

# 检查sqlite3是否安装
python
>>> import sqlite3
>>> exit()
复制代码
# 初始化账号信息
[root@ldh7 webvirtmgr]# python manage.py syncdb

Would you like to create one now? (yes/no): yes # 是否创建超级管理员账号
Username (leave blank to use 'root'):   # 指定超级管理员账号用户名,默认留空为root
Email address: admin@example.com  # 设置超级管理员邮箱
Password:     # 设置超级管理员密码
Password (again):    # 再次输入确认超级管理员密码
复制代码
# 拷贝web网页到指定目录
[root@ldh7 webvirtmgr]# mkdir /var/www
[root@ldh7 webvirtmgr]# cp -r /usr/local/src/webvirtmgr/ /var/www/
[root@ldh7 webvirtmgr]# chown -R nginx.nginx /var/www/webvirtmgr/

生成一对公钥与私钥,由于这里webvirtmgr和kvm服务部署在同一台主机中,所以这里本地信任。如果kvm部署在其他机器上的时候,那么就需要把公钥发送到kvm主机中。

复制代码
[root@ldh7 webvirtmgr]# ssh-keygen
[root@ldh7 webvirtmgr]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.70
复制代码
# 配置端口转发
[root@ldh7 webvirtmgr]# ssh 192.168.100.100 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60

# 配置nginx
[root@ldh7 ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
[root@ldh7 ~]# vim /etc/nginx/nginx.conf
删除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;
      }
复制代码
# 配置nginx虚拟主机
[root@ldh7 ~]# vim /etc/nginx/conf.d/webvirtmgr.conf
# 输入以下内容
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;
    }
}
复制代码
# 确保bind绑定本机的8000端口
[root@ldh7 ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
复制代码
# 重启nginx服务,查看端口是否开启
[root@ldh7 ~]# systemctl restart nginx
[root@ldh7 ~]# ss -antl
复制代码
# 设置supervisor
[root@ldh7 ~]# vim /etc/supervisord.conf

# 在文件最后添加如下信息
[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
复制代码
# 启动supervisor并设置开机自启
systemctl restart supervisord.service 
systemctl enable supervisord.service
复制代码
# 配置nginx用户
[root@ldh7 ~]# su - nginx -s /bin/bash
-bash-4.2$ ssh-keygen
-bash-4.2$ touch ~/.ssh/config
-bash-4.2$ echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config 
-bash-4.2$ chmod 0600 ~/.ssh/config 
-bash-4.2$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.70

# 验证基于密钥认证是否成功
-bash-4.2$ ssh root@192.168.100.70
#Warning: Permanently added '192.168.100.100' (ECDSA) to the list of known hosts.
#Last login: Fri Sep 30 00:46:32 2022 from ldh7.example.com
# 退出,exit
复制代码
[root@ldh7 ~]# vim /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
# 输入以下内容
[Remote libvirt SSH access]
Identity=unix-user:root
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[root@ldh7 ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
[root@ldh7 ~]# systemctl restart nginx
[root@ldh7 ~]# systemctl restart libvirtd

7、KVM web界面管理

使用浏览器访问192.168.100.70,服务器出现了accept:Too many open files

解决方法:

复制代码
# 修改nginx配置文件
[root@ldh7 ~]# vim /etc/nginx/nginx.conf
worker_rlimit_nofile 655350; # 添加此行
复制代码
# 对系统参数进行设置
[root@ldh7 ~]# vim /etc/security/limits.conf
# 在文件最末尾写入
* soft nofile 655350
* hard nofile 655350
# 重启服务,重读文件
[root@ldh7 ~]# sysctl -p
[root@ldh7 ~]# systemctl restart nginx

8、再次使用浏览器访问

访问不了使用谷歌浏览器

复制代码
# 安装novnc,并通过novnc_server启动一个vnc
[root@ldh7 ~]# yum -y install novnc
[root@ldh7 ~]# chmod +x /etc/rc.d/rc.local
[root@ldh7 ~]# vim /etc/rc.d/rc.local
# 在最末尾加入如下行
nohup novnc_server 192.168.100.70:5920 &

[root@ldh7 ~]# . /etc/rc.d/rc.local

添加连接

四、创建虚拟机

1、新建存储

2、上传镜像,使用xftp或者xshell,再或者其他工具,将镜像文件上传到服务器的/kvmdata目录下存放

复制代码
[root@ldh7 ~]# yum -y install lrzsz
[root@ldh7 ~]# cd /kvmdata/
# 拖入镜像文件

添加镜像

添加网络

相关推荐
数据智能老司机2 分钟前
探索Java 全新的线程模型——结构化并发
java·性能优化·架构
数据智能老司机2 分钟前
探索Java 全新的线程模型——作用域值
java·性能优化·架构
数据智能老司机4 分钟前
探索Java 全新的线程模型——并发模式
java·性能优化·架构
数据智能老司机11 分钟前
探索Java 全新的线程模型——虚拟线程
java·性能优化·架构
byte轻骑兵34 分钟前
【Linux文件系统】Linux文件系统与设备驱动
linux·运维·服务器
小马哥编程1 小时前
【软考架构】云计算相关概念
架构·云计算·软件工程·安全架构
架构精进之路1 小时前
多智能体系统不是银弹
后端·架构·aigc
mit6.8241 小时前
[身份验证脚手架] 应用布局如何构建
架构·php·后端框架
CHEN5_022 小时前
时序数据库选型“下半场”:从性能竞赛到生态博弈,四大主流架构深度横评
数据库·人工智能·ai·架构·时序数据库
架构精进之路2 小时前
多智能体系统架构解析
后端·架构·ai编程