Linux基础服务10——虚拟化kvm

文章目录

  • 一、基本了解
  • 二、安装kvm
    • 2.1 部署准备
    • 2.2 安装基础服务
    • 2.3 安装web管理服务
  • 三、web界面管理
    • 3.1 添加kvm主机
    • 3.2 存储管理
      • 3.2.1 上传镜像
      • 3.2.2 扩容存储池
    • 3.3 网络管理
    • 3.4 创建虚拟机
    • 3.5 报错处理
      • 3.5.1 Server disconnected
      • 3.5.1 文件句柄问题

一、基本了解

什么是虚拟化?

  • 虚拟化是云计算的基础。虚拟化可以让一台物理服务器上跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。物理机称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。
  • 宿主机通过Hypervisor程序将自己的硬件资源虚拟化,并提供给客户机使用。

虚拟化类型:

  • 根据 Hypervisor 的实现方式和所处的位置,Hypervisor是一个系统,也是一个软件,虚拟化又分为两种:
  • 全虚拟化: Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。常见的Hypervisor有Xen、ESXi 。
    在这里插入图片描述
  • 半虚拟化: 物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。常见的Hypervisor有KVM、VirtualBox 和 VMWare Workstation 。
    在这里插入图片描述

2类型虚拟化对比:

  • 全虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比半虚拟化要高。
  • 半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

什么是kvm?

  • KVM 全称是 Kernel-Based Virtual Machine,是基于 Linux 内核实现的。
  • KVM的CPU和内存由内核模块kvm.ko管理,虚拟 CPU 和内存,磁盘和网络设备由 Linux 内核与Qemu来实现。
  • KVM作为一个 Hypervisor,本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

KVM 的管理工具Libvirt:

  1. Libvirt可以管理 KVM 、Xen,VirtualBox 等多种Hypervisor。
  2. Libvirt 包含 3 个东西:后台程序 libvirtd、API 库、命令行工具 virsh。
    • libvirtd是服务程序,接收和处理 API 请求。
    • API 库是对开发人员用的,可以开发出图形化管理工具,比如 virt-manager。
    • virsh 是KVM 命令行工具。

二、安装kvm

2.1 部署准备

系统版本IP地址最低资源配置
CentOS7192.168.161.129CPU:8核
内存:4G
磁盘:50G

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

在这里插入图片描述
2.关闭防火墙和selinux。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0//重启。
reboot

3.配置网络源。

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo//配置epel源。
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*//安装基本工具包。
yum -y install  vim wget net-tools unzip zip gcc gcc-c++

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

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

在这里插入图片描述

2.2 安装基础服务

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

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

cp /etc/sysconfig/network-scripts/ifcfg-ens33 /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.161.129
NETMASK=255.255.255.0
GATEWAY=192.168.161.2
DNS1=114.114.114.114
DNS2=8.8.8.8
EOF//配置已经=存在的网卡ens33。
cat > /etc/sysconfig/network-scripts/ifcfg-ens33 << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
EOF//重启网卡。
systemctl restart network

3.启动kvm,验证安装结果。

systemctl enable --now libvirtd//验证。
lsmod|grep kvm

4.测试验证安装结果。

virsh --version
virt-install --version//做软连接。
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm//查看网桥信息
brctl show

在这里插入图片描述

2.3 安装web管理服务

  • kvm 的 web 管理界面是由 webvirtmgr 程序提供的,下载地址

1.安装依赖包。

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

2.下载安装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

3.导入sqlite3模块。若用python2导入,则初始化使用python2来进行,我这里是用Python导入的。

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

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

python manage.py syncdb

在这里插入图片描述
5.设置web页面前端文件,拷贝web网页文件到指定目录。

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

6.对kvm服务器做免密。

//webvirtmgr服务器生成密钥。
ssh-keygen -t rsa//由于我把webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,那么这个是它的ip。
ssh-copy-id 192.168.161.129

7.配置端口转发。

ssh 192.168.161.129 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60

8.配置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

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

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

在这里插入图片描述
10.重启nginx

systemctl enable --now nginx

11.修改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

12.配置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

13.配置访问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

14.重启服务,IP访问网页。

systemctl restart nginx
systemctl restart libvirtd

在这里插入图片描述
在这里插入图片描述

三、web界面管理

3.1 添加kvm主机

  • 提供web页面的程序与kvm是单独分开的,当kvm有多台时,可以姨太太添加进来。
  • 添加之前需要给supervisord所在服务器的nginx用户对kvm主机做免密登录,将公钥传到kvm服务器上,并设置不验证、不记录。也就是上面的”配置nginx用户”步骤。

在这里插入图片描述

在这里插入图片描述

3.2 存储管理

3.2.1 上传镜像

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

mkdir /kvm_iso

2.网页创建指定该目录。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.将本地镜像上传到该目录。
在这里插入图片描述
4.创建虚拟机启动镜像文件。
在这里插入图片描述
在这里插入图片描述

3.2.2 扩容存储池

  • 当某台kvm服务器的存储不够时,需要扩容磁盘,项目中可以直接插硬盘做分区,我这里是添加虚拟机硬盘做演示。

1.添加硬盘。
在这里插入图片描述
在这里插入图片描述

2.磁盘分区,格式化,挂载。
在这里插入图片描述
在这里插入图片描述

//刷新分区。
partprobe//格式化。
mkfs.xfs /dev/sdb1//查看uuid。
blkid
/dev/sdb1: UUID="10c0590d-e469-45fd-9aba-33bce94cf763" TYPE="xfs" //挂载。
vim /etc/fstab
UUID="10c0590d-e469-45fd-9aba-33bce94cf763" /kvm_iso xfs defaults 0 0mount -a

在这里插入图片描述

3.3 网络管理

1.创建网卡。
在这里插入图片描述
在这里插入图片描述
2.查看网卡。
在这里插入图片描述

3.4 创建虚拟机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 报错处理

3.5.1 Server disconnected

  • web界面配置完成后可能会出现以下错误界面。

在这里插入图片描述

1.安装novnc,通过novnc_server启动一个vnc。

wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/n/novnc-0.5.1-2.el7.noarch.rpm
yum -y install novnc-0.5.1-2.el7.noarch.rpm//文件末尾追加下面的内容。
vim /etc/rc.d/rc.local				
...
nohup novnc_server 192.168.50.156:5920 &//添加文件执行权限,并启动程序。
chmod +x /etc/rc.d/rc.local
. /etc/rc.d/rc.local

2.做完以上操作后,再次访问即可正常访问。
在这里插入图片描述

3.5.1 文件句柄问题

  • 若第一次访问web页面时,一直访问不了一直转圈,且命令行界面一直报错(too many open files),这是文件句柄数太小太导致的。
/修改nginx配置文件。
vim /etc/nginx/nginx.conf
......
pid /run/nginx.pid;
worker_rlimit_nofile 655350;   //添加此行//修改系统文件句柄数。
vim /etc/security/limits.conf
......
# End of file
* soft nofile 655350     //添加这两行
* hard nofile 655350//重启nginx。
systemctl restart nginx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21608.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失&#xff08;Cross-Entropy Loss&#xff0c;CE Loss&#xff09;能够衡量同一个随机变量中的两个不同概率分布的差异程度&#xff0c;当两个概率分布越接近时&#xff0c;交叉熵损失越小&#xff0c;表示模型预测结果越准确。 公式 二分类 二…

安装orcle报错:指定的 Oracle 系统标识符 (SID) 已在使用

安装orcle报错&#xff1a;[INS-35075]指定的 Oracle 系统标识符 (SID) 已在使用 说明前面的orcle没有彻底删除 解决这个问题&#xff1a; 搜索框 —— > 输入&#xff1a;regedit ——> 回车 运行regedit&#xff0c;选择HKEY_LOCAL_MACHINE SOFTWARE ORACLE&#xff…

数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

本章主要介绍图像处理中一个比较基础的操作&#xff1a;Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难&#xff0c;主要是结合OpenCV 4.5的API相关操作&#xff0c;为往下 "基于距离变换的分水岭图像分割" 做知识储备。 Canny边缘检测 在讲述轮廓之前&#xff0c;…

【Hippo4j源码的方式安装部署教程】

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

Object.fromEntries()将键值对列表转换为一个对象

Object.fromEntries() 静态方法将键值对列表转换为一个对象 将 Array 转换成对象&#xff1a; let arr [["name","张三"],["age","40"]] let obj Object.fromEntries(arr); console.log(obj);将 Map 转换成对象&#xff1a; let …

Spring 项目创建和使用2 (Bean对象的存取)

目录 一、创建 Bean 对象 二、将Bean对象存储到 Spring容器中 三、创建 Spring 上下文&#xff08;得到一个Spring容器&#xff09; 1. 通过在启动类中 ApplicationContext 获取一个 Spring容器 2. 通过在启动类种使用 BeanFactory 的方式来得到 Spring 对象 &#xff08;此…

C# Linq 详解一

目录 一、概述 二、Where 三、Select 四、GroupBy 五、First / FirstOrDefault 六、Last / LastOrDefault C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.OrderByDescending 3.Skip 4.Take …

第一百零六天学习记录:数据结构与算法基础:单链表(王卓教学视频)

线性表的链式表示和实现 结点在存储器中的位置是任意的&#xff0c;即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。 用一组物理位置任意的存储单元来存放线性表的数据元素。 这组存储单元既可以是连续的&#xff0c;也可以是不连续的…

C#生成类库dll以及调用实例

本文讲解如何用C#语言生成类库并用winform项目进行调用 目录 创建C#类库项目 Winform调用dll 创建C#类库项目 编写代码 using System.Threading;namespace ClassLibrary1 {public class Class1{private Timer myTimer = null;//定义定时器用于触发事件//定义公共的委托和调…

短视频抖音seo矩阵系统源码开发者思路(一)

一套优秀的短视频获客系统&#xff0c;支持短视频智能剪辑、短视频定时发布&#xff0c;短视频排名查询及优化&#xff0c;短视频智能客服等&#xff0c;那么短视频seo系统具体开发应该具备哪些功能呢&#xff1f;今天小编就跟大家分享一下我们的技术开发思路。 抖音矩阵系统源…

Qt Https通信: TLS initialization failed 解决方法

Qt Https通信&#xff1a; TLS initialization failed 解决方法&#xff0c;Window端使用Qt 做开发请求Https资源时&#xff0c;会经常遇到 TLS initialization failed。 原因分析&#xff1a; 在Qt中并未包含 SSL所包含的库&#xff0c;因此需要开发者&#xff0c;自己将库拷贝…

百度iOS端长连接组件建设及应用实践

作者 | 百度消息中台团队 导读 在过去的十年里&#xff0c;移动端技术飞速发展&#xff0c;移动应用逐渐成为主要的便捷访问和使用互联网的方式&#xff0c;承接了越来越多的业务和功能&#xff0c;这也意味着对移动端和服务器之间的通信效率和稳定性提出了更高的要求。为了实现…