Freebsd

使用 pkg_add 處理 FreeBSD 軟體包升級

  • February 5, 2016

我正在嘗試使用 FreeBSD 的pkg_add命令在 build-once-install-on-multiple-machines 場景中安裝和升級二進制包。安裝新軟體包時效果很好,但升級讓我感到困惑。例如,如果我想升級另一個包所依賴的包,我不能只安裝它:

# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed

此時,如果我傳遞-fpkg_delete命令,我可以刪除舊版本的包:

# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0

但是……這就是殺手……現在依賴資訊消失了!我可以安裝升級:

# pkg_add /path/to/somepackage-2.0.tbz

現在嘗試刪除它將成功而不會出現任何錯誤:

# pkg_delete somepackage-2.0

我該如何優雅地處理這個問題(其中“優雅地”意味著“以一種保留依賴資訊而不需要我重建/重新安裝和整個依賴鏈的方式”)。

謝謝!

正如您所發現的,pkg_add無法優雅地升級埠。然而,這個portupgrade包做得很好,並且是我使用和推薦的方法(如果你不喜歡這種方法,還有其他可用的方法)。

安裝埠後,您可以簡單地執行portupgrade -aPP,它將使用軟體包升級系統上安裝的所有埠。如果您不想更新任何埠,則可以執行portupgrade -RPP [category/port]以升級特定埠及其所依賴的埠。執行不帶參數的程序將升級屬於目前目錄的埠(cd /usr/ports/security/openssl ; portupgrade即將升級openssl,沒有-PP選項它將從源建構埠);如果您不在埠目錄中,它將顯示幫助(與-h選項相同)。

編輯:

預設情況下,如果包存在於PKG_PATH環境變數定義的目錄中,portupgrade 將安裝包(預設為$PACKAGES/All$PACKAGES預設為$PORTSDIR/packages;因此預設路徑為/usr/ports/packages/All)。

如果它們在那裡不存在,它將(根據偏好)從$PKG_SITES(獲取帶有子文件夾的 URILatest並且All沒有預設值)或$PACKAGEROOT(獲取帶有正常鏡像路徑的 URI;預設為"ftp://ftp.freebsd.org")下載包。

一種簡單的方法是使用一台機器建構/記憶體將安裝在另一台機器上的包。

  • make package您可以在埠目錄(也將安裝埠)中從埠樹建構包。
  • 您可以使用portupgrade升級一台機器並記憶體封包件以在其他機器上使用,上述命令會將封包件記憶體在預設目錄中(見上文)。
  • 您可以使用 portupgrade 僅獲取軟體包,而不是使用portupgrade -aPPF或安裝它們portupgrade -RPPF [category/port]

一旦你有了記憶體的封包件,你就可以通過 NFS、FTP、HTTP 等共享目錄;只要文件可以從其他機器訪問。使用適當的值設置PACKAGESorPKG_SITE以指向記憶體伺服器。執行典型的portupgrade命令,它應該從記憶體伺服器中提取包並安裝它們。

注意:埠樹必須在所有伺服器上都是最新的portupgrade才能正確執行(它將嘗試更新到本地埠樹中的任何版本)。如果您要在所有電腦上安裝相同的埠/軟體包,共享一個伺服器/usr/ports目錄(例如通過 NFS)並將其安裝在所有其他伺服器上可能是最簡單的。

引用自:https://serverfault.com/questions/214611