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

你可以通過多次使用 `-I` 參數來指定安裝多個軟體包。

處理大規模重構 (Major Rebuild) 有一種更簡單但也相對「不夠乾淨 (dirtier)」的方法：將所有已構建的軟體包直接安裝到 chroot 環境中，且全程不對其進行清理。使用以下命令構建第一個軟體包：

    # extra-x86_64-build

使用以下命令構建後續的所有軟體包：

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

運行 namcap (即`-n`參數) 意味著會將軟體包安裝到 chroot 中。`*-build`腳本默認也會執行此操作。

## 小提示和小技巧

### 在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
新增話題