不装双系统、不碰虚拟机,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:5902 和 127.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 可以通过以下方式与之交互:
- Playwright/Selenium :设置
DISPLAY=:1环境变量,浏览器就会在对应的虚拟桌面中启动 - 截图与监控 :使用
import -window root(ImageMagick)截取虚拟桌面画面 - 键盘鼠标模拟 :使用
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 的多桌面隔离测试场景。
如果这篇文章帮到了你,欢迎点赞、收藏、转发!有任何问题也可以在评论区留言,我会尽力解答。
