Bootstrap

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

问题与解决方案

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

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)
cd  /usr/lib/
sudo mkdir dri
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)

 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

在这里插入图片描述

 vi  ~/.bashrc

在文件中添加如下代码

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

LD_LIBRARY_PATH=/root/miniconda3/lib:$LD_LIBRARY_PATH     
export LD_LIBRARY_PATH

在这里插入图片描述

vi中的基本编辑操作:

  1. 打开文件vi filename

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

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

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

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

  • 进入miniconda3lib目录

    cd ~/miniconda3/lib
    

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

  • 创建备份文件夹

    mkdir backup 
    

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

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

    mv libstd* backup  
    

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

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

    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

    ln -s libstdc++.so.6 libstdc++.so
    

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

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

    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兼容性。

strings ~/miniconda3/lib/libstdc++.so.6.0.19 | grep CXXABI

在这里插入图片描述

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版本号符合需求,避免不兼容问题。

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:

export MUJOCO_GL=egl
;