Windows WSL2 Ubuntu 搭建 Xvfb 虚拟桌面环境,完美支持多 Agent 隔离

不装双系统、不碰虚拟机,7 步在 Windows 上跑起 Linux 虚拟桌面

gorkbot技术实现方法也是这样,不同会话不同虚拟桌面

前言

做 AI Agent 开发的朋友应该都遇到过这个痛点:Agent 需要操作浏览器、点击 GUI 界面,但你又不想让它动你的真实桌面------鼠标乱飘、窗口被抢、浏览器登录态被污染......太折磨了。

有一个很成熟的方案:在 Linux 上通过 Xvfb(虚拟帧缓冲) 创建无头虚拟桌面,每个 Agent 分配一个独立的桌面环境,完全隔离互不干扰。

但问题来了:我主力机是 Windows,难道为了测试还要装双系统或虚拟机吗?

答案是:不用。Windows 11 + WSL2 + Ubuntu 就能完美跑通这个方案。

本文将用 7 个步骤,带你从零开始在 Windows 上搭建一套完整的 Xvfb 虚拟桌面环境,并支持多 Agent 隔离。所有操作均为复制粘贴级别,实测可用。


一、方案架构

最终搭建出来的结构是这样的:

复制代码
Windows 11
└── WSL2
    └── Ubuntu
        ├── Xvfb :1          # 虚拟显示器 1
        │   └── Openbox      # 轻量窗口管理器
        │       └── Chrome   # Agent 1 浏览器
        ├── Xvfb :2          # 虚拟显示器 2
        │   └── Openbox
        │       └── Chrome   # Agent 2 浏览器
        └── Xvfb :3
            └── Openbox
                └── Chrome   # Agent 3 浏览器

每个 Agent 拥有自己独立的虚拟桌面(:1:2:3),通过 VNC 可以分别查看和控制。Agent 在各自的桌面里操作浏览器,完全不会影响你 Windows 上的真实鼠标、键盘和浏览器。


二、环境准备

2.1 系统要求

  • Windows 10/11(版本 1903 或更高)
  • 已开启 WSL2 功能
  • 建议 Ubuntu 22.04 LTS

2.2 安装 WSL2 + Ubuntu

管理员身份打开 PowerShell,执行:

powershell 复制代码
wsl --install -d Ubuntu

安装完成后重启 Windows。重启后打开开始菜单中的 "Ubuntu",首次启动会提示设置用户名和密码。

验证 WSL2 是否生效:

bash 复制代码
wsl -l -v

确保版本显示为 2


三、七步搭建虚拟桌面

第 1 步:安装核心组件

打开 Ubuntu 终端,执行:

bash 复制代码
sudo apt update && sudo apt install -y xvfb openbox x11vnc
  • Xvfb:虚拟帧缓冲 X 服务器,不依赖物理显示器的"虚拟屏幕"
  • Openbox:轻量级窗口管理器,给虚拟桌面提供窗口管理能力
  • x11vnc:VNC 服务端,让你能从 Windows 远程查看虚拟桌面

如果后续需要浏览器,可以一并安装 Chrome:

bash 复制代码
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
sudo apt update && sudo apt install -y google-chrome-stable

第 2 步:启动 Xvfb 虚拟显示器

bash 复制代码
Xvfb :1 -screen 0 1280x800x24 -ac &
sleep 2
  • :1:显示器编号,可以理解为"虚拟屏幕 1 号"
  • 1280x800x24:分辨率与色深
  • -ac:关闭访问控制,方便测试
  • &:后台运行

验证是否启动成功:

bash 复制代码
ps aux | grep Xvfb

应该能看到 Xvfb :1 的进程。

第 3 步:启动 Openbox 窗口管理器

bash 复制代码
DISPLAY=:1 openbox &

这行命令告诉 Openbox:"你的显示器是 :1 号虚拟屏幕"。

第 4 步:启动 x11vnc VNC 服务

bash 复制代码
x11vnc -display :1 -nopw -forever -rfbport 5901 &
  • -display :1:绑定到 :1 号虚拟显示器
  • -nopw:无密码(测试环境用,生产环境建议加密码)
  • -forever:持续运行,不会因为客户端断开而退出
  • -rfbport 5901:VNC 端口 5901

第 5 步:获取 WSL2 IP 地址

WSL2 基于 Hyper-V 轻量级虚拟机,拥有独立的虚拟网络。需要拿到它的 IP 才能做端口转发。

bash 复制代码
ip addr show eth0 | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+'

记下输出的 IP(例如 172.28.112.1)。

第 6 步:Windows 端口转发

以管理员身份 打开 PowerShell,执行(将 <WSL2_IP> 换成上一步得到的 IP):

powershell 复制代码
netsh interface portproxy add v4tov4 listenport=5901 listenaddress=0.0.0.0 connectport=5901 connectaddress=<WSL2_IP>

例如:

powershell 复制代码
netsh interface portproxy add v4tov4 listenport=5901 listenaddress=0.0.0.0 connectport=5901 connectaddress=172.28.112.1

这一步把 WSL2 内部的 5901 端口"映射"到了 Windows 的 5901 端口。

第 7 步:放行 Windows 防火墙

同样在管理员 PowerShell 中执行:

powershell 复制代码
New-NetFirewallRule -DisplayName "WSL VNC 5901" -Direction Inbound -LocalPort 5901 -Protocol TCP -Action Allow

四、从 Windows 查看虚拟桌面

在 Windows 上下载 VNC 客户端(推荐 TigerVNC 或 RealVNC),新建连接:

  • 地址127.0.0.1:5901
  • 密码 :留空(因为用了 -nopw

点击连接,应该能看到一个灰色的 Openbox 桌面,中间有一个 xterm 终端窗口------恭喜,虚拟桌面跑通了!


五、多 Agent 隔离:启动多个虚拟桌面

一套方案的核心价值在于多 Agent 隔离。每个 Agent 拥有独立的虚拟桌面,互不干扰。

依次启动 :2、:3 号桌面:

bash 复制代码
# 启动 :2 号虚拟桌面
Xvfb :2 -screen 0 1280x800x24 -ac &
sleep 2
DISPLAY=:2 openbox &
x11vnc -display :2 -nopw -forever -rfbport 5902 &

# 启动 :3 号虚拟桌面
Xvfb :3 -screen 0 1280x800x24 -ac &
sleep 2
DISPLAY=:3 openbox &
x11vnc -display :3 -nopw -forever -rfbport 5903 &

然后在 Windows 上分别转发 5902、5903 端口:

powershell 复制代码
netsh interface portproxy add v4tov4 listenport=5902 listenaddress=0.0.0.0 connectport=5902 connectaddress=<WSL2_IP>
netsh interface portproxy add v4tov4 listenport=5903 listenaddress=0.0.0.0 connectport=5903 connectaddress=<WSL2_IP>

放行防火墙后,用 VNC 客户端连接 127.0.0.1:5902127.0.0.1:5903,就能看到三个完全隔离的独立桌面。


六、一键启动脚本(强烈推荐)

每次都手动敲一堆命令太麻烦,写成脚本一键启动:

创建 start_desktops.sh

bash 复制代码
#!/bin/bash

# 启动 3 个虚拟桌面
for i in 1 2 3; do
    Xvfb :$i -screen 0 1280x800x24 -ac &
    sleep 2
    DISPLAY=:$i openbox &
    echo "Desktop :$i started"
done

# 启动 VNC 服务
x11vnc -display :1 -nopw -forever -rfbport 5901 &
x11vnc -display :2 -nopw -forever -rfbport 5902 &
x11vnc -display :3 -nopw -forever -rfbport 5903 &

echo "All desktops ready!"
echo "Connect VNC to 127.0.0.1:5901/5902/5903"

赋予执行权限并运行:

bash 复制代码
chmod +x start_desktops.sh
./start_desktops.sh

七、常见问题排障

Q1:VNC 连不上,提示连接拒绝

原因:端口转发失效,WSL2 重启后 IP 会变化。

解决 :重新获取 WSL2 IP(ip addr show eth0),重新执行 netsh interface portproxy 命令。查看当前转发规则:

powershell 复制代码
netsh interface portproxy show all

Q2:x11vnc 报错 "No display"

原因:Xvfb 还没完全启动就运行了 x11vnc。

解决 :在 Xvfb 命令后加 sleep 2 等待一下,或者用 & 后台运行后稍等再执行下一步。

Q3:WSL2 IP 每次重启都变,太麻烦

解决方案 :在 Windows 用户目录下创建 .wslconfig 文件,开启 localhost 转发:

ini 复制代码
[wsl2]
localhostForwarding=true

重启 WSL2 后,部分场景下可以直接用 127.0.0.1 访问,无需每次查 IP。

Q4:Openbox 桌面啥都没有

正常,Openbox 默认就是空白桌面。你可以:

  • 右键点击桌面,弹出 Openbox 菜单
  • 在 xterm 中手动启动程序:DISPLAY=:1 google-chrome --no-sandbox &

八、进阶:Agent 如何操作虚拟桌面?

虚拟桌面搭建好后,AI Agent 可以通过以下方式与之交互:

  1. Playwright/Selenium :设置 DISPLAY=:1 环境变量,浏览器就会在对应的虚拟桌面中启动
  2. 截图与监控 :使用 import -window root(ImageMagick)截取虚拟桌面画面
  3. 键盘鼠标模拟 :使用 xdotool 模拟点击和输入

一个典型的 Agent 启动命令:

bash 复制代码
DISPLAY=:1 google-chrome --no-sandbox --disable-dev-shm-usage &

这样 Agent 的浏览器就跑在 :1 号虚拟桌面里,完全不影响你 Windows 上的真实 Chrome。


九、总结

通过 WSL2 + Ubuntu + Xvfb + Openbox + x11vnc 这套组合,我们在 Windows 上仅用 7 步就搭建了一套完整的虚拟桌面环境:

组件 作用
WSL2 + Ubuntu Windows 上的 Linux 运行环境
Xvfb 虚拟显示器,不依赖物理屏幕
Openbox 轻量级窗口管理器
x11vnc VNC 服务,让 Windows 能看到虚拟桌面
端口转发 打通 WSL2 虚拟网络与 Windows 的通信

这套方案不需要双系统、不需要虚拟机、不影响 Windows 当前桌面,完美适合 AI Agent 的多桌面隔离测试场景。


如果这篇文章帮到了你,欢迎点赞、收藏、转发!有任何问题也可以在评论区留言,我会尽力解答。

相关推荐
大熊背17 分钟前
树莓派 libcamera IPA 框架解析
linux·ipa·isppipeline
Horn Still Sounds26 分钟前
Linux进程间通信:信号、消息队列、共享内存完整笔记
linux·网络·笔记
拂拉氏26 分钟前
【知识讲解】 Linux进程的认识与创建
linux·进程
myy-learn1 小时前
27-进程通信
linux·服务器·网络
按时下班accept1 小时前
ERA5生成驱动LBM模型的数据
linux
高亦真1 小时前
今天是学习嵌入式的第32天
linux·学习·算法
gx23482 小时前
k8spod管理
linux·容器·kubernetes
susplus4 小时前
【linux应用软件编程】进程间的通信方式1【管道&IPC】
linux·进程通信·管道·ipc
AlfredZhao7 小时前
用 crontab 给 LLM 使用量装上“监控眼”
linux