跳转到内容

创建一个干净的 chroot

来自 Arch Linux 中文维基

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

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

使用 clean chroot 的意义

[编辑 | 编辑源代码]

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


便捷方式

[编辑 | 编辑源代码]

为了快速在 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.confmakepkg.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