创建一个干净的 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 |
devtools包 提供了用于创建 clean chroot 并在其中构建软件包的功能,请确保您已安装该软件包。
之后,为创建 clean chroot,请创建一个新文件夹用于存放 chroot,比如 $HOME/chroot/:
$ mkdir ~/chroot
之后定义 CHROOT 变量:
$ CHROOT=$HOME/chroot
现在就可以开始创建 clean 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 和 makepkg.conf,其中包含以下内容:
$ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
pacman.conf 或 makepkg.conf 可能会导致对 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 传递参数,请在 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.
若系统拥有足够内存,可为 devtools包 构建脚本指定 tmpfs 文件系统。
# mount --mkdir -t tmpfs -o defaults,size=20G tmpfs /mnt/chroots/arch # extra-x86_64-build -c -r /mnt/chroots/arch