創建一個乾淨的 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