/lib 中的用户相关包/文件

/lib 中的用户相关包/文件

我已经设置了一台 2 座计算机。我使用计算机的板载显卡 (intel) 启动一台 X11 服务器,并使用专用显卡 (nvidia) 启动另一台 X11 服务器。除了 opengl 之外,一切都运行良好。目前,由于 /lib 中 nvidia 和 intel opengl 软件包的文件存在冲突,因此只有 nvidia-seat 具有 opengl。

有没有办法强制一个用户使用来自不同路径的库?

我发现的每个常规 /lib 都会影响整个系统(ldconfig)。我也考虑过 FUSE,但我担心一般的安全和性能问题。仅当我不必加倍并维护所有文件时,chroot 才可行。如果 unionfs 允许依赖于用户的覆盖,那么它似乎是正确的,但我从来没有搞乱过 unionfs,而且我发现没有任何东西表明它是可能的。

答案1

如果您的程序是动态链接的,那么可以,通过为每个会话定义 LD_LIBRARY_PATH 分别指向具有 intel 和 nvidia 共享库的不同目录,并在 /lib 中仅存储系统默认库。

答案2

接下来的尝试是使用两个独立的 chroot 文件树,其中包含相同的 Xorg 文件树,足以运行两个不同的 Xorg 服务器,并在用户空间中继续使用 LD_LIBRARY_PATH。

为了运行 Xorg,您需要将所有与 Xorg 相关的库和程序放入 chroot 中。这可以使用 debian chroot 等自动工具完成,也可以手动完成。下面是如何手动执行此操作的快速入门(实际上,它对于不久前的一个 musl 系统效果很好):

  • 创建单独的 chroot 目录,例如 /X11/nvidia(和 /X11/intel)。
  • 将 X11 二进制文件和库放入其中,反映旧系统的布局(即,将 Xorg 放入 /X11/nvidia/usr/bin,将 libX*.so* 放入 /X11/nvidia/usr/lib,将 glibc 核心库从 /lib 放入/X11/nvidia/lib - 它们通常以版本号为前缀,因此很容易找到哪个)。
  • 不要忘记 X 服务器所依赖的目录,即 /usr/lib/X11 或 /usr/lib/xorg。它们包含各种设备的模块和驱动程序,当然还有 nvidia/intel 驱动程序部分。
  • 您可能需要 /X11/nvidia/bin/sh 和 /X11/nvidia/sbin/modprobe 等项目。创建必要的目录并将主机中的二进制文件放在那里。
  • 您还需要 /X11/nvidia/tmp、/X11/nvidia/var/lib/xkb 和 /X11/nvidia/var/log。
  • 此时,您可以将/X11/nvidia复制到/X11/intel。
  • 请在适当的位置找到并复制 libglx.so 文件,也许还有其他驱动程序部分。
  • 将挂载 /dev 绑定到每个 /X11/nvidia/dev 和 /X11/intel/dev (之前创建目录),或者您可以稍后使用 strace 工具监控每个设备到底需要什么来尝试复制设备节点
  • 也绑定挂载 /proc 和 /sys。
  • 如果 /etc/X11 中有 X11 配置,请将每个设备的每个配置复制到每个 chroot /etc 目录中。

此时,chroot 的 X11 服务器应该已准备就绪。但许多发行版特定的东西可能会破坏这一点,因为它们强加了一些其他现代依赖项(也许您需要将一些其他守护进程复制并启动到您的 chroot 中)。

客户端配置:只需使用 LD_LIBRARY_PATH 将客户端指向不同的驱动程序库即可。您甚至可以将客户端放入 chroot(这甚至不需要对文件树布局进行太多更改),但您最终可能会镜像系统两次。

即使 X11 套接字丢失,客户端也应该正常连接。这是因为它们在调用 connect() 时使用 X 服务器注册的抽象名称,而不需要现有套接字,这可以在 strace 输出中看到。但如果您的系统需要现有套接字,则还需要绑定 mount /tmp。

作为替代方案,您仍然需要努力跟踪您的 Xorg 服务器,查找加载错误的库并使用 LD_PRELOAD 和 LD_LIBRARY_PATH 指向正​​确的位置。斯特雷斯必须工作作为 root(如果您执行了 sudo -i 或以 root 身份登录),如果没有,那么这肯定是一个错误。

相关内容