文章目录
- 一、基本了解
- 二、安装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:
- Libvirt可以管理 KVM 、Xen,VirtualBox 等多种Hypervisor。
- Libvirt 包含 3 个东西:后台程序 libvirtd、API 库、命令行工具 virsh。
- libvirtd是服务程序,接收和处理 API 请求。
- API 库是对开发人员用的,可以开发出图形化管理工具,比如 virt-manager。
- virsh 是KVM 命令行工具。
二、安装kvm
2.1 部署准备
系统版本 | IP地址 | 最低资源配置 |
---|---|---|
CentOS7 | 192.168.161.129 | CPU: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 0
mount -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