当前位置: 首页 > news >正文

KVM虚拟化部署全攻略

KVM虚拟化技术详解与部署指南

1. 虚拟化介绍

虚拟化是指在一台物理计算机上虚拟出多个逻辑计算机的技术,每个逻辑计算机可以运行不同的操作系统。虚拟化技术能够有效扩大硬件容量,例如通过单个CPU模拟多个CPU并行运行,允许在同一平台上同时运行多个操作系统和应用程序,且各个系统之间相互独立、互不影响。

企业为何使用虚拟化技术?

  1. 节约成本
  2. 提高效率

在虚拟化环境中,物理机通常被称为宿主机(Host),而宿主机上运行的虚拟机则称为客户机(Guest)。宿主机通过名为 Hypervisor 的程序将其硬件资源虚拟化并提供给客户机使用。

Hypervisor 是一种运行在物理服务器硬件与操作系统之间的中间软件层,允许多个操作系统和应用共享硬件资源。根据实现方式和所处位置,虚拟化可分为两种类型:

  • 完全虚拟化:直接在物理机上部署虚拟化,无需修改操作系统内核。
  • 半虚拟化:需修改操作系统内核,以支持虚拟化驱动来实现虚拟化技术。
1.1 完全虚拟化

Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。其实现方式通常是一个特殊定制的 Linux 系统,例如 Xen 和 VMWare 的 ESXi。

1.2 半虚拟化

理论上,完全虚拟化通常对硬件虚拟化功能进行了特别优化,性能上高于半虚拟化;而半虚拟化基于普通操作系统,更为灵活,例如支持虚拟机嵌套(如在KVM虚拟机中再运行KVM)。


2. KVM介绍

KVM(Kernel-Based Virtual Machine) 是基于 Linux 内核实现的虚拟化技术。KVM 包含一个内核模块 kvm.ko,用于管理虚拟 CPU 和内存。而 IO 的虚拟化(如存储和网络设备)则由 Linux 内核与 Qemu 共同实现。

Qemu 是纯软件实现的虚拟化模拟器,可模拟几乎所有硬件设备。但其纯软件实现导致性能较低,因此在生产环境中通常与 KVM 配合使用:KVM 负责 CPU 和内存虚拟化,Qemu 负责 I/O 虚拟化,两者结合充分发挥各自优势。

Libvirt 是 KVM 的管理工具,可用于管理虚拟机和虚拟化功能,同时也支持管理 Xen、VirtualBox 等 Hypervisor。Libvirt 包含三个组件:

  1. 后台 daemon 程序 libvirtd
  2. API 库
  3. 命令行工具 virsh

3. KVM部署(基于CentOS7)

环境说明:

  • 系统:CentOS7
  • IP:192.168.100.100

部署步骤:

1. 确认CPU虚拟化功能已开启
  • 虚拟机需关机设置CPU虚拟化
  • 物理机需在BIOS中开启CPU虚拟化
2. 虚拟机设置
  • 内存:8G
  • 磁盘:200G
  • 虚拟化功能:开启
3. 硬盘分区与挂载
[root@ydh ~] parted /dev/sdb
mklabel
msdos
unit、
MiB
p    #查看
mkpart primary xfs 10MiB 204790MiB
q[root@ydh ~] udevadm settle
[root@ydh ~] mkfs.xfs /dev/sdb1
[root@ydh ~] blkid /dev/sdb1
[root@ydh ~] mkdir /kvmdata
# 编辑 /etc/fstab 添加挂载信息
UUID=d5b2d3e7-7698-4224-8b14-cb66697636bd  /kvmdata  xfs    defaults 0 0[root@ydh ~] mount -a
[root@ydh ~] df -Th     #查看挂载信息
4. 安装KVM及相关工具
[root@ydh ~] systemctl stop firewalld
[root@ydh ~] systemctl disable firewalld
[root@ydh ~] vim /etc/sysconfig/selinux 
SELINUX=disabled
# 设置SELINUX=disabled 后重启
#配置yum仓库,阿里云CentOS7粘贴
[root@ydh ~] 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
5. 配置网络桥接
[root@ydhtwork-scripts] cd /etc/sysconfig/network-scripts/
[root@ydhtwork-scripts] cp ifcfg-ens33 ifcfg-br0
# 配置 ifcfg-br0 和 ifcfg-ens33
cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.100.30
PREFIX=24
GATEWAY=192.168.100.254
DNS1=8.8.8.8
[root@cy network-scripts]# cat ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0[root@ydhtwork-scripts] systemctl restart NetworkManager
[root@ydhtwork-scripts] systemctl restart network
[root@ydhtwork-scripts] fdowm ens33
[root@ydhtwork-scripts] ifup ens33
6. 启动并验证Libvirt
[root@ydh ~] systemctl restart libvirtd
[root@ydh ~] systemctl enable libvirtd
[root@ydh ~] lsmod | grep kvm
kvm_intel             183621  0 
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm[root@ydh ~] virsh -c qemu:///system list
Id    名称                         状态
----------------------------------------------------
#qemu-kvm这个命令做一个软链接到/usr/bin/qemu-kvm
[root@ydh ~] ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
[root@ydh ~] ll /usr/bin/qemu-kvm
lrwxrwxrwx 1 root root 21 930 00:14 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm#看网桥信息
[root@ydh ~] brctl show
bridge name bridge id  STP enabled interfaces
br0  8000.000c294927bd no  ens33
virbr0  8000.525400f9acee yes  virbr0-nic
7. 安装Web管理界面(WebVirtMgr)
Kvm的web界面是由webvirtmgr程序提供的
#安装依赖包
[root@ydh ~] yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel
#从github上下载webvirtmgr代码
[root@ydh ~] cd /usr/local/src/
[root@ydh src] git clone https://github.com/retspen/webvirtmgr.git
#安装webvirtmgr
[root@ydh webvirtmgr] pip --trusted-host pypi.python.org install -r requirements.txt
#检查sqlite3是否安装
[root@ydh ~] python manage.py syncdb
# 配置Nginx、Supervisor及相关权限
#初始化账号信息
[root@ydh ~] cd /usr/local/src/webvirtmgr/
[root@ydh ~] python manage.py syncdb#省略其中一部分
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'):   #指定超级管理员账号用户名,默认留空为root
Email address: admin@example.com  #设置超级管理员邮箱
Password:     #设置超级管理员密码
Password (again):    #再次输入确认超级管理员密码
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)
#拷贝web网页到指定目录
[root@ydh webvirtmgr] mkdir /var/www
[root@ydh webvirtmgr] cp -r /usr/local/src/webvirtmgr/ /var/www/
[root@ydh webvirtmgr] chown -R nginx.nginx /var/www/webvirtmgr/#生成一对公钥与私钥,由于这里webvirtmgr和kvm服务部署在同一台主机中,所以这里本地信任。如果kvm部署在其他机器上的时候,那么就需要把公钥发送到kvm主机中
[root@ydh webvirtmgr] ssh-keygen
[root@ydh webvirtmgr] ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.100#配置端口转发
[root@ydh webvirtmgr] ssh 192.168.100.100 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
可以使用ss -antl查看端口情况
配置nginx虚拟主机
//配置nginx
[root@ydh ~] cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
[root@ydh ~] vim /etc/nginx/nginx.conf
//在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;}#配置nginx虚拟主机
[root@ydh ~] 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@ydh ~] vim /var/www/webvirtmgr/conf/gunicorn.conf.py
#省略多行
bind = '127.0.0.1:8000'  //确保此处绑定的是本机的8000端口,这个在nginx配置中定义了,被代理的端口
backlog = 2048
#省略多行#重启nginx服务,查看端口是否开启
[root@ydh ~] systemctl restart nginx
[root@ydh ~] ss -antl#设置supervisor
[root@ydh ~] vim /etc/supervisord.conf
#在文件最后添加如下信息
[program:webvirtmgr]
#这里command是一行
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并设置开机自启
[root@ydh ~] systemctl restart supervisord.service 
[root@ydh ~] systemctl enable supervisord.service
配置nginx用户
#配置nginx用户
[root@ydh ~] 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.100#验证基于密钥认证是否成功
-bash-4.2$ ssh root@192.168.100.100
Warning: Permanently added '192.168.100.100' (ECDSA) to the list of known hosts.
Last login: Fri Sep 30 00:46:32 2022 from cy.example.com
[root@ydh ~] exit
登出
Connection to 192.168.100.100 closed.
-bash-4.2$ exit
登出[root@ydh ~] 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@ydh ~] chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
[root@ydh ~] systemctl restart nginx
[root@ydh ~] systemctl restart libvirtd
8. 解决常见问题

如遇到“Too many open files”错误,需调整系统参数:

KVM web界面管理

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

在这里插入图片描述

解决方法:

#修改nginx配置文件[root@ydh ~] vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
worker_rlimit_nofile 655350;   #添加此行#对系统参数进行设置[root@ydh ~] vim /etc/security/limits.conf#在文件最末尾写入
\* soft nofile 655350
\* hard nofile 655350#重启服务,重读文件[root@ydh ~] sysctl -p
[root@ydh ~] systemctl restart nginx

再次使用浏览器访问

在这里插入图片描述

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

//添加连接

在这里插入图片描述

在这里插入图片描述

//创建虚拟机

1、新建存储
在这里插入图片描述

在这里插入图片描述

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

[root@ydh ~] yum -y install lrzsz
[root@ydh ~] cd /kvmdata/

将进行拖进来

在这里插入图片描述

在这里插入图片描述

//添加网络

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

//实例管理,现在去创建一个虚拟机

9. 安装noVNC并配置远程访问
yum -y install novnc
chmod +x /etc/rc.d/rc.local
# 在 /etc/rc.d/rc.local 中添加:
nohup novnc_server 192.168.100.100:5920 &
012122804)] //实例管理,现在去创建一个虚拟机[外链图片转存中...(img-Xt0SHvgr-1756012122804)] [外链图片转存中...(img-tHsqE17n-1756012122804)] [外链图片转存中...(img-pCNISivN-1756012122804)] [外链图片转存中...(img-Ob6RER0X-1756012122805)] [外链图片转存中...(img-bEebCrXg-1756012122805)] #### 9. 安装noVNC并配置远程访问```shell
yum -y install novnc
chmod +x /etc/rc.d/rc.local
# 在 /etc/rc.d/rc.local 中添加:
nohup novnc_server 192.168.100.100:5920 &
http://www.dtcms.com/a/349039.html

相关文章:

  • 使用Python实现DLT645-2007智能电表协议
  • 【Docker基础】Docker-compose常用命令实践(三):镜像与配置管理
  • 纯净Win11游戏系统|24H2专业工作站版,预装运行库,无捆绑,开机快,游戏兼容性超强!
  • 27.编程思想
  • 【JVM内存结构系列】四、不同垃圾回收器与堆内存的适配关系:从分代GC到Region GC
  • kylin10-x64 离线安装docker28.3.3
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2025年3月9日真题
  • 互联网大厂Java面试模拟:核心技术点深度解析
  • 深度剖析Spring AI源码(四):RAG的基石,解密VectorStore的统一抽象
  • 冯·诺依曼体系结构
  • 【机器学习】5 Bayesian statistics
  • AOSP构建指南:从零开始的Android源码之旅
  • 青少年软件编程(python六级)等级考试试卷-客观题(2024年6月)
  • 2.3 金融中介机构的业务
  • 《深入理解Java虚拟机》学习笔记
  • 【高级】系统架构师 | 系统工程
  • Java面试篇
  • 数字防线:现代企业网络安全运维实战指南
  • WinContig:高效磁盘碎片整理工具
  • [Mysql数据库] 知识点总结1
  • [身份验证脚手架] docs | breeze:install
  • 电梯间电动车误检率↓79%!陌讯多模态融合算法实战解析
  • ROS1中的Package
  • Ansible 自动化基石:变量定义、优先级控制与 Vault 敏感信息加密实战指南
  • 100个实用小工具1.3历年股价分析小工具新增股价批量下载
  • Linux shell脚本条件循环
  • MATLAB 在工程仿真中的实践:以机械振动分析为例的完整流程
  • 1.Spring Boot:超越配置地狱,重塑Java开发体验
  • LeetCode 101 刷题 - (2) 第二章 玩转双指针
  • Jupyter Lab 常用快捷键清单