KVM虚拟化
KVM虚拟化
一、虚拟化介绍
虚拟化:在一台计算机上虚拟出多个逻辑的计算机,而且每个逻辑计算机
它可以是不同操作系统
虚拟化技术:可以扩大硬件容量,单个cpu模拟出多个cpu并行,
允许一个平台上同时运行多个操作系统,应用程序都可以在相互独立
的空间内运行,而且互不影响。
企业使用虚拟化技术:
节约成本
提高效率,物理机我们一般称为宿主机(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。
libvirtd是服务程序,接收和处理 API 请求;
API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
virsh 是我们经常要用的 KVM 命令行工具
三、一、KVM部署(基于CentOS7)
环境说明:
系统:CentOS7
IP:192.168.100.70
配置前准备:
虚拟机要关机设置CPU虚拟化
物理机要在BIOS里开启CPU虚拟化
内存:8G 磁盘:200G 虚拟化功能:开启
配置分区,将硬盘所有大小都给这个分区
关闭防火墙与selinux
配置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 syncdbWould 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/ # 拖入镜像文件
添加镜像
添加网络