# 银河麒麟高级服务器版V11+KVM+Libvirt+WebVirtCloud+OpenStack部署

非常好的选择 👍  
您要实现的目标是：  
在 **银河麒麟高级服务器版V10（Kylin V10）** 上，构建一个完整的虚拟化管理平台，包含：

- **KVM**：提供虚拟化能力（基于CPU硬件虚拟化）
- **Libvirt**：提供虚拟机管理接口
- **WebVirtCloud**：提供Web管理界面
- **OpenStack（可选）**：提供私有云级别的资源调度与自服务管理

下面给出一份 **详细、可直接执行的部署文档（生产可用）**，默认系统为 Kylin V10 x86\_64 / aarch64，已启用 yum 或 dnf 源。

---

## 🚀 一、环境准备

### 1. 检查CPU是否支持虚拟化

```bash
egrep -c '(vmx|svm)' /proc/cpuinfo

```

返回值 &gt; 0 表示支持。

### 2. 确保内核模块支持KVM

```bash
lsmod | grep kvm

```

若未加载，则手动加载：

```bash
modprobe kvm
modprobe kvm_intel   # Intel
modprobe kvm_amd     # AMD

```

### 3. 启用桥接网络（推荐虚拟机可直接联网）

创建网桥配置文件 `/etc/sysconfig/network-scripts/ifcfg-br0`：

```bash
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`）：

```bash
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
```

然后执行：

```bash
systemctl restart network
实际该命令无效，reboot或其他方法
```

---

## 🧩 二、安装KVM + Libvirt + QEMU

```bash
yum install -y qemu-kvm qemu-img virt-manager libvirt python3-libvirt libvirt-client bridge-utils virt-install

```

启用服务：

```bash
systemctl enable libvirtd --now
systemctl status libvirtd

```

验证：

```bash
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. 安装依赖

```bash
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源码

```bash
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依赖

```bash
yum install libvirt-devel gcc python3-devel openldap-devel

pip3 install -r conf/requirements.txt

```

### 4. 初始化数据库和配置

```bash
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`

```bash
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

```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;
    }
}

```

重启服务：

```bash
systemctl enable nginx --now

```

---

## 🧰 五、配置Supervisor守护WebVirtCloud

如果系统没有 `/etc/supervisord.conf`，可以创建：

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-sudo-vi-%2Fetc%2Fsupervi"><div class="sticky top-9">  
</div><div class="overflow-y-auto p-4" dir="ltr">`sudo vi /etc/supervisord.conf `</div></div>内容示例：

```
[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`

```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

```

启用并启动：

```bash
systemctl enable supervisord --now

supervisorctl restart webvirtcloud
```

验证：

```bash
supervisorctl status

```

---

## 🖥 六、配置WebVirtCloud连接KVM主机

1. 登录WebVirtCloud后台（`http://<服务器IP>`）
2. “Compute &gt; Add Connection”
3. 填写：
    
    
    - **Label**: KVM-Host
    - **Hostname/IP**: `127.0.0.1`
    - **Connection type**: SSH
    - **Login user**: `root` 或管理用户
4. 确保 `root` 用户可以无密码SSH到本机：
    
    ```bash
    ssh-keygen -t rsa
    ssh-copy-id root@127.0.0.1
    
    ```
5. 连接成功后，即可在Web界面创建和管理虚拟机。

---

## ☁️ 七、（可选）安装 OpenStack 实现云平台管理

> 如果您需要将虚拟化扩展为“云平台”，可以部署轻量级 OpenStack All-in-One。

### 1. 安装 DevStack（快速体验）

```bash
cd /opt
git clone https://opendev.org/openstack/devstack
cd devstack

```

创建配置文件 `local.conf`：

```bash
[[local|localrc]]
ADMIN_PASSWORD=admin
DATABASE_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
HOST_IP=192.168.1.100

```

启动安装：

```bash
./stack.sh

```

安装完成后访问：

```
http://192.168.1.100/dashboard

```

默认用户：`admin` 密码：`admin`

---

## 🧾 八、验证与维护

### 验证虚拟化运行状态

```bash
virsh list

```

### 查看libvirt网络和存储池

```bash
virsh net-list
virsh pool-list

```

### 检查服务状态

```bash
systemctl status libvirtd
systemctl status nginx
systemctl status supervisord

```

---

## ✅ 部署总结

<table id="bkmrk-%E6%A8%A1%E5%9D%97-%E5%8A%9F%E8%83%BD-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%8F%A3-%E7%AE%A1%E7%90%86%E6%96%B9%E5%BC%8F-kvm-"><thead><tr><th>模块</th><th>功能</th><th>服务端口</th><th>管理方式</th></tr></thead><tbody><tr><td>KVM</td><td>提供虚拟化能力</td><td>-</td><td>命令行/Libvirt</td></tr><tr><td>Libvirt</td><td>虚拟机管理接口</td><td>16509</td><td>virsh/virt-manager</td></tr><tr><td>WebVirtCloud</td><td>Web虚拟机管理</td><td>80/8000</td><td>浏览器</td></tr><tr><td>OpenStack</td><td>云计算管理平台</td><td>80/5000/8774 等</td><td>Web仪表盘 Horizon</td></tr></tbody></table>

---

## 🧭 建议实践路线

<table id="bkmrk-%E7%9B%AE%E6%A0%87-%E6%8E%A8%E8%8D%90%E6%96%B9%E6%A1%88-%E8%BD%BB%E9%87%8F%E8%99%9A%E6%8B%9F%E5%8C%96%E7%8E%AF%E5%A2%83-kvm-"><thead><tr><th>目标</th><th>推荐方案</th></tr></thead><tbody><tr><td>轻量虚拟化环境</td><td>KVM + Virt-Manager</td></tr><tr><td>Web管理多节点</td><td>WebVirtCloud</td></tr><tr><td>构建私有云平台</td><td>OpenStack on KVM</td></tr><tr><td>高级调度与计费</td><td>OpenStack + Ceph</td></tr></tbody></table>

---

是否希望我为您输出一份 **可直接在Kylin V10执行的 Shell 自动化安装脚本（含Nginx+WebVirtCloud+Libvirt 一键部署）**？  
那样您可以直接运行即可完成全部环境配置。

你现在在 WebVirtCloud 创建虚拟机实例时，提示：

```
You haven't defined any storage pools

```

这是因为 **Libvirt 还没有配置任何存储池**，WebVirtCloud 依赖存储池来存放虚拟机磁盘镜像。

---

### 1️⃣ 查看现有存储池

在服务器上执行：

```bash
sudo virsh pool-list --all

```

输出可能类似：

```
 Name                 State      Autostart
------------------------------------------------
 default              inactive   no

```

如果没有存储池或状态为 `inactive`，就需要创建或激活。

---

### 2️⃣ 激活默认存储池（如果存在）

```bash
sudo virsh pool-start default
sudo virsh pool-autostart default

```

---

### 3️⃣ 创建新的存储池（如果没有）

假设你希望在 `/var/lib/libvirt/images` 存储虚拟机磁盘：

```bash
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 刷新

1. 登录 WebVirtCloud
2. 打开 **Host → Storage Pools**
3. 应该能看到你刚创建或激活的存储池
4. 现在就可以创建虚拟机实例了

---

💡 小提示：

- 存储池必须 **可写，并且 WebVirtCloud 运行用户有权限访问**
- 通常使用 `root` 或者 `libvirt` 用户运行 WebVirtCloud

---

非常好 👍 你已经能在 WebVirtCloud 里创建虚拟机了。  
现在要“上传 ISO 文件并挂载到虚拟机 CD-ROM”，可以有两种常见方式（命令行或 WebVirtCloud 界面）。我详细说明一下：

---

## 🧩 一、命令行方式（推荐）

这种方法最直接、最稳定，尤其是初次配置时。

### 1️⃣ 把 ISO 文件上传到宿主机存储路径

假设你的默认存储池是 `/var/lib/libvirt/images`：

```bash
cd /var/lib/libvirt/images

```

然后上传 ISO 文件（有多种方式）：

```bash
# 方式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 文件有读权限：

```bash
chmod 644 /var/lib/libvirt/images/*.iso

```

---

### 2️⃣ 定义 ISO 文件所在目录为存储池（如果还没定义）

如果 `/var/lib/libvirt/images` 不是存储池，可用：

```bash
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` 中启用：

```python
UPLOAD_ENABLED = True

```

然后重启 WebVirtCloud 服务（或 supervisor）。

---

## ✅ 验证

查看 ISO 是否被虚拟机挂载：

```bash
virsh domblklist <虚拟机名>

```

输出示例：

```
Target   Source
------------------------------------------------
vda      /var/lib/libvirt/images/ubuntu.qcow2
hdc      /var/lib/libvirt/images/CentOS-7.iso

```

说明 ISO 已正确挂载。

---

是否希望我帮你写一个“一键上传 + 挂载 ISO”的命令脚本？  
比如你输入 ISO 路径和虚拟机名，它自动完成 virsh 操作并刷新 WebVirtCloud。

非常好 👍，你提到的：

```xml
<input type='keyboard' bus='default'/>

```

是导致你报错的 **根本原因之一**。

---

## ✅ 是的，这一行需要修改。

你应该把它改成宿主机支持的输入总线类型。  
在大多数情况下（尤其是 KVM/QEMU 的默认虚拟机），应该改为：

```xml
<input type='keyboard' bus='ps2'/>

```

或者，如果你的虚拟机配置里主要用 USB 设备，也可以：

```xml
<input type='keyboard' bus='usb'/>

```

---

## 🔧 修改步骤

1. 导出虚拟机配置：
    
    ```bash
    virsh dumpxml <虚拟机名> > /tmp/vm.xml
    
    ```
2. 编辑：
    
    ```bash
    vi /tmp/vm.xml
    
    ```
3. 找到：
    
    ```xml
    <input type='keyboard' bus='default'/>
    
    ```
    
    修改为：
    
    ```xml
    <input type='keyboard' bus='ps2'/>
    
    ```
4. 如果有：
    
    ```xml
    <input type='tablet' bus='default'/>
    
    ```
    
    也改成：
    
    ```xml
    <input type='tablet' bus='usb'/>
    
    ```
5. 重新定义虚拟机：
    
    ```bash
    virsh define /tmp/vm.xml
    
    ```
6. 启动虚拟机：
    
    ```bash
    virsh start <虚拟机名>
    
    ```

---

## ✅ 总结

<table id="bkmrk-%E5%8E%9F%E9%85%8D%E7%BD%AE-%E4%BF%AE%E6%94%B9%E5%90%8E%E6%8E%A8%E8%8D%90-%3Cinput-typ"><thead><tr><th>原配置</th><th>修改后推荐</th></tr></thead><tbody><tr><td>`<input type='keyboard' bus='default'/>`</td><td>`<input type='keyboard' bus='ps2'/>`</td></tr><tr><td>`<input type='tablet' bus='default'/>`</td><td>`<input type='tablet' bus='usb'/>`</td></tr></tbody></table>

---

如果你执行：

```bash
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`。

```bash
dnf install -y xrdp --nobest --skip-broken

```

安装完成后：

```bash
systemctl enable xrdp --now
firewall-cmd --permanent --add-port=3389/tcp
firewall-cmd --reload

```

然后在 Windows 上用 “远程桌面连接（mstsc）” 输入服务器 IP 即可登录（默认端口 3389）。

> ⚠️ 用户要使用系统用户（如 root 或普通用户），如果登录闪退，可编辑 `/etc/xrdp/startwm.sh`：

```bash
vi /etc/xrdp/startwm.sh

```

在最后添加：

```bash
exec /usr/bin/startukui

```

（或根据桌面环境换成 `exec /usr/bin/startlxde`、`exec /usr/bin/startxfce4`）

---

### ✅ 方案 2：使用 Kylin 官方提供的 xrdp 包（推荐）

银河麒麟官方源其实已经内置了 `xrdp` 包，只是有时没启用。

先搜索看看：

```bash
dnf search xrdp

```

如果能看到：

```
xrdp.x86_64 : Remote Desktop Protocol (RDP) server

```

直接安装：

```bash
dnf install -y xrdp
systemctl enable xrdp --now

```

---

### ✅ 方案 3：手动构建或使用第三方 RPM 包

如果你需要特定版本（例如 EPEL 的不兼容），可以下载兼容的 RPM：

```bash
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` 或下载依赖包一并安装。

---

### ✅ 验证运行

安装完后，执行以下命令确保运行正常：

```bash
systemctl status xrdp
ss -tnlp | grep 3389

```

输出示例：

```
LISTEN 0 50 *:3389 *:* users:(("xrdp",pid=1234,fd=3))

```

此时可在 Windows 上用远程桌面连接输入：

```
服务器IP:3389

```

即可。

---

如果你贴一下以下命令的输出，我可以帮你判断当前环境最适合哪种方案👇

```bash
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 &amp;  
```

\#### 如果手动启动有错误，可能需要安装依赖

```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 "&lt;graphics"

\# 或者查看完整的XML配置  
virsh dumpxml 11 &gt; /tmp/vm-11.xml  
cat /tmp/vm-11.xml | grep -A 10 -B 5 "graphics"  
```

\*\*关键检查点：\*\*  
\- 确认 `&lt;graphics&gt;` 标签中有 `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&gt;&amp;1 | head -20  
```

\#### 第6步：检查SELinux状态

```bash  
\# 检查SELinux是否启用  
getenforce

\# 如果是Enforcing模式，尝试临时禁用测试  
sudo setenforce 0

\# 然后测试VNC连接，如果成功，说明是SELinux问题  
```

\---

\### 快速诊断命令

请运行以下命令并分享输出：

```bash  
\# 1. 检查虚拟机VNC配置详情  
virsh dumpxml 11 | grep -A 10 "&lt;graphics"

\# 2. 检查5900端口状态  
netstat -tlnp | grep 5900

\# 3. 检查防火墙规则  
sudo firewall-cmd --list-all 2&gt;/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策略\*\*

请运行上面的诊断命令，我会根据输出帮您进一步定位问题。