#arch-linux #build-tool #build #aur #jail #bubblewrap #build-script

构建 rua

为 Arch Linux 提供安全的隔离 AUR 辅助工具

120 个版本

0.19.10 2024年1月2日
0.19.9 2023年10月4日
0.19.7 2023年7月10日
0.19.5 2023年3月28日
0.9.11 2018年11月28日

#59 in 构建工具

每月45次下载

GPL-3.0-or-later

91KB
2.5K SLoC

RUA Rust ShellCheck crates.io

RUA 是一个用于 ArchLinux AUR 的构建工具。其特点

  • 允许本地补丁应用
  • 提供详细信息
    • 在包升级时显示上游更改
    • 通过 shellcheckPKGBUILD 中查看代码问题,并注意特殊变量
    • 如果已构建的包中存在 SUID 文件,则发出警告并显示它们
    • 显示已构建包中的文件列表、可执行文件列表和 INSTALL 脚本
  • 最小化用户干扰
    • 一次性验证所有构建脚本,无中断构建
    • 将构建的包分组以批量审查
  • 使用安全命名空间隔离
    • 支持 --offline 构建
    • 在隔离的文件系统中构建,请参阅下面的 安全 部分
    • 使用 seccomp 限制可用的系统调用(例如,构建不能调用 ptrace
    • 构建不能执行 sudo(文件系统以 nosuid 挂载)
  • 用 Rust 编写

使用

rua search wesnoth

rua info freecad

rua install pinta # 安装或升级包

rua upgrade # 升级所有 AUR 包。您可以使用 --ignore 选择性忽略包或将它们添加到 pacman.conf 中的 IgnorePkg(与非 AUR 包和 pacman 相同)。您可以使用 rua install A B C 仅升级特定包。

rua shellcheck 路径//我的/PKGBUILD # 在 PKGBUILD 上运行 shellcheck,发现构建指令中的潜在问题。注意 PKGBUILD 特定的变量。

rua tarcheck xcalib.pkg.tar # 如果你已经构建了 *.pkg.tar 包,运行 RUA 检查(SUID、可执行列表、INSTALL 脚本审查等)。

rua builddir --offline /路径//pkgbuild/目录 # 构建目录。

rua --help; rua 子命令 --help # 显示 CLI 帮助

安装依赖

sudo pacman -S --needed --asdeps git base-devel bubblewrap-suid libseccomp xz shellcheck cargo

安装(AUR 方式)

sudo pacman -S base-devel git
git clone https://aur.archlinux.org/rua.git
cd rua
makepkg -si

在网页界面中,软件包位于 rua

安装(Rust 方式)

RUSTUP_TOOLCHAIN=stable cargo install --force rua

这不会包括 bash/zsh/fish 完成脚本,但其他所有内容都应正常工作。

工作原理 / 目录

目录 含义
~/.config/rua/pkg/ 步骤 1,AUR 软件包克隆到的目录。在这里您可以进行审查和本地修改
~/.cache/rua/build/ 步骤 2,审查后的软件包被复制到这里,然后进行构建
~/.local/share/rua/checked_tars/ 步骤 3,构建和 tarcheck 的软件包存储的目录(*.pkg.tar.xz)
~/.config/rua/wrap_args.d/ 安全包装脚本基本配置的入口点
~/.config/rua/.system/ 内部文件
$GNUPGHOME/pubring.kbx
$GNUPGHOME/pubring.gpg
构建时授予对这些两个文件的只读访问权限,以允许签名验证
所有其他文件 ~ 中所有其他文件都不被 RUA 访问,也不被构建的软件包访问(请参阅以下安全部分)

注意,上述目录遵循 XDG 规范,因此 XDG_CONFIG_HOME 环境变量将覆盖 ~/.configXDG_CACHE_HOME 将覆盖 ~/.cache,而 XDG_DATA_HOME 将覆盖 ~/.local/share

工作原理 / 审查

了解底层机制不是使用 RUA 的必要条件,但如果您仍然好奇,本节是为您准备的。

所有 AUR 软件包都存储在指定的 git 仓库中,其中 upstream/master 指向远程 AUR 标头,而本地 master 则表示您审查和接受的状态。本地分支不跟踪远程分支。

RUA 通过在需要时获取远程更新,向您展示远程更改并在您接受它们时合并它们来工作。合并和基本 diff 视图是 RUA 内置的命令,如果您想的话,还可以切换到 shell 并使用 git CLI 做更多操作。

工作原理 / 依赖分组和安装

RUA 将

  1. 获取 AUR 软件包及其所有递归依赖。
  2. 准备所有需要安装的 pacman 和 AUR 软件包的摘要。向用户展示摘要,确认继续。
  3. 迭代所有 AUR 依赖,并要求审查仓库。一旦我们知道用户确实接受了所有递归更改,就继续。
  4. 建议安装所有 pacman 依赖。
  5. 构建所有最大依赖“深度”的 AUR 软件包。
  6. 让用户审查构建后的工件(批量)。
  7. 安装它们。如果有更多软件包留待安装,则向上回溯两步。

如果您有一个像这样的依赖结构

your_original_package
├── dependency_a
│   ├── a1
│   └── a2
└── dependency_b
    ├── b1
    └── b2

因此,RUA 会中断你 3 次,而不是像递归一样直接中断 7 次。如果它知道递归破坏了行(具有不可满足的依赖关系),它也不会打扰你。

限制

  • 此工具仅关注 AUR 软件包,您不能使用它来 -Suy 系统。请使用 pacman 进行此操作。
  • 可选依赖(optdepends)未安装。它们被跳过。请手动检查它们,当您审查 PKGBUILD 时。
  • 此工具不处理版本。它将始终安装可能的最新版本,并始终假设最新版本足够。
  • 开发包,如 "-git" 软件包,仅在运行 rua upgrade --devel 时重新构建。不进行版本检查以避免不必要的重新构建。欢迎合并请求。
  • 除非您明确启用它,否则构建不会共享用户主目录 (~)。这可能导致 maven/npm/cargo/等依赖项在每次构建时重新下载。有关如何将某些目录列入白名单的说明,请参阅下文的安全部分。
  • makepkg.conf 中的环境变量 "PKGDEST" 和 "BUILDDIR" 不受支持。软件包将在相互隔离的情况下构建,工件存储在此工具的标准位置。
  • 由于安全限制,构建期间可能无法正常使用 X11 访问
  • 此外,由于安全限制,构建期间 ccache 使用将失败
  • 由于 fakeroot 中的错误,在 PKGBUILD-s package() 中创建由 root 拥有的软件包不起作用。这发生在 package() 函数中提取存档时。在 prepare() 中执行或在 tar --no-same-owner 中提供密钥是解决方案。

安全

不要安装您不信任的 AUR 软件包。RUA 只添加构建时隔离和安装时控制/审查。

构建软件包时,RUA 使用以下文件系统隔离

  • 构建目录是可读写的。
  • 文件 "$GNUPGHOME"/pubring.kbx"$GNUPGHOME"/pubring.gpg 是只读的(如果存在)。这允许签名验证工作。
  • 其余的 ~ 对构建过程不可见,在 tmpfs 下挂载。
  • /tmp/dev/proc 分别重新挂载为空的 tmpfs、devtmpfs 和 procfs。
  • 其余的 / 是只读的。
  • 您可以通过配置 "wrap_args" 来白名单/添加您的挂载点。请参阅 ~/.config/rua/.system/wrap_args.sh.example 中的示例。

此外,所有构建都在命名空间监狱中运行,启用 seccomp,默认情况下不共享 useripcpidutscgroup。如果从 CLI 请求,则可以以离线模式运行构建。

其他

RUA 名称是 "AUR" 的反转。

本工作得益于优秀的库,包括raursrcinfo以及许多其他库。

项目遵循GPLv3+协议共享。除非您明确说明,否则您有意提交以包含在此项目(rua)中的任何贡献,都应按GPLv3+许可,不附加任何额外条款或条件。

作者信息请参阅Cargo.toml和git历史记录。

依赖关系

~17–35MB
~504K SLoC