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次下载
91KB
2.5K SLoC
RUA
RUA 是一个用于 ArchLinux AUR 的构建工具。其特点
- 允许本地补丁应用
- 提供详细信息
- 在包升级时显示上游更改
- 通过
shellcheck
在PKGBUILD
中查看代码问题,并注意特殊变量 - 如果已构建的包中存在 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
环境变量将覆盖 ~/.config
,XDG_CACHE_HOME
将覆盖 ~/.cache
,而 XDG_DATA_HOME
将覆盖 ~/.local/share
。
工作原理 / 审查
了解底层机制不是使用 RUA 的必要条件,但如果您仍然好奇,本节是为您准备的。
所有 AUR 软件包都存储在指定的 git
仓库中,其中 upstream/master
指向远程 AUR 标头,而本地 master
则表示您审查和接受的状态。本地分支不跟踪远程分支。
RUA 通过在需要时获取远程更新,向您展示远程更改并在您接受它们时合并它们来工作。合并和基本 diff 视图是 RUA 内置的命令,如果您想的话,还可以切换到 shell 并使用 git CLI 做更多操作。
工作原理 / 依赖分组和安装
RUA 将
- 获取 AUR 软件包及其所有递归依赖。
- 准备所有需要安装的 pacman 和 AUR 软件包的摘要。向用户展示摘要,确认继续。
- 迭代所有 AUR 依赖,并要求审查仓库。一旦我们知道用户确实接受了所有递归更改,就继续。
- 建议安装所有 pacman 依赖。
- 构建所有最大依赖“深度”的 AUR 软件包。
- 让用户审查构建后的工件(批量)。
- 安装它们。如果有更多软件包留待安装,则向上回溯两步。
如果您有一个像这样的依赖结构
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
,默认情况下不共享 user
、ipc
、pid
、uts
、cgroup
。如果从 CLI 请求,则可以以离线模式运行构建。
其他
RUA 名称是 "AUR" 的反转。
本工作得益于优秀的库,包括raur、srcinfo以及许多其他库。
项目遵循GPLv3+协议共享。除非您明确说明,否则您有意提交以包含在此项目(rua)中的任何贡献,都应按GPLv3+许可,不附加任何额外条款或条件。
作者信息请参阅Cargo.toml和git历史记录。
依赖关系
~17–35MB
~504K SLoC