如何远程在无图形界面的服务器上通过 X11 转发渲染图形
在没有图形界面的服务器上进行图形渲染时,通过 X11 转发可以将远程服务器的图形界面渲染到本地机器上。本文将介绍如何通过配置 X11 转发,在 PyCharm 中运行远程代码并通过本地显示渲染结果。
设备要求
步骤概览
1. 在 Windows 主机上安装 VcXsrv
1.1 下载并安装 VcXsrv
下载地址:https://sourceforge.net/projects/vcxsrv/ 点击Download即可下载
1.2 VcXsrv安装
这里勾选桌面快捷方式,方便使用。 这里选着一个安装文件,点击install安装。
1.3 运行 XLaunch
安装好VcXsrv之后,桌面会有一个XLaunch的图标,双击打开。 打开之后,出现Display settings的界面,这是一个x11 server配置的设置。这里的Display number选着默认的-1就行,这是把server端口号设置为0.0。
接下来直接下一页。
这里需要勾选第三个Disable access control。这个意思是接受所有x11的转发请求,这里看个人情况,有些设备不勾选也能收到,本人测试自己的设备不勾选接收不到,所以建议勾选。
最后直接完成即可开启X server服务,电脑右下角会出现XLaunch的图标,鼠标放上面会显示端口号。如下图所示,说明X server成功开启了。Save configuration是保存当前的配置,下次开启可以直接使用保存的选项。
VcXsrv安装、配置完成。(参考博客:https://blog.csdn.net/qq_39446635/article/details/132466146)
2. 开启Windows防火墙、获取IP地址
2.1 当 Windows 防火墙弹出提示时,允许 VcXsrv 访问所有网络。
如果没有弹出提示,手动打开: 控制面板 -> Windows Defender 防火墙 -> 允许的应用 找到 VcXsrv windows xserver,勾选 公用和专用网络
2.2 获取IP地址
控制行ipconfig获取Windows获取IP地址,假设是:192.168.1.100。
2.3 检查 X Server 是否启动
任务栏右下角应该有一个 X 图标
运行 PowerShell,输入:
netstat -an | findstr 6000
如果输出包含0.0.0.0:6000,说明 X Server 正在运行。
3. 配置远程服务器支持 X11 转发
首先,需要确保远程服务器支持 X11 转发。
3.1 安装必要的包
安装 xauth 和 x11-utils
sudo apt update
sudo apt install -y xauth x11-utils
在远程服务器上安装 mesa-utils,它们用于支持图形渲染:
sudo apt update
sudo apt install mesa-utils
配置环境变量 在服务器终端运行:
export DISPLAY=10.12.190.136:0.0 # 设置 Windows IP 作为 X11 目标
export LIBGL_ALWAYS_INDIRECT=1 # 让 OpenGL 走 X11
export MESA_GL_VERSION_OVERRIDE=3.3 #强制指定 OpenGL 的版本(根据具体情况配置,或者不配置默认)
3.2 测试 X11 是否正常
在服务器上运行:
xeyes
如果 Windows 上弹出一个 眼睛跟随鼠标的窗口,说明 X11 配置成功。 然后再运行:
glxgears
如果出现 旋转的 3D 齿轮,说明 OpenGL 也正常。
4 设置 DISPLAY 环境变量,指向本地机器
在代码文件里面加入以下内容:
os.environ["DISPLAY"] = "xxx" # 将这里的 IP 地址替换为你本地机器的 IP
在服务器上执行echo $DISPLAY //获取参数信息获取IP地址:
5 运行渲染
import gymnasium as gym
import mani_skill.envs
env = gym.make(
"PickCube-v1",
num_envs=1,
obs_mode="state",
control_mode="pd_ee_delta_pose",
render_mode="human"
)
print("Observation space", env.observation_space)
print("Action space", env.action_space)
obs, _ = env.reset(seed=0)
done = False
while not done:
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
env.render() # 渲染并显示图形
env.close()
总结
通过这种方式,你可以在没有图形界面的服务器上渲染图形并通过本地机器显示,帮助你进行远程开发和调试。
评论前必须登录!
注册