【libGL error】Autodl云服务器配置ACT的conda虚拟环境生成训练数据时,遇到了libGL相关错误,涉及swrast_dri.so

问题与解决方案

1. libGL error: MESA-LOADER: failed to open iris

bash 复制代码
conda install -c conda-forge libstdcxx-ng

来源suffix _dri

下面的问题是在Autodl云服务器上运行程序是出现的,在Ubuntu笔记本上安装的Anaconda没有出现以下问题。

Autodl云服务器安装的是Miniconda3基础镜像,框架版本conda3,python版本3.10(Ubuntu22.04),Cuda版本11.8。

2. libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
bash 复制代码
cd  /usr/lib/
sudo mkdir dri
bash 复制代码
cd dri
sudo ln -s  /lib/x86_64-linux-gnu/dri/swrast_dri.so    swrast_dri.so

sudo ln -s /lib/x86_64-linux-gnu/dri/swrast_dri.so swrast_dri.so

  • 命令功能ln -s 用于创建一个符号链接(软链接)。
  • 目的 :这个命令将在当前工作目录中创建一个名为 swrast_dri.so 的符号链接,指向 /lib/x86_64-linux-gnu/dri/swrast_dri.so 文件。这样,你可以通过 swrast_dri.so 来访问原始文件,而不必使用完整路径。
  • 注意 :这个命令会在当前目录中创建一个新文件(链接),如果 swrast_dri.so 文件已经存在,则会出错。
3. `GLIBCXX_3.4.30' not found

libGL error: MESA-LOADER: failed to open swrast: /root/miniconda3/envs/act_a1/bin/.../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/lib/x86_64-linux-gnu/libLLVM-15.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)

bash 复制代码
 conda install -c conda-forge gcc
  • conda:调用 Conda 包管理工具。
  • install:安装软件包。
  • -c conda-forge :指定安装源为 conda-forge 频道。conda-forge 是一个提供大量开源软件包的社区驱动频道,通常包含一些官方频道没有的软件包版本。
  • gcc :要安装的软件包名称。在这里是 gcc,即 GNU 编译器集合(GNU Compiler Collection),主要包含 C、C++ 等编程语言的编译器。

conda install -c conda-forge gcc 这个命令的作用是从 conda-forge 频道中安装 gcc 编译器。这样可以确保你在 Conda 环境中获得合适的 GCC 版本,用于编译 C/C++ 程序或安装需要编译的其他软件包。

4. /libstdc++.so.6: version `CXXABI_1.3.8' not found

libGL error: MESA-LOADER: failed to open swrast: /root/miniconda3/envs/act_a1/bin/.../lib/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/lib/dri/swrast_dri.so) (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)

libGL error: failed to load driver: swrast

云服务器安装的是miniconda3

bash 复制代码
 vi  ~/.bashrc

在文件中添加如下代码

(将anaconda3库文件路径添加到系统的库文件路径中)

bash 复制代码
LD_LIBRARY_PATH=/root/miniconda3/lib:$LD_LIBRARY_PATH     
export LD_LIBRARY_PATH

vi中的基本编辑操作:

  1. 打开文件vi filename

  2. 进入插入模式并开始编辑

    • 按下 i 键进入插入模式。
    • 输入或编辑文本内容。
  3. 保存并退出

    • Esc 键退出插入模式,回到命令模式。
    • 输入 :wq ,然后按 Enter 键即可保存并退出。
bash 复制代码
source  ~/.bashrc

用系统的libstdc++库替换miniconda3环境中的库,避免不同版本之间的兼容性问题。这种方法通常用于解决由于不同libstdc++版本引起的兼容问题,尤其在使用一些依赖C++标准库的包时效果显著。

  • 进入miniconda3lib目录

    bash 复制代码
    cd ~/miniconda3/lib

    切换到miniconda3安装目录下的lib文件夹,这是miniconda3环境中存放库文件的地方。

  • 创建备份文件夹

    bash 复制代码
    mkdir backup 

    创建一个名为backup的新文件夹,用于保存当前目录下原有的libstdc++文件,以便需要时可以还原。

  • 将原有的libstdc++文件移动到备份文件夹

    bash 复制代码
    mv libstd* backup  

    将所有以libstd开头的文件(包含libstdc++库文件及其符号链接)移动到backup文件夹中。

  • 从系统目录复制libstdc++.so.6到当前目录

    bash 复制代码
    cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./

    从系统目录(如/usr/lib/x86_64-linux-gnu)复制系统版本的libstdc++.so.6到当前目录下,以便miniconda3环境使用系统的libstdc++库文件。

  • 创建符号链接libstdc++.so指向libstdc++.so.6

    bash 复制代码
    ln -s libstdc++.so.6 libstdc++.so

    创建符号链接libstdc++.so,指向刚复制的libstdc++.so.6,以确保程序能够找到libstdc++库的主要链接文件。

  • 创建符号链接libstdc++.so.6.0.19指向libstdc++.so.6

    bash 复制代码
    ln -s libstdc++.so.6 libstdc++.so.6.0.19

    创建符号链接libstdc++.so.6.0.19,指向libstdc++.so.6,以确保程序在寻找特定版本6.0.19libstdc++时能够正常找到这个库文件。

使用strings命令查看libstdc++.so.6.0.19文件中的字符串,并通过grep筛选出包含CXXABI的行。这一步是为了确认当前库的C++ ABI版本号,与其他依赖库的ABI兼容性。

bash 复制代码
strings ~/miniconda3/lib/libstdc++.so.6.0.19 | grep CXXABI
bash 复制代码
sudo cp ~/miniconda3/lib/libstdc++.so.6.0.19 /root/miniconda3/envs/act_a1/bin/../lib
cd /root/miniconda3/envs/act_a1/bin/../lib
ls
sudo ln -s libstdc++.so.6.0.19  libstdc++.so.6
  • libstdc++.so.6.0.19复制到另一个环境的lib目录

    • sudo cp ~/miniconda3/lib/libstdc++.so.6.0.19 /root/miniconda3/envs/act_a1/bin/../lib
      把刚替换后的libstdc++.so.6.0.19文件复制到act_a1环境的lib目录。
  • 创建libstdc++.so.6的符号链接

    • sudo ln -s libstdc++.so.6.0.19 libstdc++.so.6
      act_a1环境的lib目录中,创建一个符号链接libstdc++.so.6,指向libstdc++.so.6.0.19,确保程序在查找libstdc++.so.6时能找到这个特定的版本。

再次检查C++ ABI版本,确保在act_a1环境中的新库的C++ ABI版本号符合需求,避免不兼容问题。

bash 复制代码
strings /root/miniconda3/envs/act_a1/bin/../lib/libstdc++.so.6 | grep CXXABI
5.在远程服务器或无显示设备的环境中 Mujoco 试图渲染图像时遇到了 gladLoadGL error,并且 GLFW 报告 X11 显示环境变量 DISPLAY 缺失

/root/miniconda3/envs/act_a1/lib/python3.8/site-packages/glfw/init .py:914: GLFWError: (65544) b'X11: The DISPLAY environment variable is missing'

warnings.warn(message, GLFWError)

episode_idx=0

Rollout out EE space scripted policy

/root/miniconda3/envs/act_a1/lib/python3.8/site-packages/glfw/init .py:914: GLFWError: (65537) b'The GLFW library is not initialized'

warnings.warn(message, GLFWError)

使用EGL作为渲染后端

在云服务器上,EGL是一种常见的无屏幕(headless)渲染解决方案,适合在没有物理显示器 的环境中调用GPU 进行渲染。

设置环境变量让MuJoCo等渲染库使用EGL:

bash 复制代码
export MUJOCO_GL=egl
相关推荐
Drscq2 小时前
How to migrate a CentOS 8 to Rocky Linux 8.10
linux·运维·centos
修心光2 小时前
CentOS配置iptables规则并使其永久生效
linux·运维·centos
加载中loading...2 小时前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
安科瑞刘鸿鹏2 小时前
校园建筑用电安全监测装置 电气火灾监测预防设备功能介绍
运维·服务器·网络·嵌入式硬件·安全·能源
是丝豆呀2 小时前
清理pip和conda缓存
缓存·conda·pip
画江湖Test3 小时前
SDK如何测试
服务器·sdk
落落落sss5 小时前
es实现自动补全
大数据·服务器·elasticsearch·搜索引擎·全文检索
大熊程序猿5 小时前
ubuntu 安装k3s
linux·运维·ubuntu
luoqice5 小时前
CentOS 自启动某个应用
linux·运维·服务器