银河麒麟高级服务器版V11+KVM+Libvirt+WebVirtCloud+OpenStack部署
非常好的选择 👍
您要实现的目标是:
在 银河麒麟高级服务器版V10(Kylin V10) 上,构建一个完整的虚拟化管理平台,包含:
-
KVM:提供虚拟化能力(基于CPU硬件虚拟化)
-
Libvirt:提供虚拟机管理接口
-
WebVirtCloud:提供Web管理界面
-
OpenStack(可选):提供私有云级别的资源调度与自服务管理
下面给出一份 详细、可直接执行的部署文档(生产可用),默认系统为 Kylin V10 x86_64 / aarch64,已启用 yum 或 dnf 源。
🚀 一、环境准备
1. 检查CPU是否支持虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
返回值 > 0 表示支持。
2. 确保内核模块支持KVM
lsmod | grep kvm
若未加载,则手动加载:
modprobe kvm
modprobe kvm_intel # Intel
modprobe kvm_amd # AMD
3. 启用桥接网络(推荐虚拟机可直接联网)
创建网桥配置文件 /etc/sysconfig/network-scripts/ifcfg-br0:
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.3.15
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=202.96.209.5
ONBOOT=yes
修改物理网卡(如 ifcfg-eno2):
DEVICE=ens33
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
BRIDGE=br0
实际如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=eno2
UUID=5d9b10e9-49eb-4742-875a-0a6cbc268e9b
DEVICE=eno2
ONBOOT=yes
BRIDGE=br0
#IPADDR=192.168.3.15
#PREFIX=24
#GATEWAY=192.168.3.1
#DNS1=202.96.209.5
然后执行:
systemctl restart network
实际该命令无效,reboot或其他方法
🧩 二、安装KVM + Libvirt + QEMU
yum install -y qemu-kvm qemu-img virt-manager libvirt python3-libvirt libvirt-client bridge-utils virt-install
启用服务:
systemctl enable libvirtd --now
systemctl status libvirtd
验证:
virsh list --all
应能返回空虚拟机列表。
手动添加 EPEL 仓库
cp /etc/yum.repos.d/kylin-extra.repo /etc/yum.repos.d/kylin-extra.repo.bak
vi /etc/yum.repos.d/kylin-extra.repo
[epel]
name=EPEL for Kylin 11 (RHEL8 compatible)
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0
[powertools]
name=PowerTools for Kylin 11
baseurl=https://mirrors.aliyun.com/centos/8/PowerTools/x86_64/os/
enabled=1
gpgcheck=0
dnf clean all
dnf makecache
🌐 三、安装WebVirtCloud(Web管理界面)
1. 安装依赖
yum install -y wget git
wget http://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
yum localinstall -y epel-release-latest-8.noarch.rpm --skip-broken
yum clean all
yum makecache
yum install -y git python3 python3-pip nginx supervisor
安装报错的话要用清华源安装
mkdir -p ~/.pip
cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
timeout = 6000
EOF
pip3 install supervisor
pip3 install --upgrade pip
2. 克隆WebVirtCloud源码
cd /opt
git clone https://github.com/retspen/webvirtcloud.git
cd webvirtcloud
如果git失败可调高缓冲区再下载
git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
git config --global core.compression 0
3. 安装Python依赖
yum install libvirt-devel gcc python3-devel openldap-devel
pip3 install -r conf/requirements.txt
4. 初始化数据库和配置
cp webvirtcloud/settings.py.template webvirtcloud/settings.py
python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
#生成一串字符 c*&2pu%e=m7&r*^r*zp3p*wr!(8w3a$-l^rq@*w5#7ekrwmtpd
vi webvirtcloud/settings.py
#找到或添加 SECRET_KEY 配置)
SECRET_KEY = 'c*&2pu%e=m7&r*^r*zp3p*wr!(8w3a$-l^rq@*w5#7ekrwmtpd'
python3 manage.py migrate
python3 manage.py createsuperuser # 创建管理员账号
#web登录用的账号密码
#账号 shuncom 邮箱:8108@shuncom.com 密码:sh_clighting
5. 启动测试
方法 A:Gunicorn 自带 --daemon
python3 manage.py runserver 0.0.0.0:8000
#如果报错换以下方法
# 安装 gunicorn(你已经安装了)
pip3 install gunicorn
# 启动 WebVirtCloud
gunicorn --workers 3 --bind 0.0.0.0:8000 --daemon webvirtcloud.wsgi:application
#日志默认输出到 gunicorn.log,可通过 --access-logfile 和 --error-logfile 指定日志文件
gunicorn --workers 3 --bind 0.0.0.0:8000 \
--daemon \
--access-logfile /var/log/webvirtcloud_access.log \
--error-logfile /var/log/webvirtcloud_error.log \
webvirtcloud.wsgi:application
方法 B:使用 systemd 管理 WebVirtCloud
创建服务文件 /etc/systemd/system/webvirtcloud.service:
[Unit]
Description=WebVirtCloud Django service
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/opt/webvirtcloud
ExecStart=/usr/local/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 webvirtcloud.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
然后执行:
systemctl daemon-reload
systemctl enable --now webvirtcloud
systemctl status webvirtcloud
#防火墙放行web端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
访问 http://服务器IP:8000,使用创建的管理员账号登录。
⚙️ 四、配置Nginx反向代理(生产环境)
编辑 /etc/nginx/conf.d/webvirtcloud.conf:
如果没安装:yum install -y nginx
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
重启服务:
systemctl enable nginx --now
🧰 五、配置Supervisor守护WebVirtCloud
如果系统没有 /etc/supervisord.conf,可以创建:
内容示例:
[unix_http_server]
file=/tmp/supervisor.sock ; UNIX socket 文件
[supervisord]
logfile=/var/log/supervisord.log
pidfile=/tmp/supervisord.pid
childlogdir=/var/log
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[include]
files = /etc/supervisord.d/*.ini
mkdir -p /etc/supervisord.d
vi /etc/supervisord.d/webvirtcloud.ini
[program:webvirtcloud]
command=/usr/bin/python3 /opt/webvirtcloud/manage.py runserver 0.0.0.0:8000
directory=/opt/webvirtcloud
autostart=true
autorestart=true
stderr_logfile=/var/log/webvirtcloud.err.log
stdout_logfile=/var/log/webvirtcloud.out.log
user=root
启用并启动:
systemctl enable supervisord --now
supervisorctl restart webvirtcloud
验证:
supervisorctl status
🖥 六、配置WebVirtCloud连接KVM主机
-
登录WebVirtCloud后台(
http://<服务器IP>) -
“Compute > Add Connection”
-
填写:
-
Label: KVM-Host
-
Hostname/IP:
127.0.0.1 -
Connection type: SSH
-
Login user:
root或管理用户
-
-
确保
root用户可以无密码SSH到本机:ssh-keygen -t rsa ssh-copy-id root@127.0.0.1 -
连接成功后,即可在Web界面创建和管理虚拟机。
☁️ 七、(可选)安装 OpenStack 实现云平台管理
如果您需要将虚拟化扩展为“云平台”,可以部署轻量级 OpenStack All-in-One。
1. 安装 DevStack(快速体验)
cd /opt
git clone https://opendev.org/openstack/devstack
cd devstack
创建配置文件 local.conf:
[[local|localrc]]
ADMIN_PASSWORD=admin
DATABASE_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
HOST_IP=192.168.1.100
启动安装:
./stack.sh
安装完成后访问:
http://192.168.1.100/dashboard
默认用户:admin 密码:admin
🧾 八、验证与维护
验证虚拟化运行状态
virsh list
查看libvirt网络和存储池
virsh net-list
virsh pool-list
检查服务状态
systemctl status libvirtd
systemctl status nginx
systemctl status supervisord
✅ 部署总结
| 模块 | 功能 | 服务端口 | 管理方式 |
|---|---|---|---|
| KVM | 提供虚拟化能力 | - | 命令行/Libvirt |
| Libvirt | 虚拟机管理接口 | 16509 | virsh/virt-manager |
| WebVirtCloud | Web虚拟机管理 | 80/8000 | 浏览器 |
| OpenStack | 云计算管理平台 | 80/5000/8774 等 | Web仪表盘 Horizon |
🧭 建议实践路线
| 目标 | 推荐方案 |
|---|---|
| 轻量虚拟化环境 | KVM + Virt-Manager |
| Web管理多节点 | WebVirtCloud |
| 构建私有云平台 | OpenStack on KVM |
| 高级调度与计费 | OpenStack + Ceph |
是否希望我为您输出一份 可直接在Kylin V10执行的 Shell 自动化安装脚本(含Nginx+WebVirtCloud+Libvirt 一键部署)?
那样您可以直接运行即可完成全部环境配置。
你现在在 WebVirtCloud 创建虚拟机实例时,提示:
You haven't defined any storage pools
这是因为 Libvirt 还没有配置任何存储池,WebVirtCloud 依赖存储池来存放虚拟机磁盘镜像。
1️⃣ 查看现有存储池
在服务器上执行:
sudo virsh pool-list --all
输出可能类似:
Name State Autostart
------------------------------------------------
default inactive no
如果没有存储池或状态为 inactive,就需要创建或激活。
2️⃣ 激活默认存储池(如果存在)
sudo virsh pool-start default
sudo virsh pool-autostart default
3️⃣ 创建新的存储池(如果没有)
假设你希望在 /var/lib/libvirt/images 存储虚拟机磁盘:
sudo mkdir -p /var/lib/libvirt/images
sudo virsh pool-define-as default dir - - - - "/var/lib/libvirt/images"
sudo virsh pool-build default
sudo virsh pool-start default
sudo virsh pool-autostart default
解释:
pool-define-as default dir ... "/var/lib/libvirt/images":定义一个目录类型存储池
pool-build:准备池
pool-start:启动池
pool-autostart:开机自动启动
4️⃣ 在 WebVirtCloud 刷新
-
登录 WebVirtCloud
-
打开 Host → Storage Pools
-
应该能看到你刚创建或激活的存储池
-
现在就可以创建虚拟机实例了
💡 小提示:
-
存储池必须 可写,并且 WebVirtCloud 运行用户有权限访问
-
通常使用
root或者libvirt用户运行 WebVirtCloud
非常好 👍 你已经能在 WebVirtCloud 里创建虚拟机了。
现在要“上传 ISO 文件并挂载到虚拟机 CD-ROM”,可以有两种常见方式(命令行或 WebVirtCloud 界面)。我详细说明一下:
🧩 一、命令行方式(推荐)
这种方法最直接、最稳定,尤其是初次配置时。
1️⃣ 把 ISO 文件上传到宿主机存储路径
假设你的默认存储池是 /var/lib/libvirt/images:
cd /var/lib/libvirt/images
然后上传 ISO 文件(有多种方式):
# 方式1:通过scp从你的电脑上传
scp CentOS-7-x86_64-Minimal.iso root@<宿主机IP>:/var/lib/libvirt/images/
# 方式2:直接从宿主机下载
wget https://mirror.stream.centos.org/7/isos/x86_64/CentOS-7-x86_64-Minimal.iso -O /var/lib/libvirt/images/CentOS-7.iso
确保 ISO 文件有读权限:
chmod 644 /var/lib/libvirt/images/*.iso
2️⃣ 定义 ISO 文件所在目录为存储池(如果还没定义)
如果 /var/lib/libvirt/images 不是存储池,可用:
virsh pool-define-as iso-pool dir - - - - "/var/lib/libvirt/images"
virsh pool-build iso-pool
virsh pool-start iso-pool
virsh pool-autostart iso-pool
3️⃣ 让 WebVirtCloud 识别新 ISO
在 WebVirtCloud 界面:
-
打开左侧菜单 Host → Storage Pools
-
选中你定义的存储池(如
default或iso-pool) -
点击右上角 Refresh(刷新)
-
然后点击进入该池,你会看到上传的 ISO 文件列表。
4️⃣ 在虚拟机中挂载 ISO 文件
在 WebVirtCloud 界面:
-
进入你的虚拟机 → CD-ROM 选项卡
-
选择 “Attach ISO”
-
从列表中选中你上传的 ISO 文件
-
点击 Connect / Attach
这时虚拟机的 CD-ROM 就加载了该 ISO。
5️⃣ 从 ISO 启动虚拟机
在虚拟机界面 → Boot Options
-
把 CD-ROM 调整为第一个启动项(在 WebVirtCloud 界面中可以拖动)
-
保存后启动虚拟机,即可从 ISO 安装系统。
🧩 二、WebVirtCloud 直接上传(如果开启了上传功能)
如果 WebVirtCloud 配置了上传权限(部分版本默认关闭),可以直接在:
Host → Storage Pools → 选中 default → Files
看到右上角有 “Upload ISO” 按钮,选择本地 ISO 文件上传。
如果没有这个按钮,可以在 settings.py 中启用:
UPLOAD_ENABLED = True
然后重启 WebVirtCloud 服务(或 supervisor)。
✅ 验证
查看 ISO 是否被虚拟机挂载:
virsh domblklist <虚拟机名>
输出示例:
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/ubuntu.qcow2
hdc /var/lib/libvirt/images/CentOS-7.iso
说明 ISO 已正确挂载。
是否希望我帮你写一个“一键上传 + 挂载 ISO”的命令脚本?
比如你输入 ISO 路径和虚拟机名,它自动完成 virsh 操作并刷新 WebVirtCloud。
非常好 👍,你提到的:
<input type='keyboard' bus='default'/>
是导致你报错的 根本原因之一。
✅ 是的,这一行需要修改。
你应该把它改成宿主机支持的输入总线类型。
在大多数情况下(尤其是 KVM/QEMU 的默认虚拟机),应该改为:
<input type='keyboard' bus='ps2'/>
或者,如果你的虚拟机配置里主要用 USB 设备,也可以:
<input type='keyboard' bus='usb'/>
🔧 修改步骤
-
导出虚拟机配置:
virsh dumpxml <虚拟机名> > /tmp/vm.xml -
编辑:
vi /tmp/vm.xml -
找到:
<input type='keyboard' bus='default'/>修改为:
<input type='keyboard' bus='ps2'/> -
如果有:
<input type='tablet' bus='default'/>也改成:
<input type='tablet' bus='usb'/> -
重新定义虚拟机:
virsh define /tmp/vm.xml -
启动虚拟机:
virsh start <虚拟机名>
✅ 总结
| 原配置 | 修改后推荐 |
|---|---|
<input type='keyboard' bus='default'/> |
<input type='keyboard' bus='ps2'/> |
<input type='tablet' bus='default'/> |
<input type='tablet' bus='usb'/> |
如果你执行:
virsh capabilities | grep input -A2
看到有 ps2、usb 类型,那这两个选项都没问题。
修改完这个 XML 后,虚拟机即可正常启动,不会再出现 unknown input bus type 'default' 错误。
远程桌面实现方案xrdp
你这台机器运行的是 Kylin V10/V11(基于 RHEL8),系统源的兼容性有点特殊,EPEL 源里 xrdp 依赖的 xorgxrdp 模块和你当前的 Xorg ABI 版本不匹配(报错的关键信息是:xserver-abi(videodrv-24))。
这种情况很常见,因为银河麒麟(尤其是 V11)对 EPEL 并不完全兼容。
下面我给你几种可行的解决方案:
✅ 方案 1:仅安装 xrdp,不装 xorgxrdp(最简单)
Kylin 默认带桌面环境(如 UKUI),xrdp 可以直接用系统自带的 Xorg 会话,无需 xorgxrdp。
dnf install -y xrdp --nobest --skip-broken
安装完成后:
systemctl enable xrdp --now
firewall-cmd --permanent --add-port=3389/tcp
firewall-cmd --reload
然后在 Windows 上用 “远程桌面连接(mstsc)” 输入服务器 IP 即可登录(默认端口 3389)。
⚠️ 用户要使用系统用户(如 root 或普通用户),如果登录闪退,可编辑
/etc/xrdp/startwm.sh:
vi /etc/xrdp/startwm.sh
在最后添加:
exec /usr/bin/startukui
(或根据桌面环境换成 exec /usr/bin/startlxde、exec /usr/bin/startxfce4)
✅ 方案 2:使用 Kylin 官方提供的 xrdp 包(推荐)
银河麒麟官方源其实已经内置了 xrdp 包,只是有时没启用。
先搜索看看:
dnf search xrdp
如果能看到:
xrdp.x86_64 : Remote Desktop Protocol (RDP) server
直接安装:
dnf install -y xrdp
systemctl enable xrdp --now
✅ 方案 3:手动构建或使用第三方 RPM 包
如果你需要特定版本(例如 EPEL 的不兼容),可以下载兼容的 RPM:
cd /tmp
wget https://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/x/xrdp-0.9.21-1.el8.x86_64.rpm
dnf install -y ./xrdp-0.9.21-1.el8.x86_64.rpm
如果提示缺少依赖,可以加上
--skip-broken或下载依赖包一并安装。
✅ 验证运行
安装完后,执行以下命令确保运行正常:
systemctl status xrdp
ss -tnlp | grep 3389
输出示例:
LISTEN 0 50 *:3389 *:* users:(("xrdp",pid=1234,fd=3))
此时可在 Windows 上用远程桌面连接输入:
服务器IP:3389
即可。
如果你贴一下以下命令的输出,我可以帮你判断当前环境最适合哪种方案👇
cat /etc/kylin-release
dnf repolist
很好!找到了 `novncd` 的位置:`/opt/webvirtcloud/console/novncd`
现在我们来创建 systemd 服务并启动它。
---
### 解决方案
#### 第1步:检查 novncd 是否可执行
```bash
# 检查文件权限
ls -la /opt/webvirtcloud/console/novncd
# 如果没有执行权限,添加它
sudo chmod +x /opt/webvirtcloud/console/novncd
# 检查是否依赖 Python
file /opt/webvirtcloud/console/novncd
head -n 5 /opt/webvirtcloud/console/novncd
```
#### 第2步:创建 systemd 服务文件
基于找到的路径创建服务文件:
```bash
sudo vi /etc/systemd/system/novncd.service
```
添加以下内容:
```ini
[Unit]
Description=WebVirtCloud NoVNC Proxy Server
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/webvirtcloud
ExecStart=/opt/webvirtcloud/console/novncd
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
#### 第3步:启用并启动 novncd 服务
```bash
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动 novncd 服务
sudo systemctl start novncd
# 设置开机自启
sudo systemctl enable novncd
# 检查服务状态
sudo systemctl status novncd
```
#### 第4步:检查服务是否正常运行
```bash
# 检查进程
ps aux | grep novncd
# 检查端口监听(novncd 默认监听 6080 端口)
netstat -tlnp | grep 6080
ss -tlnp | grep 6080
# 查看服务日志
sudo journalctl -u novncd -f
```
---
### 如果服务启动失败,进行故障排除
#### 检查依赖项
```bash
# 检查 Python 环境
cd /opt/webvirtcloud
python3 -c "import django; print('Django OK')"
python3 -c "from console import novnc; print('novnc module OK')"
# 检查 requirements
if [ -f "/opt/webvirtcloud/requirements.txt" ]; then
echo "检查依赖包..."
pip3 list | grep -E "(websockify|django)"
fi
```
#### 手动测试 novncd
```bash
# 切换到目录
cd /opt/webvirtcloud
# 手动启动 novncd 进行测试
/opt/webvirtcloud/console/novncd
# 或者在后台启动
/opt/webvirtcloud/console/novncd &
```
#### 如果手动启动有错误,可能需要安装依赖
```bash
# 安装可能的依赖
sudo pip3 install websockify
# 或者安装所有 requirements
if [ -f "/opt/webvirtcloud/requirements.txt" ]; then
sudo pip3 install -r /opt/webvirtcloud/requirements.txt
fi
```
---
### 配置 WebVirtCloud
确保 WebVirtCloud 配置正确指向 novncd:
检查 WebVirtCloud 配置文件:
```bash
# 查找配置文件
find /opt/webvirtcloud -name "settings.py" -o -name "*.conf" | grep -v __pycache__
# 常见的配置路径
ls -la /opt/webvirtcloud/webvirtcloud/
```
在配置文件中应该有这样的设置:
```python
# 在 settings.py 或配置文件中
NOVNC_HOST = 'localhost' # 或您的服务器IP
NOVNC_PORT = 6080
```
---
### 测试连接
在 novncd 服务运行后,测试连接:
```bash
# 检查端口是否开放
curl -I http://localhost:6080/
# 使用 telnet 测试
telnet localhost 6080
# 或者使用 nc
nc -zv localhost 6080
```
---
### 完整的故障排除流程
如果上述步骤还有问题,请按顺序执行:
```bash
# 1. 停止可能运行的服务
sudo pkill -f novncd
# 2. 检查并安装依赖
sudo pip3 install websockify
# 3. 设置正确的权限
sudo chmod +x /opt/webvirtcloud/console/novncd
# 4. 手动测试运行
cd /opt/webvirtcloud
/opt/webvirtcloud/console/novncd
# 5. 如果手动运行成功,Ctrl+C 停止,然后创建服务
sudo systemctl daemon-reload
sudo systemctl start novncd
sudo systemctl status novncd
# 6. 检查防火墙
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=6080/tcp --permanent
sudo firewall-cmd --reload
```
请按照这些步骤操作,然后在每个步骤后告诉我输出结果,这样我可以帮您进一步诊断问题。
太好了!`novncd` 服务现在已经成功运行了:
- ✅ **服务状态**: `active (running)`
- ✅ **进程运行**: PID 30720
- ✅ **端口监听**: `0.0.0.0:6080` 正常监听
- ✅ **开机自启**: 已启用
现在 `novncd` 服务已经正常运行,但 VNC 连接可能仍然有问题。让我们继续排查其他可能的环节。
---
### 下一步排查
#### 第1步:检查虚拟机VNC配置
虽然 `virsh vncdisplay 11` 显示 `:0`,但我们还需要确认VNC配置是否正确:
```bash
# 查看虚拟机的完整VNC配置
virsh dumpxml 11 | grep -A 10 -B 5 "<graphics"
# 或者查看完整的XML配置
virsh dumpxml 11 > /tmp/vm-11.xml
cat /tmp/vm-11.xml | grep -A 10 -B 5 "graphics"
```
**关键检查点:**
- 确认 `<graphics>` 标签中有 `listen='0.0.0.0'`
- 确认没有设置密码导致连接问题
#### 第2步:检查防火墙
确保 VNC 相关端口都开放:
```bash
# 检查防火墙状态(如果是firewalld)
sudo firewall-cmd --list-all
# 开放必要的端口
sudo firewall-cmd --add-port=6080/tcp --permanent
sudo firewall-cmd --add-port=5900-5959/tcp --permanent
sudo firewall-cmd --reload
# 如果是iptables,检查规则
sudo iptables -L -n | grep -E "(6080|5900)"
```
#### 第3步:测试VNC端口连通性
```bash
# 检查虚拟机VNC端口是否可达(:0 对应端口5900)
netstat -tlnp | grep 5900
# 测试本地连接
telnet localhost 5900
# 如果5900端口没有监听,检查其他可能的端口
netstat -tlnp | grep -E ":(59[0-9][0-9])"
```
#### 第4步:检查WebVirtCloud配置
确认WebVirtCloud正确配置了novncd连接:
```bash
# 查找WebVirtCloud配置文件
find /opt/webvirtcloud -name "settings.py" -o -name "*.py" | xargs grep -l "NOVNC\|novnc" | grep -v __pycache__
# 检查常见的配置文件
ls -la /opt/webvirtcloud/webvirtcloud/settings.py
```
在配置文件中应该有这样的设置:
```python
NOVNC_HOST = 'localhost' # 或者您的服务器IP
NOVNC_PORT = 6080
```
#### 第5步:测试novncd到虚拟机VNC的连接
```bash
# 使用websocat或其他工具测试novncd代理
curl -I http://localhost:6080/
# 或者使用wget测试
wget -O- http://localhost:6080/ 2>&1 | head -20
```
#### 第6步:检查SELinux状态
```bash
# 检查SELinux是否启用
getenforce
# 如果是Enforcing模式,尝试临时禁用测试
sudo setenforce 0
# 然后测试VNC连接,如果成功,说明是SELinux问题
```
---
### 快速诊断命令
请运行以下命令并分享输出:
```bash
# 1. 检查虚拟机VNC配置详情
virsh dumpxml 11 | grep -A 10 "<graphics"
# 2. 检查5900端口状态
netstat -tlnp | grep 5900
# 3. 检查防火墙规则
sudo firewall-cmd --list-all 2>/dev/null || sudo iptables -L -n | head -20
# 4. 测试novncd服务响应
curl -s http://localhost:6080/ | head -5
# 5. 检查SELinux
getenforce
```
---
### 如果以上都正常但仍然连接失败
尝试重启相关服务:
```bash
# 重启novncd服务
sudo systemctl restart novncd
# 重启WebVirtCloud服务(如果有)
sudo systemctl restart webvirtcloud # 或者gunicorn、nginx等
# 重启libvirtd服务
sudo systemctl restart libvirtd
```
现在 `novncd` 服务已经正常运行,问题很可能出现在:
1. **虚拟机VNC配置**(特别是listen地址)
2. **防火墙阻止了端口访问**
3. **WebVirtCloud配置**中的novncd地址设置
4. **SELinux策略**
请运行上面的诊断命令,我会根据输出帮您进一步定位问题。
No Comments