L
O
A
D
I
N
G

Linux非root用户使用.deb文件安装软件包


这两天在服务器上配置google-deepmind/lab这个项目的环境,也是让我非常的头大。这个项目使用bazel作为它的构建程序,构建过程中遇到了bazel版本不匹配(实测需要6.4.0版本,新版的构建结果目录结构与项目指定结构不一致),缺少osmesa库,缺少llvm等各种各样的问题。经过将近三天的奋战,现在项目终于是能跑起来了,所以忙里偷闲一下,在这篇文章里简单记录一点心得。

在构建过程中出现了非常多的问题,包括但不限于:

  • bazel的沙盒环境,会阻止系统环境变量的传递,因此为了读取一些非标准路径下的库和头文件等,需要在构建命令中使用--action_env进行显式传递。

  • 对于一些三方库,即便传递CFLAGS也没有用,需要在WORKSPACE配置中将这些库的路径加入工作区,以SDL2库为示例:

    # WORKSPACE
    new_local_repository(
        name = "sdl_system",
        build_file = "@//bazel:sdl.BUILD",
        path = "/path/to/sdl2",
    )
    
    # sdl.BUILD
    
    # Description:
    #   Build rule for SDL2.
    #   Compiler and linker flags found with `sdl2-config --libs --cflags`.
    
    cc_library(
        name = "sdl2",
        hdrs = glob(["include/SDL2/*.h"]),
        defines = ["_REENTRANT"],
        includes = ["include/SDL2"],
        linkopts = [
            "-L/path/to/sdl2/lib",  # SDL2 库路径
            "-lSDL2",
            ],
        visibility = ["//visibility:public"],
    )
  • bazel run过程中不使用沙盒,因此需要将传入沙盒的环境变量相应地设置在系统中。

  • 沙盒中连不上github等的问题,需要使用科学上网的方法,我这里采用的是v2ray,在Releases · v2fly/v2ray-core (github.com)中下载v2ray的核心,unzip v2ray.zip -d your/path解压到指定目录后,进入安装目录,在config.json中配置outbound,然后在程序所在目录运行./v2ray run启动v2ray。在构建过程中,设置http_proxyhttps_proxy两个环境变量即可在构建中使用代理服务。

除了以上问题之外,令我最头疼的莫过于libosmesa-dev这个软件包的安装过程了。首先尝试使用.deb直接解压,但是发现里面一个关键的动态库libosmesa.so是一个符号链接,但是指向的源文件libosmesa.so.8又不存在,令人非常恼火。因此我又去找到了mesa的源代码,打算进行编译安装,它的编译程序选择的是meson,当然,编译mesa的难度不逊于编译lab,又是缺少一堆这样那样的库,以至于为了编译它我还动手编译了LLVM的源代码。但是最后在编译的过程中依然是找不到LLVM的动态运行依赖,折腾了半天除了练习一堆meson setup/ meson build install --prefix这样的命令之外一无所获。

但是不甘心的我又不愿意放弃,所以我就在另外一台有root权限的服务器上尝试安装libosmesa-dev这个程序包(本来是想直接安装好复制粘贴过去的hh),由于网络问题没能安装上,但是报错信息给出了安装它的所有依赖包。正是这个报错信息给了我灵感,我打算手动执行一遍apt安装软件的过程,于是我又下载了一遍libosmesa-dev这个软件的.deb包,然后问了一下ChatGPT,意外发现了这个包使用ar工具解压之后,会包含一些该软件包的依赖关系,很方便地就可以找到它上层的依赖包,例如libosmesa6,正是这个包中包含我需要的libosmesa.so.8这个动态库,于是我手动的将原来的符号链接链接到这个库,完美解决~

这里记录一下.deb的正确食用方法:

  1. 解压.deb文件

    ar x libosmesa6-dev_23.2.1-1ubuntu3.1~22.04.2_amd64.deb

    会得到以下三个文件:

    • control.tar.zst:包含安装脚本和元数据,例如依赖关系等
    • data.tar.zst:包含实际安装文件
    • debian-binary:Debian包格式版本信息
  2. 解压 data.tar.zst

    mkdir -p /home/username/custom_dir
    tar -xf data.tar.zst -C /home/username/custom_dir
  3. 处理依赖

    tar -xf control.tar.zst
    cat control

    输出的 Depends 字段会列出依赖的包,需要手动下载并按照相同方法解压它们。

以上就是这几天配环境的时候获得的一些心得,先记录到这里吧。


文章作者: 叁月柒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叁月柒 !
评论
  目录