AUR 儲存庫提供 PKGBUILD:它是可執行的封裝中繼資料,不是二進位套件或相依性解析器。因此,安全建置套件需要區分使建置得以進行的相依性,以及安裝到最終系統上的相依性。
PKGBUILD 中的相依性類別
#
PKGBUILD(5) 定義具有不同生命週期的相依性陣列:
depends宣告執行已安裝套件所需的套件。makedepends宣告只有建置期間需要的工具與函式庫。checkdepends宣告check()所需的套件。
版本限制使用 pacman 的相依性語法,例如 depends=('libfoo>=2')。分割套件可以有套件專屬的相依性陣列,例如 package_client() { depends=('libclient') }。
不要僅因為套件沒有它也能建置,就將執行階段函式庫移入 makedepends。相反地,當沒有已安裝檔案需要編譯器時,也不要將編譯器保留在 depends 中。準確的陣列能讓 pacman 正確規劃升級與移除。
makepkg 建置;pacman 安裝
#
請以非特權使用者執行 makepkg。它會下載並驗證原始碼、檢查相依性、執行 prepare()、build()、check() 與 package(),並建立供 pacman 使用的封存檔。makepkg -i 只有在建置成功後才會安裝該封存檔;安裝工作由 pacman 執行。
git clone https://aur.archlinux.org/example.git
cd example
makepkg --cleanbuild --syncdeps
sudo pacman -U ./*.pkg.tar.zst--syncdeps 要求 pacman 安裝缺少的相依性。因此它只會解析已在設定的二進位儲存庫中可用的套件。它無法取得 AUR 相依性,因為 AUR 發佈的是建置配方,而不是儲存庫套件。
避免使用 --nodeps,也絕不要以 sudo 執行 makepkg;繞過相依性檢查可能產生連結錯誤的套件,而 root 會以不必要的權限執行未檢閱的 PKGBUILD shell 程式碼。
建置 AUR 相依性鏈 #
依相依性順序解析 AUR 相依性。執行每個配方前都要檢查,先建置葉節點,並安裝產生的封存檔,讓下一個套件的相依性測試成功。
# Build and install the AUR dependency first.
git clone https://aur.archlinux.org/example-library.git
cd example-library
makepkg --cleanbuild --syncdeps
sudo pacman -U ./*.pkg.tar.zst
# Then build the dependent package.
cd ../example
makepkg --cleanbuild --syncdepsAUR 輔助工具可以自動處理圖形走訪,但不能取代檢閱:每個 PKGBUILD、.SRCINFO、來源 URL、修補程式與安裝腳本,仍然都是受信任的建置輸入。在建置前,請檢查完整鏈中的版本限制。
使用乾淨 chroot 以確保可重現性 #
主機上安裝的套件可能掩蓋缺少的宣告。乾淨 chroot 從已定義的 Arch 基礎開始,讓缺少的 makedepends 與 checkdepends 顯現出來。在設定 devtools 後,從套件目錄執行:
extra-x86_64-build將必要的 AUR 套件建置到本機儲存庫,或在建置相依套件前將其已驗證的封存檔安裝到 chroot。測試相依性鏈時,請刻意重建或更新 chroot,並保留建置記錄與套件封存檔供調查。成功的乾淨 chroot 建置證明已宣告建置輸入,但不能證明配方或其上游來源安全。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)