创建一个干净的 chroot - Arch Linux 中文维基

跳转到内容

# 创建一个干净的 chroot

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 Building in a clean chroot，最近一次同步于 2025-03-06，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

本文或本节需要翻译。要贡献翻译，请访问简体中文翻译团队。

附注： #处理大规模重构 需要翻译（在 Talk:创建一个干净的 chroot# 中讨论）

## 使用 clean chroot 的意义

clean chroot 可以直译为 干净/洁净的 chroot。在 clean chroot 环境中构建可以避免软件包依赖缺失问题。不然可能会出现意外的动态链接或是在 PKGBUILD 依赖数组 `depends` 中出现未声明的依赖。此外，它还允许用户参与 core-testing 或 extra-testing 测试仓库情况下，为稳定仓库 (core、extra) 构建软件包。

## 便捷方式

为了快速在 clean chroot 环境中构建软件包而无需复杂配置，你可以使用 devtools包 中的辅助脚本来帮助你。

这些辅助脚本应在 PKGBUILD 的同一目录中调用，就像使用 makepkg 时一样。例如，`extra-x86_64-build` 将会自动从 `/var/lib/archbuild` 的 clean chroot 模板中创建 chroot 环境，更新它，并为 extra 仓库构建软件包。对于 multilib 构建则使用无架构参数的 `multilib-build`。请参考下表了解不同目标仓库和架构对应的构建脚本。

`-c`参数用于重置chroot模板，这在环境损坏时非常有用。在建立全新的 clean chroot 时不需要此参数。

注意：

- core 仓库被省略，因为这些软件包必须先通过 core-testing 仓库测试才能进入正式仓库
- 如果目标是为本地使用构建 core 仓库的软件包，建议直接使用稳定仓库而非测试仓库。此时可以直接使用`extra`构建脚本

目标仓库 | 架构 | 构建脚本 | 使用的 Pacman 配置文件
--- | --- | --- | ---
extra | x86_64 | extra-x86_64-build | /usr/share/devtools/pacman.conf.d/extra.conf
core-testing / extra-testing | x86_64 | extra-testing-x86_64-build | /usr/share/devtools/pacman.conf.d/extra-testing.conf
core-staging / extra-staging | x86_64 | extra-staging-x86_64-build | /usr/share/devtools/pacman.conf.d/extra-staging.conf
multilib | x86_64 | multilib-build | /usr/share/devtools/pacman.conf.d/multilib.conf
multilib-testing | x86_64 | multilib-testing-build | /usr/share/devtools/pacman.conf.d/multilib-testing.conf
multilib-staging | x86_64 | multilib-staging-build | /usr/share/devtools/pacman.conf.d/multilib-staging.conf

提示：pkgctl-build(1)会自动选择正确的构建脚本在 clean chroot 中构建

## 传统方法

### 设置 chroot 环境

devtools包 提供了用于创建 clean chroot 并在其中构建软件包的功能，请确保您已安装该软件包。

之后，为创建 clean chroot，请创建一个新文件夹用于存放 chroot，比如 `$HOME/chroot/`：

    $ mkdir ~/chroot

之后定义 `CHROOT` 变量:

    $ CHROOT=$HOME/chroot

现在就可以开始创建 clean chroot 环境了：

注意：chroot 需要 `root` 文件夹的访问权限，因为 `$CHROOT` 目录需要复制其中的必要文件来创建一个干净的工作环境

    $ mkarchroot $CHROOT/root base-devel

注意：

- 若您经常使用 clean chroot 构建软件包，在 `$HOME/.bashrc` 里添加 export 命令以引入 `CHROOT` 变量是一个不错的选择

- 在 btrfs 文件系统中，chroot 会以分卷（subvolume）的形式被创建，因此您必须以 root 用户的身份运行 `btrfs subvolume delete $CHROOT/root` 才能删除这个分卷。

所有相关信息，比如打包者名称、makeflags 等都在 `~/.makepkg.conf` 中，毋庸置疑，您需要编辑 `~/.makepkg.conf` 以确保其被正常构建。别忘了修改 `$CHROOT/root/etc/pacman.d/mirrorlist` 以更换镜像源。

如果需要，您也可以在 `$CHROOT/root/etc/pacman.conf` 中启用 testing 软件仓库以在 chroot 中获取测试版本的软件包。

注意：`~` 和 `$HOME` 变量在"makechrootpkg"构建脚本中会被自动定义为 `/root/`

#### 自定义 pacman.conf

或者，提供一个自定义的 `pacman.conf` 和`makepkg.conf`，其中包含以下内容：

    $ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel

警告：在首次创建 clean chroot 时使用自定义的 `pacman.conf` 或 `makepkg.conf` 可能会导致对 chroot 环境进行预期外的自定义调整。请谨慎使用。

### 在 chroot 里构建

首先，请确保 base chroot (`$CHROOT/root`) 是最新的：

    $ arch-nspawn $CHROOT/root pacman -Syu

其次，在包含其 PKGBUILD 的目录中调用 `makechrootpkg` 来构建软件包：

    $ makechrootpkg -c -r $CHROOT

注意：传递 `-c` 参数给 `makechrootpkg` 可确保在构建前清理工作 chroot (`$CHROOT/$USER`)。

#### 预装必要依赖包

要在 `$CHROOT/root/pacman.conf` 中启用的仓库无法提供所需依赖的情况下构建软件包，请使用 `-I package` 预先将它们安装到工作 chroot 中：

    $ makechrootpkg -c -r $CHROOT -I build-dependency-1.0-1-x86_64.pkg.tar.xz -I required-package-2.0-2-x86_64.pkg.tar.xz

#### 向 makepkg 传递参数

要向 makepkg 传递参数，请在 end-of-options marker (选项结束符) 之后列出它们；例如，若要强制执行 `check()`：

    $ makechrootpkg -c -r $CHROOT -- --check

## 处理大规模重构

处理大型重构最简洁的方法是使用 staging 仓库。先针对 extra 构建第一个软件包并推送到 staging 仓库。然后将后续所有软件包都基于 staging 重新构建，并一同推送到那里。

如果无法使用 staging 仓库，也可以通过如下命令，使用自定义软件包进行构建：

    # extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.xz

You can specify more than one package to be installed using multiple `-I` arguments.

A simpler, but dirtier way to handle a major rebuild is to install all built packages in the chroot, never cleaning it. Build the first package using:

    # extra-x86_64-build

And build all following packages using:

    # makechrootpkg -n -r /var/lib/archbuild/extra-x86_64

Running namcap (the `-n` argument) implies installing the package in the chroot. *-build also does this by default.

## 小提示和小技巧

### 在tmpfs中构建

若系统拥有足够内存，可为 devtools包 构建脚本指定 tmpfs 文件系统。

    # mount --mkdir -t tmpfs -o defaults,size=20G tmpfs /mnt/chroots/arch
    # extra-x86_64-build -c -r /mnt/chroots/arch

分类：​

- 包开发
- Arch 打包准则
- Arch 开发

隐藏分类：​

- 使用“模板:Translateme”标记的页面或章节

创建一个干净的 chroot
添加话题