通常服务器在安装操作系统的时候,管理员会选择最小化安装,在没有GUi环境下,不方便使用virtmanager的时候,可以为服务器安装网页版虚拟机管理后台WebVirtmgr来进行KVM资源和虚拟机管理。

需要注意的是虚拟机服务和virt-manager(或webvirtmgr)服务是互相独立的,完全可以管理端安装在一台服务器,虚拟机服务安装在另一台服务器上,所以即使删除了webvirtmgr所有相关内容,相关的所有kvm资源、配置并不会受到影响,虚拟机仍然由libvirtd服务正常运行。

1. 环境准备

1.1 宿主机:Ubuntu 18.04
1.2 安装包:

apt install qemu qemu-kvm libvirt-bin  bridge-utils \
  git python-pip python-libvirt python-libxml2 \
  novnc nginx supervisor

1.3 IP设置 :编辑/etc/netplan/50-cloud-init.yaml,并用netplan apply命令应用修改。

network:
 version: 2
 ethernets:
   ens33:
     dhcp4: no
     dhcp6: no
 bridges:
   br0:
     interfaces: [ens33]
     dhcp4: no
     addresses: [192.168.0.11/24]
     gateway4: 192.168.0.1
     nameservers:
       addresses: [192.168.0.1] 

1.4 启动服务:如果使用virt-manager,在启用libvirtd服务后,就已经可以正常工作了。

systemctl enable libvirtd && systemctl start libvirtd

2. 安装WEB控制台 – webvirtmgr

2.1 下载git项目,安装依赖

cd /var/www
git clone git://github.com/retspen/webvirtmgr.git

cd webvirtmgr
# 安装依赖时,如果安装requirements.txt中的软件遇到下载
# 困难时,可以指定服务器镜像进行安装
pip install django==1.5.5 -i https://pypi.mirrors.ustc.edu.cn/simple/
pip install -r requirements.txt

# 安装数据库,并收集静态文件
./manage.py syncdb
./manage.py collectstatic
chown -R www-data /var/www

2.2 生成SSHKEY(用于web服务连接到虚拟机服务)

su -s /bin/bash www-data
ssh-keygen
ssh-copy-id root@localhost
ssh root@localhost 
# 连接一次接受指纹,或者在sshd配置中关闭StrictHostKeyChecking

2.3 设置supervisor,保持服务激活

# 配置文件/etc/supervisor/conf.d/webvirtmgr.conf
[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
stdout_logfile=/var/log/supervisor/webvirtmgr.log
redirect_stderr=true
user=www-data


[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console -d
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=www-data

2.4 nginx vhost配置

server {
    listen 80;

    server_name _;
    access_log /var/log/nginx/webvirtmgr_access.log;
    error_log /var/log/nginx/webvirtmgr_error.log;

    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr;
        expires max;
    }

    location / {
        proxy_pass http://127.0.0.1:8080;
        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 $scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 100M; 
        # 使用网页上传较在文件(比中操作系统镜像)时,
        # 需将体积限制和超时时间限制都调大,
        # 具体数值取决于上传文件大小和网络情况。
    }
}

2.5 启动服务

systemctl enable nginx supservisor
systemctl start nginx supervisor

3. 常用管理

3.1 添加服务器:登录nginx发布的站点,点击Add connection即可。

3.2 管理存储池:
3.2.1 建议为虚拟机硬盘镜像、ISO镜像分别建立dir类型存储池(等效于virsh pool-create-as –name vmdir_pool –type dir –target /data/vm_pool);
3.2.2 存储池准备好后,可以向ISO存储池上传系统镜像,同时也需要为新建的虚拟机创建硬盘镜像(需要为虚拟机添加几块磁盘,就创建几个硬盘镜像)。

3.3 管理网络:分别创建Bridge网络(桥接到本机物理网络)、NAT网络(通过对虚拟机流量进行NAT转发实现联网),ISOLATE网络(隔离在KVM服务器内部的虚拟网络)。

3.4 创建虚拟机:
* webvirtmgr有一个很大的缺陷,只提供对虚拟机极为有限的修改,无法对已存在的虚拟进行设备増删和调整,而且创建的时候不能为同一个network添加多块网卡。如果碰到这种需求,只能在虚拟机停机时,进入实例的settings界面,对定义XML直接修改,或者用virsh命令进行修改

4. 关于配置

4.1 外网环境使用时,需要对外映射一个和控制台服务相同的端口,比如webvirtmgr-console使用TCP6000作为服务端口,则在外网映射TCP6000到服务器的TCP6000。

4.2 /var/www/webvirtmgr/webvirtmgr/settings.py中,可以修改服务端口、域名、证书。

WS_PORT = 6000
WS_HOST = '0.0.0.0'
WS_PUBLIC_HOST = "vm.mykvm.com"
WS_CERT = "/etc/nginx/keys/fullchain.pem"
WS_KEY = "/etc/nginx/keys/private.key"

4.3 如果 web服务的端口与服务器上已有服务产生冲突,可以到配置文件/var/www/webvirtmgr/conf/gunicorn.conf.py 中调整配置项”bind”。